• PHP变量覆盖漏洞整理


    昨天群里HW的大佬们都在传某某服终端检测响应平台edr存在大量RCE的洞

    官网上关于EDR的介绍是这么写的

    终端检测响应平台EDR,围绕终端资产安全生命周期,通过预防、防御、检测、响应赋予终端更为细致的隔离策略、更为精准的查杀能力、更为持续的检测能力、更为快速的处置能力。在应对高级威胁的同时,通过云网端联动协同、威胁情报共享、多层级响应机制,帮助用户快速处置终端安全问题,构建轻量级、智能化、响应快的下一代终端安全系统

     

    存在这种级别的漏洞,确实危害极大

     

    根据已知消息存在PHP变量覆盖漏洞

    部分代码如下

    /**
         * 显示表单
         * @param array $params 请求参数
         * @return
         */
        $show_form = function($params) use(&$strip_slashes, &$show_input) {
            extract($params);
            $host  = isset($host)  ? $strip_slashes($host)  : "127.0.0.1";
        $main = function($argv) {
             extract($argv);
             if (!isset($code)){
             return;
             }
             eval($code);
        };                    

    借此机会回顾整理一下变量覆盖漏洞的一些知识

    既然叫变量覆盖,顾名思义,就是我们能自定义某些参数变量,来替换掉原有的变量

    常见的可能出现变量覆盖的场景有$$  extract()  parse_str()  import_request_variables()  开启了全局变量注册

    0x01 $$

    $$为可变变量,举例子来说

    $var = "PHP";



    // 引用变量

    $$var = "PHP中文网";



    // 输出$var的值

    echo $var . "
    ";



    // 输出$$var的值

    echo $$var . "
    ";



    // 输出$PHP的值

    echo "$PHP";

    ---------------------
    本文著作权归作者所有。
    商业转载请联系作者获得授权,非商业转载请注明出处。
    来源地址:https://www.php.cn/php-weizijiaocheng-415613.html
    来源:php中文网(www.php.cn)
    © 版权声明:转载请附上原文链接!

    $var="php";

    $$var="jsp";

    echo $var;     php

    echo $$var;    jsp

    echo "$php";   jsp

    很清晰很明了

    此符号常常与foreach一起出现,foreach遍历数组的名字,又把数组键名做变量,数组键值做变量值,导致值被覆盖

    $name="lcx";

    foreach ($_GET as $key => $value)                                       数组   as  键=>值

        $$key = $value;

    。。。。。。

    echo $name;

    碰巧用到name参数

    你get方式传参数xxx.php?name=lcxlcxlcx

    按照代码写法,$name(即$$key)=lcxlcx(即$value)

    最后echo出来的$name值都变成lcxlcx了,不是原来的lcx了,$name被你的输入覆盖了

    怎么办?

    别这么写就完了

     0x02 extract()

    extract() 函数从数组中将变量导入到当前的符号表

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

    extract(array,extract_rules,prefix)

    举个例子,你要是知道对面代码怎么写的,就可以构造相应的传递参数,进行覆盖

    <?php

    $id=1;

    extract($_GET);

    echo $id;

    ?>

    我传递了?id=1234   则$id被覆盖成1234了

    怎么办?

    extract($_GET,EXTR_SKIP); 

     用上EXTR_SKIP参数,有冲突不覆盖原有变量

    0x03 parse_str()

    parse_str() 函数用于把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量

    parse_str(string,array)

    如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量

    <?php

    $name="lll";
    $age="12";

    parse_str("name=lcx&age=18");

    echo $name;

    echo $age;

    ?>

    $name与$age已经被覆盖了

    这是很危险的,按照代码构造参数,进行绕过过滤

     0x04 import_request_variables()

    在 register_global = off 时,把 GET/POST/Cookie 变量导入全局作用域中

    <?php
    import_request_variables("g", "get_");
    echo $get_id;
    ?>

    0x05 全局变量注册

    register_globals用来注册全局变量

    当register_globals全局变量设置开启时,传递过来的值会被直接注册为全局变量而使用,这会造成全局变量覆盖

    要么关了,要么用新版本PHP吧,新版本没有这个东西了

    随便转载,请标明作者出处

  • 相关阅读:
    017 文件xfs_repair恢复,xfs_dump恢复,lvm动态扩容
    003 rsync客户端与服务端小脚本
    002 rsync守护进程传输方式详解
    001 期中架构简介、备份初识
    016 netstat、磁盘分区(fdisk、gdisk)
    015 Linux中常用的信号、HUP信号
    014 进程(PS与TOP)
    013 源码安装(Nginx&php为例)
    本地、远程仓库的搭建
    第八章
  • 原文地址:https://www.cnblogs.com/lcxblogs/p/13523710.html
Copyright © 2020-2023  润新知