变量覆盖
变量覆盖漏洞在ctf考题中有关命令执行/代码执行的绕过里考,或者在对方存在文件上传点,但是waf对指定函数进行黑名单处理
<?php //ctf考题对flag过滤
$a = fl;
$b = ag;
$c = $a.$b;
?>
----------
<?php //对assert断言函数过滤
$bb="assert";
$aa='bb';
$$aa($_POST['a']);
?>
-----------
经常引发变量覆盖漏洞的函数有:extract(),parse_str(),import_request_variables()
其实以上3、4种函数本质原理都是在利用变量<-->数组时,或者是$符号的解析特性导致变量绕过执行
extract
extract() 函数从数组中将变量导入到当前的符号表
<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
---------------------------
输出:$a = Cat; $b = Dog; $c = Horse
单引号不会解析,所以写的是$a那么就是$a
,双引号会解析,所以输出 b
这些斜杠的的意思就是,让后面的变量失去意义。那么写的是什么就是什么。 extract函数就是把数组中的变量,覆盖掉原来的变量, 这里我们可以理解为本来变量a应该输出Original,但是因为extract函数,所以把原来的a给覆盖了
变量test我们不知道是什么,extract函数就是把数组中的变量,覆盖掉原来的变量,
简单的说就是,$_GET获取到的值,通过extract函数的作用,把原来变量test的值给覆盖了,
然后isset函数是检查是否存在
最后如果gift和content的值相等的话,就输出flag
通常都是在白盒审计时,查找关键函数才能找到变量覆盖漏洞,有利于拿webshell
$$
parse_str
见我BUUCTF-P15视频讲解,或者php代码安全文章
<?php
$a = 1;
parse_str("foo_bar=42",$o);
print_r($o);
echo "<br>";
parse_str("%20news[id%00=42",$o); //Array ( [news_id] => 42 )
print_r($o);
// %20news[id%00=42
?>
这里get方式传入的%20news[id%00=42,最后被parse_str函数转换为[news_id] => 42
这里%20是空格url编码,被去掉了;%00是截断也被去掉了;[ 符号被转换为下划线。
作用:绕过某些针对关键字变量waf的拦截
比如sql注入语句:/news.php?%20news[id%00=42"+AND+1=0--
这里对方未匹配到news_id变量所以waf放行,同理,我们可以在变量$a,前后中间增加%00,%20等会被parse_str替换掉的位置
import_request_variables
import_request_variables 函数可以在 register_global = off 时,把 GET/POST/Cookie 变量导入全局作用域中
<?php
$a = '0';
import_request_variables('G');
if($a == 1){
echo "hello!";
}else{
echo "word!";
}
?>
直接把输入的当变量并赋值了,比如:www.xxx.com/1.php?a=0,这里就直接把赋值给了$a,所以会输出word!,还有就是import_request_variables 函数里面的’G‘就是代表get传参,’P‘就是代表post传参
像这种变量覆盖漏洞实战中只能通过代码审计挖掘,这里就是利用我们通过get,post,cookie方式传入变量覆盖原代码存在的变量
先知社区文章https://xz.aliyun.com/t/11276
异或生成
待更新