php代码审计之变量覆盖漏洞
变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞
经常导致变量覆盖漏洞场景有:$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。
- 全局变量覆盖
- extarct()变量覆盖
- 遍历初始化变量
- import_request_variables变量覆盖
- parse_str()变量覆盖
";
if($auth){
echo "private!";
}
?>";
if(ini_get("Register_globals"))foreach ($_REQUEST as $k => $v) unset(${$k});
print $a;
print $_GET[b];
?>
extract()变量覆盖 PHP extract()函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素,键名用于变量名,键值用于变量值。
文章图片
文章图片
遍历初始化变量($$变量覆盖) 常见的一些以遍历的方式释放变量的代码,可能会导致变量覆盖。
比如我们写一段如下代码:
我们这里的$ b 实 际 上 就 是 b实际上就是 b实际上就是a,所以会输出world.
import_request_variables变量覆盖 import_request_variables(‘G’)指定导入GET请求中的变量,从而导致变量覆盖。
我们还是直接传入
?auth=1
仍然可以得到get flag。【php代码审计之变量覆盖漏洞】
文章图片
函数括号里为提交方式,我们可以改为’P’,提交方式改为POST,可以使用hackbar。
parse_str()变量覆盖 parse_str——将字符串解析成多个变量,如果参数str是URL传递入的查询字符串,则将它解析为变量并设置到当前作用域。
三、变量覆盖CTF实战 示例1 本实例是关于$$导致的变量覆盖,代码使用两个foreach函数定义了我们可以使用POST GET COOKIE方法定义变量和值进行变量覆盖。
$value)
{
$$_key=$_value;
}
}
$id = isset($id) ? $id :"test";
if($id==="mi1k7ea"){
echo "flag{xxxxxxx}";
}else{
echo "Nothing...";
}
?>
之后判断$id是否被定义,并判断相等则输出flag。
所以我们可以直接利用此处的变量覆盖漏洞直接传入
?id=mi1k7ea
。文章图片
示例二: 代码首先判断是否使用post方法传递了flag值,如果没有会输出“access denied"
$value) {
$$key =$$value;
}
foreach ($_POST as $key => $value) {
$$key=$value;
}
if ($_POST["flag"]!==$flag) {
die($_403);
}else{
echo "This is your flag:".$flag."\n";
die($_200);
}
?>
文章图片
示例3:
文章图片
示例4:
文章图片