了解变量覆盖漏洞

什么是变量覆盖漏洞?

自定义的参数值替换原有变量值的情况称为变量覆盖漏洞
经常导致变量覆盖漏洞场景有:$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。

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

    变量覆盖的种类

    一、全局变量覆盖(PHP5.3.0废弃,PHP5.4.0移除)
    当register_global=ON时,变量来源可能是各个不同的地方,比如页面的表单,Cookie等。
    image.png
    二、extract()变量覆盖
    PHP extract()函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素,键名用于变量名,键值用于变量值。
    image.png
    1. int extract ( array & $array [, int $flags = EXTR_OVERWRITE [, string sprefix = NULL ]])
    image.png
    三、遍历初始化变量($$变量覆盖)

常见的一些以遍历的方式释放变量的代码,可能会导致变量覆盖。
image.png
四、import_request_variables变量覆盖
import_request_variables(’G’)指定导入GET请求中的变量,从而导致变量覆盖。
image.png
五、parse_str()变量覆盖
parse_str将字符串解析成多个变量,如果参数str是URL传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。
image.png
image.png
$类型变量覆盖
1.php
2.php
parse_str()变量覆盖
Parse_str1.php
Parse_str2.php