这里有篇不错的文章
从源码级别了解PHP %00截断原理
漏洞原理
PHP的00截断是5.2.x版本的一个漏洞,当用户输入的url参数包含%00经过浏览器自动转码后截断后面字符。
漏洞代码示例
例如url输入的文件名1.txt%00.jpg经过url转码后会变为1.txt\000.jpg,测试文件1.php如下1
2
3<?php
include "1.txt\000.jpg";
?>
测试文件1.txt如下1
2
3<?php
echo 'fireXXX';
?>
php5.2.x版本解析1.php时,会将1.txt\000.jpg解释为1.txt
长度问题
旦出现%00截断,include的文件名经过url转码由”1.txt%00.jpg”变为”1.txt\000.jpg”,进入php语法词法分析器解析后会将这个字符串解析成一个字符串,并使用zend_scan_escape_string进行字符串转码
中间的\\000还被解析为4个字符,转码中会将他当作八进制数据转成一个字符\0,因此最终1.txt\000.jpg长度是10。