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吧,新版本没有这个东西了

 

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

posted @ 2020-08-18 16:03  anoldcat  阅读(504)  评论(0编辑  收藏  举报