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

访客6年前黑客资讯907

0×01 原因
学弟有天在群里说起上传的%00切断的一些问题,就想起之前自己在这个问题踩过坑,想起了自己从前的flag说要写文章,一向没写,现在来填坑了。
0×02 通过
源码了解:
//test.php    include"1.txt00.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.txt00.jpg”,进入php语法词法分析器解析后会将这个字符串解析成一个字符串,并运用zend_scan_escape_string进行字符串转码,如图,进入zend_scan_escape_string的内容为:

只需比较发现文件名的strlen长度和语法分析出来的长度不一样,就阐明内部存在切断的字符,因而输出了翻开文件失利的信息。
使用 ***
划要点PHP版别低于5.3.4
%00切断有这么2种使用情况
1.在url中参加%00,如https://www.hack56.com/images/xsa5ifixf20.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]  黑客接单网

相关文章

根据Session的身份盗取

一、Session是什么 暗码与证书等认证手法,一般用于登录进程。用户登录之后,服务器通常会树立一个新的Session保存用户的状况和相关信息,用以盯梢用户的状况。每个Session对应一个标识符Se...

SCP指令注入

我最近正在研讨Java文件传输,碰到了一些风趣的问题。这些问题是我在看到一篇博客中的几个示例代码中发现的。这篇文章描述了用Java履行SCP指令的体系,运用的是盛行的JSch库。当我通读整个代码之后,...

综合利用SlickQuiz两个0-Day漏洞接管Uber的WordPress网站-黑客接单平台

本文叙述作者在参与HackerOne的H1-4420竞赛中,针对厂商Uber的某WordPress博客网站为方针,发现其内置问卷调查插件SlickQuiz最新版存在存储型XSS(CVE-2019-12...

LimeRAT在野外传达

几天前,Cybaze-Yoroi ZLab安全团队遇到了一类风趣的感染链,它运用多种杂乱技能,能够绕过传统安全防御机制并躲藏其payload,对方针用户形成严重威胁。 整个感染链始于一个LNK文件,运...

小白的代码审计之路

 此文由猪八戒SRC,代码审计小鲜肉“呆呆的骗子大婶”倾情贡献~欢迎勾搭! 一、 代码 审计指令注入 PHP自带的函数中供给了几个能够履行体系指令的函数,在web项目的开发中一般是不会用到的,但...

网站被挂木马与777权限的微妙

 某天VIP大讲堂微信群里的一位同学说网站被人挂马了,查了半响也查不到原因。艺龙SEO负责人刘明问了一句“是不是技能把linux体系里网站的中心目录设置777文件权限了”,同学查后发现不出所料。那么,...