chevron-up bell reply instagram twitter2 feed3 finder search-25px-p0
暂无公告

preg_replace()

2017-02-20
内容纲要

preg_replace函数的作用是对字符串进行正则处理,之前的文章提过利用preg_replace来引入单引号(浅谈审计中如何快速定位引入单引号的地方

今天在来看一下它的代码执行漏洞。

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

这段代码的含义是搜索$subject中匹配$pattern的部分,用$replacement替换。而当$pattern的第一个参数存在/e修饰符时,$replacement的值会被当成php代码来执行

访问http://www.am0s.com/test/test.php?a=phpinfo()则会成功执行phpinfo()

审计实例:

preg_replace()代码执行不得不说经典的thinkphp代码执行了

在/ThinkPHP/Lib/Core/Dispatcher.class.php文件中

这段话的意思是将正则匹配出来的参数1初始化到$var中,并把参数2赋值。这里一个问题就是在赋值的时候使用的是双引号,那么就导致双引号中间的变量被解析了。

http://www.am0s.com/index.PHP/module/action/param1/${@phpinfo()} 导致执行phpinfo()

除此之外还有两个小问题,在ctf中可能遇到,p牛在小密圈里发过一题

先来看下原理

replacement中可以包含后向引用n$n,语法上首选后者。 每个 这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。 n 可以是0-99,$0代表完整的模式匹配文本。 捕获子组的序号计数方式为:代表捕获子组的左括号从左到右, 从1开始数。如果要在replacement 中使用反斜线,必须使用4个("\",译注:因为这首先是php的字符串,经过转义后,是两个,再经过 正则表达式引擎后才被认为是一个原文反斜线)。

从原理可以得到两种做法。

第一种:

http://127.0.0.1/test/1.php?option=aaa%27;%0aphpinfo();//

第二种:

先访问http://127.0.0.1/test/1.php?option=;phpinfo(); 此时得到内容

再访问http://www.am0s.com/1.php?option=$0得到:

单引号正好闭合,导致phpinfo();逃逸出来

admin

发表评论