本质上而言双$原本功能是允许用户自定义变量;但未过滤输入,导致传入参数是一代码中已经定义好的变量,或者全局变量时导致数据篡改,或调用危险函数;
总之;导致的变量覆盖其实就是允许可控参数作为一个变量,这个变量可以是自定义变量,也可以是代码中的变量或全局变量或特殊构造的函数"变量"等.
例题:
[GDOUCTF 2023]受不了一点
代码
前面的绕过是弱比较部分,大部分用数组就可以绕过了.
payload:?aaa=114514&bbb=114514a
变量覆盖部分
点击查看代码
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
Cookie:cookie=j0k3r;
.
总而言之;双$$变量覆盖漏洞原理就是可控变量名导致的数据篡改和危险调用;.