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

访客5年前黑客资讯854

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]  黑客接单网

相关文章

PHP中该怎样避免SQL注入?

问题描述: 假如用户输入的数据在未经处理的情况下刺进到一条SQL查询句子,那么运用将很可能遭受到SQL注入进犯,正如下面的比如: $unsafe_variable = $_POST['user_in...

怎么运用SQLAlchemy库写出防SQL注入的Raw SQL

 Python阵营有许多操作数据库的开源库(装置pip后,能够凭借”pip search mysql”检查可用的库列表),其中被运用最多的无疑是MySQLdb,这个库简略易上手。其偏底层的特性为开发者...

你的PoC和EXP可能得改改了-黑客接单平台

一、前语 在MySQL 5.7.5之前的所有主版别存在一个BUG,该或许导致影响POC/EXP需求从头编写或批改的问题。 BUG信息链接: https://bugs.mysql.com/bug.ph...

恣意用户暗码重置(五):重置凭据可暴破

在逻辑缝隙中,恣意用户暗码重置最为常见,或许出现在新用户注册页面,也或许是用户登录后重置暗码的页面,或许用户忘掉暗码时的暗码找回页面,其间,暗码找回功用是重灾区。我把日常浸透过程中遇到的事例作了缝隙成...

Kerberos中继攻击:滥用无约束委派(下)-黑客接单平台

上一篇文章,我只讲了中继进犯的基本理论,这篇文章,我会举两个示例来及详细阐明。 示例1:运用计算机帐户和SpoolService缝隙获取DC同步权限 在第一种情况下,咱们将乱用我的internal.c...

反击爬虫,前端工程师的脑洞能够有多大?

关于一张网页,咱们往往期望它是结构杰出,内容明晰的,这样搜索引擎才干精确地认知它。 而反过来,又有一些情形,咱们不期望内容能被容易获取,比方说电商网站的交易额,教育网站的标题等。由于这些内容,往往是...