宝哥软件园

对PHP中preg_replace和代码执行的深入研究

编辑:宝哥软件园 来源:互联网 时间:2021-08-30

前言

本文将深入研究preg_replace /e模式下的代码执行,包括preg_replace函数的执行过程分析、正则表达式分析和漏洞触发分析。上面有很多洞。相信看完这篇文章你会有所收获。以下是七月火和l1nk3r的分析结果。

情况

我们先来看一个案例,思考一下如何在这里使用preg_replace /e模式来执行代码(不用看下面的分析就可以自己思考有效载荷)。

其实这种情况很简单,就是preg_replace使用/e模式,导致代码执行,这个函数的第一个和第三个参数是可控的。众所周知,当preg_replace函数匹配一个带有正则符号的字符串时,它会将替换字符串(即上图中preg_replace函数的第二个参数)作为代码执行,但这里的第二个参数被固定为‘strtolow’( 1 1’),那么如何执行代码呢?

爬坡坑1

上述命令的执行相当于eval(' strlower(' 1 ');'因此,1实际上是1,并且1在正则表达式中有自己的含义。让我们来看看W3Cschool中对它的描述:

反向参考

在正则表达式模式或部分模式的两侧添加括号将导致相关匹配存储在临时缓冲区中,并且每个捕获的子匹配将按照正则表达式模式中从左到右的顺序存储。缓冲区编号从1开始,最多可以存储99个捕获的子表达式。可以使用“n”访问每个缓冲区,其中n是一个一位数或两位数的十进制数,用于标识特定的缓冲区。

因此,这里的1实际上指定了第一个子匹配,我们将分析ripstech给出的有效载荷,以方便大家理解。官方有效载荷为:/?*={${phpinfo()}},也就是GET传入的参数名是/?*值为{${phpinfo()}}。

原始语句:preg _ replace ('/(')。$ regex。)/ei ',' str ower(' 1 ')',$ value);它变成了一个语句:preg _ replace ('/(。*)/ei ',' str ower(' 1 ')',{ $ { phpinfo()} });

爬坡坑2

如果上面的preg_replace语句是直接写在程序中的,当然phpinfo()可以成功执行,但是我们的。*被GET传入,你会发现phpinfo函数无法执行,如下图所示:

当我们转储$_GET数组时,我们会发现。*我们发送上去就变成了_ *,如下图所示:

这是因为在PHP中,传入的非法$_GET数组参数名将被转换为下划线,这将导致我们的常规匹配失效。我们可以模糊PHP将用下划线替换哪些符号,并发现有:(这是非法字符不是首字母的情况)

当非法字符是第一个字母时,只有点会被下划线替换:

所以我们要做的就是改变一个正则表达式,并将其匹配到{${phpinfo()}}来执行phpinfo函数。这里我提供了一个有效载荷: s *=$ {phpinfo ()}。执行结果如下:

爬坡坑3

先说说为什么要匹配{${phpinfo()}}或者${phpinfo()}才能执行phpinfo函数,这是一个小坑。这其实就是PHP变量的原因。在PHP中,变量可以用双引号括起来的字符串进行解析,但不能用单引号。${Phpinfo()}中的phpinfo()将首先作为变量执行,然后在执行后变成$ { phpinfo()在成功执行后返回true)。如果你明白这一点,你就能理解下面的问题:

var _ dump(phpinfo());//结果:boolean true var _ dump(strtolow(phpinfo()));//结果:字符串“1”var _ dump(preg _ replace(/(。*)/IE ',' 1 ',' { $ { phpinfo()} } ');//结果:字符串“11”var _ dump(preg _ replace('/(。*)/IE '、strlower (' 1 ')'、' { $ { phpinfo()} } ');//结果:空字符串“”var _ dump(preg _ replace(/()。*)/IE ',' str lower({ $ { phpinfo()} } ')',' { $ { phpinfo()} } ');//结果:此处的空字符串“”str ower(“{ $ { phpinfo()} }”)等效于str ower(“{ $ { 1 } }”)、str ower(“{ null }”)和空字符串摘要。

这个问题是我们在做PHP-Audit-Labs项目的时候发现的。我们尽力把每篇文章中的漏洞理解分析透彻,这也是对自己的一种提升。

好了,这就是本文的全部内容。希望本文的内容对你的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

更多资讯
游戏推荐
更多+