变量覆盖漏洞
引入题:[MoeCTF 2022]ezphp
一、概念
变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞。通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,可能会有很大的影响。
二、 变量覆盖漏洞相关的函数
变量覆盖漏洞大多数由函数使用不当导致,经常引发变量覆盖漏洞的函数有:
- extract()
- parse_str()
- import_request_variables()
-
三、详细说明
接下来,我将逐步说明变量覆盖漏洞函数
1.extract()变量覆盖
emmmmmm,其实窝没见过doge
但是这里网上找资料补充一下:
extract() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
实例:
1 | <?php |
//运行结果:$a = Cat; $b = Dog; $c = Horse(Cat将Original覆盖了)
2.$$变量覆盖(重点)
由$$定义的变量为可变变量。就是说,一个变量的变量名可以动态的设置和使用。一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
这个比较常见,我们详细展开一下,以ezphp为例说明一下:
1 | <?php |
漏洞产生:
使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量名,数组中的键值作为变量的值。因此就产生了变量覆盖漏洞。请求?flag=a 会将$flag的值覆盖,$flag=a。
3.parse_str()导致的变量覆盖
parse_str(string,array)函数把**查询字符串解析到变量中。 **
array参数规定存储变量的数组名称。该参数指示变量存储到一个指定的数组中。
注释:如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
查询字符串(URL参数)是指在URL的末尾加上用于向服务器 发送信息的字符串(变量)。将“?”放在URL的末尾,然后再加上“参数=值”,想加上多个参数的话,使用“&”。以这个形式,可以将想要发送给服务器的数据添加到URL中。
parse_str函数的作用就是解析字符串并注册成变量,在注册变量之前不会验证当前变量是否存在,所以直接覆盖掉已有变量
Leave a comment