变量覆盖:用传入的参数值来替换掉原有的变量的值 。
主要去研究这两个函数extract和parse_str
extract()
这个函数的作用是将一个数组里面的元素分别变成变量,例如下面的例子,输入一个$a,和一个数组,里面a=cat,b=dog,c=horse。进行extract这个函数运算后,就会产生三个变量:$a,$b,$c。他们的值分别等于数组里面对应的值。虽然$a是由原来的值的,但是会被覆盖掉。
那就算改变了变量为什么会由漏洞呢。其实前面生成变量并没有什么问题主要问题是在后面会有一些关于前面的变量的操作。
观察上述代码,会发现我们get一个arr数组,然后使用extract函数,再后面使用$d作为函数,a作为参数进行函数的调用。那么如果我们再get参数的时候输入arr[d]=system。那么就会让d=system
然后我们进行最后一步post的时候我们就会发现可以改变a的值来进行危险操作。加入使a=ls就会出现以下情况。
parse_str()
第一个代码执行完成后是$name=bill,$age=60。即将前面的变为变量名,将后面的变为变变量值。
在上述代码中,进行get在url后边加入arr=d=system,其他的操作和上一个例题相似。
例题
这个题目也用到了弱类型问题(之前写过)有一个变量为a=TESTCTF,因此我们要改变a的值。要求a[0]不等于QNKCDZXO但是它的md5值等于QNKCDZXO的md5,可以看出后面是一个弱类型问题。
经过输出发现QNKCDZXO的md5是一个0e的2科学计数法。
因此需要我们的a[0]也是0e的科学计数法(并且md5后还是科学计数法)或者md5后是科学计数法,接下来的问题是怎么样改变a的值
代码中对id进行了parse_str因此我们就要get传入id
在url后面传入
即可完成flag的寻找。