欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

深度聊聊PHP下的“截断”问题

来源: 作者: 时间:2019-02-24 21:00 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

0×01 起因
学弟有天在群里说起上传的%00截断的一些问题,就想起之前自己在这个问题踩过坑,想起了自己曾经的flag说要写文章,一直没写,现在来填坑了。
0×02 经过
源码理解:
//test.php    include"1.txt\000.jpg";?>//1.txt
    echo'helloworld';
?>
上面的示例代码在 php版本小于5.3.4 的情况下回输出 helloworld 。从php的内核执行过程来看,PHP通过 php_execute_script 来执行PHP的脚本,这里选取部分有关代码,具体可以看这里:

在 第10行我们看到,他调用zend_execute_scripts来针对脚本进行解析,而这个函数是在Zend/zend.c里面,截取部分相关代码如下:

从PHP内核开来实际上是分为两块部分,一个是compile编译过程 ,另一个是execute执行过程。
第一部分:compile编译过程
我们可以看到这里的代码逻辑通过zend_compile_file获取文件的内容,zend_compile_file是一个函数指针,其声明在/Zend/zend_compile.c中
  ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC); 
在引擎初始化的时候,会将compile_file函数的地址赋值给zend_compile_file 。

compile_file函数定义在/Zend/zend_language_scanner.l,截取部分相关代码。
简单总结一下上面部分代码的逻辑:
zend_compile_file函数首先调用open_file_for_scanning去读取文件,然后通过第17行的zendparse去进行语法和词法解析。而zendparse是通过lex_scan去扫描出token并进行语法分析。
第二部分:execute执行过程
zend_execute也是一个函数指针,其声明在/Zend/zend_execute.h中。
ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);
在引擎初始化的时候,会将execute函数的地址赋值给zend_execute 。

而execute的定义在/Zend/zend_vm_execute.h

根据我们的了解,zend_execute通过ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER函数来进行include的实际处理,即包含要包含的文件。

对比修复代码找到漏洞触发点:

摘出部分修复代码:

我看下存在漏洞的调试运行结果:

修复代码的Z_STRVAL_P(inc_filename) 即上图中的val,即”1.txt”,strlen取得长度为5,而Z_STRLEN_P(inc_filename) 即上图中的len即10。这里实际上解析到的文件名是1.txt。
不存在漏洞的调试运行结果:
一旦出现%00截断,include的文件名经过url转码由”1.txt%00.jpg”变为”1.txt\000.jpg”,进入php语法词法分析器解析后会将这个字符串解析成一个字符串,并使用zend_scan_escape_string进行字符串转码,如图,进入zend_scan_escape_string的内容为:

只要比较发现文件名的strlen长度和语法分析出来的长度不一样,就说明内部存在截断的字符,因此输出了打开文件失败的信息。
利用方式
划重点PHP版本低于5.3.4
%00截断有这么2种利用状况
1.在url中加入%00,如http://xxxx/shell.php%00.jpg
2.在burpsuite的16进制编辑工具将”shell.php .jpg”(带空格的)中间的空格由20改成00
在1中,url中的%00(形如%xx),web server会把它当作十六进制处理,然后将该十六进制数据hex(00)“翻译”成统一的ascii码值“NUL(null)”,实现了截断。
在2中,burpsuite用burp自带的十六进制编辑工具将”shell.php .jpg”(中间有空格)中的空格由20改成00,如果burp中有二进制编辑工具。
延伸一下
其实关于截断相关问题,还有个很有趣的函数,iconv()函数:
在了解iconv()函数漏洞之前,可能需要一点前置知识,

[1] [2]  下一页

0×01 起因
学弟有天在群里说起上传的%00截断的一些问题,就想起之前自己在这个问题踩过坑,想起了自己曾经的flag说要写文章,一直没写,现在来填坑了。
0×02 经过
源码理解:
//test.php    include"1.txt\000.jpg";?>//1.txt
    echo'helloworld';
?>
上面的示例代码在 php版本小于5.3.4 的情况下回输出 helloworld 。从php的内核执行过程来看,PHP通过 php_execute_script 来执行PHP的脚本,这里选取部分有关代码,具体可以看这里:

在 第10行我们看到,他调用zend_execute_scripts来针对脚本进行解析,而这个函数是在Zend/zend.c里面,截取部分相关代码如下:

www.wnhack.com

从PHP内核开来实际上是分为两块部分,一个是compile编译过程 ,另一个是execute执行过程。
第一部分:compile编译过程
我们可以看到这里的代码逻辑通过zend_compile_file获取文件的内容,zend_compile_file是一个函数指针,其声明在/Zend/zend_compile.c中
  ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC); 
在引擎初始化的时候,会将compile_file函数的地址赋值给zend_compile_file 。

compile_file函数定义在/Zend/zend_language_scanner.l,截取部分相关代码。
简单总结一下上面部分代码的逻辑:
zend_compile_file函数首先调用open_file_for_scanning去读取文件,然后通过第17行的zendparse去进行语法和词法解析。而zendparse是通过lex_scan去扫描出token并进行语法分析。
第二部分:execute执行过程
zend_execute也是一个函数指针,其声明在/Zend/zend_execute.h中。
ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC); 内容来自无奈安全网
在引擎初始化的时候,会将execute函数的地址赋值给zend_execute 。

而execute的定义在/Zend/zend_vm_execute.h

根据我们的了解,zend_execute通过ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER函数来进行include的实际处理,即包含要包含的文件。

对比修复代码找到漏洞触发点:

摘出部分修复代码:
www.wnhack.com
我看下存在漏洞的调试运行结果:

修复代码的Z_STRVAL_P(inc_filename) 即上图中的val,即”1.txt”,strlen取得长度为5,而Z_STRLEN_P(inc_filename) 即上图中的len即10。这里实际上解析到的文件名是1.txt。
不存在漏洞的调试运行结果:
一旦出现%00截断,include的文件名经过url转码由”1.txt%00.jpg”变为”1.txt\000.jpg”,进入php语法词法分析器解析后会将这个字符串解析成一个字符串,并使用zend_scan_escape_string进行字符串转码,如图,进入zend_scan_escape_string的内容为:

只要比较发现文件名的strlen长度和语法分析出来的长度不一样,就说明内部存在截断的字符,因此输出了打开文件失败的信息。
利用方式
划重点PHP版本低于5.3.4

copyright 无奈人生


%00截断有这么2种利用状况
1.在url中加入%00,如http://xxxx/shell.php%00.jpg
2.在burpsuite的16进制编辑工具将”shell.php .jpg”(带空格的)中间的空格由20改成00
在1中,url中的%00(形如%xx),web server会把它当作十六进制处理,然后将该十六进制数据hex(00)“翻译”成统一的ascii码值“NUL(null)”,实现了截断。
在2中,burpsuite用burp自带的十六进制编辑工具将”shell.php .jpg”(中间有空格)中的空格由20改成00,如果burp中有二进制编辑工具。
延伸一下
其实关于截断相关问题,还有个很有趣的函数,iconv()函数:
在了解iconv()函数漏洞之前,可能需要一点前置知识,
copyright 无奈人生

[1] [2]  下一页 www.wnhack.com

。 (责任编辑:admin)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。