一:漏洞简介
PHP的00截断是5.2.x版本的一个漏洞,当用户输入的url参数包含%00经过浏览器自动转码后截断后面字符。
二:漏洞示例代码
例如url输入的文件名1.txt%00.jpg经过url转码后会变为1.txt\000.jpg,测试文件1.php如下
<?php
include "1.txt\000.jpg";
?>
测试文件1.txt如下
<?php
echo 'fireXXX';
?>
php5.2.x版本解析1.php时,会将1.txt\000.jpg解释为1.txt
三:漏洞源码分析
php5.2.17代码分析:
调用php去解析1.php文件。
主要的执行流程在Zend/zend.c的zend_execute_scripts函数中。该函数首先通过zend_compile_file获取1.php文件的内容,然后调用zend_execute解析读取到的文件内容。
zend_compile_file函数首先调用open_file_for_scanning去读取文件,然后通过zendparse去进行语法和词法解析,而zendparse是通过lex_scan去扫描出token并进行语法分析。可以通过调试器观察到include的文件名参数经过lex_scan后的数据: