常见的PHP漏洞

一、md5 加密漏洞

  • 比较哈希字符串的时候,php 程序把每一个以“0x”开头的哈希值都解释为科学计数法 0 的多少次方,恒为 0
  • 所以如果两个不同的密码经过哈希以后,其哈希值都是以“0e”开头的,那么 php 将会认为他们相同。
  • 另外 md5 加密是有几率两个字符串不同,但是加密后的值是相同的情况,这种情况称为哈希碰撞
1
2
3
4
5
6
7
8
<?php
$str1 = 's878926199a';
$str2 = 's214587387a';
echo json_encode([
'md5_str1' => md5($str1),
'md5_str2' => md5($str2),
'bool' => md5($str1) == md5($str2)]
);

结果如下,两个值加密后竟然相等

缺点你懂的,如果一个网站的某个用户密码加密后刚好是 0e 开头的,这个时候黑客过来破解,很容易就攻入了

1
2
3
4
5
{
"md5_str1": "0e545993274517709034328855841020",
"md5_str2": "0e848240448830537924465865611904",
"bool": true
}

二、is_numeric 漏洞

会忽视 0x 这种十六进制的数

容易引发 sql 注入操作,暴漏敏感信息

1
2
3
4
5
6
7
echo json_encode([
is_numeric(233333),
is_numeric('233333'),
is_numeric(0x233333),
is_numeric('0x233333'),
is_numeric('233333abc'),
]);

结果如下

16 进制数 0x61646D696EASII 码对应的值是 admin

如果我们执行了后面这条命令的话:SELECT * FROM tp_user where username=0x61646D696E,结果不言而喻

1
2
3
4
5
6
7
8

[
true,
true,
true,
false,
false
]

三、in_array 漏洞

in_array 中是先将类型转为整形,再进行判断

PHP 作为弱类型语言,类型转换的时候,会有很大漏洞

转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回 0

1
2
3

<?php
var_dump(in_array("2%20and%20%", [0,2,3]));

结果如下

1
bool(true)

四、switch 漏洞

switch 中是先将类型转为整形,再进行判断

PHP 作为弱类型语言,类型转换的时候,会有很大漏洞

转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回 0

1
2
3
4
5
6
7
8
9
10
11
12

<?php
$i ="abc";
switch ($i) {
case 0:
case 1:
case 2:
echo "i是比3小的数";
break;
case 3:
echo "i等于3";
}

结果如下

i 是比 3 小的数

五、intval 强转漏洞

PHP 作为弱类型语言,类型转换的时候,会有很大漏洞

转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回 0

1
2
3
4
5

<?php
var_dump(intval('2')); //2
var_dump(intval('3abcd')); //3
var_dump(intval('abcd')); //0