1 变量覆盖漏洞
extract造成的变量覆盖
extract($array)的作用是将数组键名作为变量名,使用数组键值作为变量值。它存在一个安全漏洞,若使用函数默认参数,那么如果数组中的某个键值在php代码中的某个变量名相同,那么就会覆盖这个变量。
例如:
<?php
$a=100
$array=["a" => "Cat"]
extract($array)
echo $a
?>
这里输出变量a的值不是100,而是“cat”,这是因为原来的变量$a被数组的变量覆盖了。
题目:bugku extract变量覆盖
这道题的本意是想覆盖flag的值,所以构造payload时,考虑输入flag和shiyan两个参数,使得shiyan和conten的值相同。这里补充:file_put_content(path)中的路径为空时,返回false;trim()中的值时bool类型、null时,返回null。所以修改flag,使得file_put_content函数返回false,因此content的值为null,所以shiyan的值要设置成空。所以payload可以如下:
?shiyan=&flag=
?shiyan=&flag=1
?shiyan=
flag基本可以任意取,因为只要它是无效路径就可以了
2 弱类型漏洞
1、普通转换: 字符串和数字比较时,会先转换成数字。数字开头的字符串,则直到第一个字母出现之前的数字符号转化成数字;开头不是数字的字符串,转换成0.
题目:【bugku】 弱类型整数大小比较绕过
组成字符串的前四位的数字大于1336,剩余位置包含非数字符号即可。
2、0e转换: 字符串开头时0e,其它的字符全是数字符号时,在弱类型比较下,会先把字符串转化成0。例如:“0e1234” == 0 表达式的值是True。这种性质会被利用在绕过哈希函数比较里,因为哈希函数处理某些字符串时,返回的字符串开头是0e。
md5($string) 返回是0e开头的string有:
QNKCDZO
240610708
s878926199a
s155964671a
sha1($string) 返回是0e开头的string有:
aaK1STfY
aaO8zKZF
题目:【bugku】md5加密相等绕过
传入a的值是240610708即可
3 输入数组造成漏洞
3.1 strcmp()
strcmp(str1,str2)比较2个字符串的大小,相等就返回0。从php5.3开始,当传入函数的不是字符串而是数组时,尽管不相等,函数返回的值也是0。
题目:【bugku】strcmp比较字符串
把a作为数组传入即可
?a[]
3.2 哈希函数
哈希函数sha1()、md5()等传入的值是数组时,返回NULL。利用NULL===NULL绕过
题目:【bugku】md5()函数
传入2个不相等数组即可
3.3 strpos()、ereg()、strlen()
传入数组时,函数返回NULL。一般利用NULL!==FALSE来绕过
题目:【bugku】strpos()数组绕过
传入的值是数组即可。另外,ereg()还有%00截断的漏洞,%00后的字符不解析。