PHP函数漏洞总结

PHP函数漏洞总结

参考链接:

PHP函数漏洞总结

0x01 php md5()函数漏洞

代码示例

1
2
3
4
5
6
7
8
9
10
11
<?php
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b']) {
if (@md5($_GET['a']) === @md5($_GET['b'])) {
echo ('right');
}else {
echo ('Wrong');
}
}
}
?>

这里假设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
15
0x01 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
5
if(@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
2
3
4
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 
5.2 中是将两个参数先转换成string类型。
5.3.3以后,当比较数组和字符串的时候,返回是0。
5.5 中如果参数不是string类型,直接return了

代码示例

1
2
3
4
5
6
7
8
<?php
$password=$_GET['password'];
if (strcmp('xd',$password)) {
echo 'NO!';
} else{
echo 'YES!';
}
?>

0x03 php sha1 和 md5 函数

md5 和 sha1 无法处理数组,返回 NULL(NULL一般情况下也为0)

代码示例

1
2
3
4
5
if (@sha1([]) ==  false)
echo 1;
if (@md5([]) == false)
echo 2;
echo var_dump(@sha1([]));
文章目录
  1. 1. PHP函数漏洞总结
    1. 1.1. 0x01 php md5()函数漏洞
      1. 1.1.1. 代码示例
    2. 1.2. 0x02 php strcmp()函数漏洞
      1. 1.2.1. 语法
      2. 1.2.2. 作用
      3. 1.2.3. 代码示例
    3. 1.3. 0x03 php sha1 和 md5 函数
      1. 1.3.1. 代码示例
,