PHP函数漏洞总结
参考链接:
PHP函数漏洞总结
0x01 php md5()函数漏洞
代码示例
1 | <?php |
这里假设URL为http://haha.com
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
常见的payload有1
2
3
4
5
6
7
8
9
10
11
12
13
14
150x01 md5(str)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1(str)
sha1('aaroZmOk')
sha1('aaK1STfY')
sha1('aaO8zKZF')
sha1('aa3OFF9m')
0x02 md5(md5(str)."SALT")
2
还有另外一种方法:MD5不能处理数组,若有以下判断则可用数组绕过1
2
3
4
5if(@md5($_GET['a']) == @md5($_GET['b']))
{
echo "yes";
}
//http://127.0.0.1/1.php?a[]=1&b[]=2
这是因为:URL可以传递数组参数,形式是http://haha.com?x[]=1&x[]=2&x[]=3,这样就提交了一个x[]={1,2,3}的数组。
在PHP中,MD5是不能处理数组的,md5(数组)会返回null,所以md5(a[])==null,md5(b[])==null,md5(a[])=md5(b[])=null,这样就得到答案了。
0x02 php strcmp()函数漏洞
比较两个字符串(区分大小写)
语法
1 | strcmp(str1,str2) |
作用
1 | 如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 |
代码示例
1 | <?php |
0x03 php sha1 和 md5 函数
md5 和 sha1 无法处理数组,返回 NULL(NULL一般情况下也为0)
代码示例
1 | if (@sha1([]) == false) |