BUUCTF Web题复盘:从‘Secret File’看文件包含漏洞的三种实战利用姿势(附PHP伪协议详解)
BUUCTF Web题深度解析:文件包含漏洞的实战利用与PHP伪协议精讲
在CTF竞赛和实际渗透测试中,文件包含漏洞(File Inclusion Vulnerability)是最常见且危害严重的Web安全漏洞之一。本文将以BUUCTF中的"Secret File"题目为切入点,系统剖析文件包含漏洞的三种典型利用方式,并深入讲解PHP伪协议的高级应用技巧。不同于基础教程,我们将重点探讨如何在实际场景中灵活组合这些技术,构建有效的攻击链。
1. 文件包含漏洞基础与分类
文件包含漏洞主要分为本地文件包含(LFI)和远程文件包含(RFI)两种类型。当Web应用程序动态包含文件时,如果未对用户输入进行严格过滤,攻击者就可能通过构造特殊路径读取或执行任意文件。
典型危险函数包括:
include()include_once()require()require_once()fopen()file_get_contents()
在"Secret File"题目中,我们看到的漏洞代码如下:
<?php highlight_file(__FILE__); error_reporting(0); $file=$_GET['file']; if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){ echo "Hacker!"; } else{ include($file); } ?>这段代码虽然过滤了../、tp、input和data等关键词,但防御并不完善,为后续利用留下了空间。
2. 文件包含的三种实战利用姿势
2.1 直接文件包含读取敏感信息
最基本的利用方式是直接包含目标文件。在CTF中,常见的敏感文件包括:
/etc/passwd(Linux系统用户信息)/proc/self/environ(环境变量)- Web应用配置文件(如config.php)
- 题目指定的flag文件(如flag.php)
绕过技巧:
- 使用绝对路径替代相对路径
- 编码绕过过滤(如URL编码、双重编码)
- 空字节截断(PHP<5.3.4有效)
例如,在"Secret File"中,虽然过滤了../,但我们可以尝试:
/secr3t.php?file=/var/www/html/flag.php2.2 日志注入实现代码执行
当直接文件包含受限时,日志文件注入是强大的替代方案。Web服务器日志(如access.log)记录了所有请求信息,如果能够包含这些日志文件,并在User-Agent或请求路径中注入PHP代码,就可能实现代码执行。
典型利用步骤:
- 确认日志文件路径(常见于/var/log/apache2/access.log)
- 通过请求注入PHP代码
- 包含日志文件执行代码
curl -A "<?php system('id'); ?>" http://target.com/然后包含日志文件:
/secr3t.php?file=/var/log/apache2/access.log2.3 PHP伪协议的高级应用
PHP内置了多种伪协议(Wrapper),为文件包含提供了更多可能性。在"Secret File"题目中,我们主要利用了php://filter协议。
常用PHP伪协议:
| 协议 | 用途 | 示例 |
|---|---|---|
| php://filter | 对数据流进行过滤处理 | php://filter/read=convert.base64-encode/resource=flag.php |
| php://input | 访问请求的原始数据 | 需要allow_url_include=On |
| data:// | 直接包含数据流 | data://text/plain, |
| zip:// | 包含zip压缩包中的文件 | zip://archive.zip#file.txt |
3. PHP Filter链的构造与编码技巧
php://filter的强大之处在于可以构造复杂的filter链,通过多重编码转换实现各种目的。在"Secret File"中,我们使用了base64编码,但这只是冰山一角。
3.1 常见编码方式对比
| 编码类型 | 过滤器名称 | 特点 | 适用场景 |
|---|---|---|---|
| Base64 | convert.base64-encode | 可逆编码,字符范围受限 | 读取PHP文件源码 |
| ROT13 | string.rot13 | 简单字母替换 | 绕过简单过滤 |
| 字符串处理 | string.toupper/string.tolower | 大小写转换 | 配合其他过滤器使用 |
| 压缩/解压 | zlib.deflate/zlib.inflate | 压缩数据 | 减少数据量或绕过检测 |
3.2 复杂Filter链构造
通过组合多个过滤器,可以实现更复杂的操作。例如:
php://filter/read=string.toupper|string.rot13|convert.base64-encode/resource=flag.php这条filter链会依次执行:
- 将文件内容转为大写
- 应用ROT13转换
- 进行Base64编码
实用技巧:
- 使用
|符号连接多个过滤器 - 注意过滤器执行顺序(从左到右)
- 可以组合编码与压缩过滤器
3.3 编码绕过的实战案例
假设目标系统过滤了"flag"关键词,我们可以尝试:
/secr3t.php?file=php://filter/read=convert.base64-encode/resource=fl%61g.php这里使用了URL编码绕过过滤。更进一步,可以结合多重编码:
/secr3t.php?file=php://filter/read=convert.iconv.UTF-8.UTF-16|convert.base64-encode/resource=flag.php4. 防御策略与漏洞修复
了解攻击手段是为了更好地防御。针对文件包含漏洞,推荐以下防护措施:
1. 输入验证与白名单
$allowed = ['header.php', 'footer.php']; if(in_array($file, $allowed)) { include($file); } else { die('Invalid file requested'); }2. 路径限制
- 禁用绝对路径包含
- 设置包含目录限制
ini_set('open_basedir', '/var/www/includes');3. 服务器配置
- 关闭危险PHP设置
allow_url_fopen = Off allow_url_include = Off4. 代码审计
- 定期检查所有文件操作函数
- 特别注意动态包含的用户输入
在CTF竞赛中,文件包含漏洞往往不是独立存在的,它可能与其他漏洞(如目录穿越、文件上传、SSRF等)形成组合攻击。真正的高手不仅掌握各种技术点,更懂得如何将它们有机组合,构建完整的攻击链。
