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代码审计之变量覆盖漏洞
文章图片

php代码审计之变量覆盖漏洞
文章图片

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

我们这里的$ b 实 际 上 就 是 b实际上就是 b实际上就是a,所以会输出world.
import_request_variables变量覆盖 import_request_variables(‘G’)指定导入GET请求中的变量,从而导致变量覆盖。

我们还是直接传入?auth=1仍然可以得到get flag。
【php代码审计之变量覆盖漏洞】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
php代码审计之变量覆盖漏洞
文章图片

示例二: 代码首先判断是否使用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代码审计之变量覆盖漏洞
文章图片

示例3:

php代码审计之变量覆盖漏洞
文章图片

示例4:

php代码审计之变量覆盖漏洞
文章图片

    推荐阅读