您当前位置: 首页 » 敏感函数 » preg_replace()

preg_replace()

2017年2月20日 | 发表评论(0) 查看评论

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();逃逸出来

分类:

敏感函数

| 标签:

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">