php代码审计之变量覆盖漏洞

php代码审计之变量覆盖漏洞

变量覆盖漏洞

自定义的参数值替换原有变量值的情况称为变量覆盖漏洞

经常导致变量覆盖漏洞场景有:$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。

  • 全局变量覆盖
  • extarct()变量覆盖
  • 遍历初始化变量
  • import_request_variables变量覆盖
  • parse_str()变量覆盖

变量覆盖的种类

全局变量覆盖(PHP5.3.0废弃、PHP5.4.0移除)

当register_global=ON时,变量来源可能是各个不同的地方,比如页面的表单、cookie等

";
if($auth){
 echo "private!";
}
?>

";
if(ini_get("Register_globals"))foreach ($_REQUEST as $k => $v) unset(${$k});
print $a;
print $_GET[b];
?>
extract()变量覆盖

PHP extract()函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素,键名用于变量名,键值用于变量值。



php代码审计之变量覆盖漏洞_第1张图片

php代码审计之变量覆盖漏洞_第2张图片

遍历初始化变量($$变量覆盖)

常见的一些以遍历的方式释放变量的代码,可能会导致变量覆盖。
比如我们写一段如下代码:


我们这里的$ b 实 际 上 就 是 b实际上就是 ba,所以会输出world.

import_request_variables变量覆盖

import_request_variables(‘G’)指定导入GET请求中的变量,从而导致变量覆盖。


我们还是直接传入?auth=1仍然可以得到get flag。

php代码审计之变量覆盖漏洞_第3张图片
函数括号里为提交方式,我们可以改为’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

php代码审计之变量覆盖漏洞_第4张图片

示例二:

代码首先判断是否使用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);
}
?>

php代码审计之变量覆盖漏洞_第5张图片

示例3:

     
      

php代码审计之变量覆盖漏洞_第6张图片

示例4:

php代码审计之变量覆盖漏洞_第7张图片

你可能感兴趣的:(PHP代码审计)