PHP %00截断原理

这里有篇不错的文章


从源码级别了解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。

文章目录
  1. 1. 漏洞原理
  2. 2. 漏洞代码示例
  3. 3. 长度问题
,