PHP 5.3.3 是明确支持 %00 截断的关键版本(5.3.4 起修复),需同时满足版本≤5.3.3且 magic_quotes_gpc=Off,并在服务端路径拼接中存在未过滤\x00的用户输入,方可触发截断漏洞。

PHP 5.3.3 是明确支持 %00 截断的关键版本(5.3.4 起已修复),只要满足配套条件,就极可能触发 00 截断漏洞。检测时不能只看 PHP 版本,必须验证整个执行链是否具备截断能力。
确认 PHP 版本与 magic_quotes_gpc 状态
这是两个硬性前提,缺一不可:
- 在目标服务器上执行
phpinfo()或运行php -v,确认版本为 5.3.3 或更低(如 5.2.17、5.3.0) - 检查
magic_quotes_gpc是否为 Off:在phpinfo()页面搜索该参数,或读取php.ini文件确认magic_quotes_gpc = Off - 修改配置后务必重启 Web 服务(如 Apache/Nginx + PHP-FPM),否则设置不生效
识别服务端拼接逻辑是否存在截断点
00 截断不是自动生效的,它依赖服务端代码中存在“用户可控路径 + 字符串拼接 + 未过滤 \x00”的组合。重点关注以下特征:
- 上传路径由
$_POST或$_GET参数(如save_path、dir)传入,并直接参与文件保存路径构造 - 代码类似:
$img_path = $_POST['save_path'] . '/' . $rand_name . '.' . $ext;—— 这类拼接未对输入做 \x00 清理,是典型风险点 - 使用了
move_uploaded_file()、file_put_contents()等底层 C 实现函数,它们会受 \x00 影响而提前终止解析
实际抓包验证截断是否生效
仅靠代码审计不够,必须通过请求实测确认截断行为是否被触发:
立即学习“PHP免费学习笔记(深入)”;
- 上传一个白名单文件(如
test.jpg),用 Burp Suite 抓包 - 定位到含路径的参数(如
save_path=upload),将其改为save_path=upload/test.php%00 - 确保 Burp 中对该
%00执行 URL Decode(POST 请求中 %00 不会自动解码,需手动处理) - 转发请求后,检查响应或服务器文件系统:若生成的文件名为
test.php(而非test.php.jpg或随机名),说明截断成功 - 再尝试访问
/upload/test.php,若 PHP 代码被解析执行(如输出phpinfo()),即确认漏洞可利用
排除常见干扰因素
很多看似符合版本条件却无法截断,往往是因环境或代码细节阻断了路径:
- 现代 WAF 或云防护(如 Cloudflare、阿里云 WAF)会主动拦截含
%00的请求,需绕过或关闭防护测试 - 部分框架或自定义函数(如
basename()、pathinfo())会在拼接前剥离 \x00,导致截断失效 - 若上传后文件名被强制重命名为随机字符串(如
123456789.jpg),且未将原始名用于路径拼接,则截断无意义 - PHP 运行在 CGI 模式下时,某些 SAPI 层可能提前过滤 \x00,需结合具体部署方式判断



















