01 md5加密漏洞比较哈希字符串的时候,php程序把每一个以“0x”开头的哈希值都解释为科学计数法0的多少次方,恒为0。 所以如果两个不同的密码经过哈希以后,其哈希值都是以“0e”开头的,那么php将会认为他们相同。 另外md5加密是有几率两个字符串不同,但是加密后的值是相同的情况,这种情况称为哈希碰撞。 <?php$str1 = 's878926199a';$str2 = 's214587387a'; echo json_encode([ 'md5_str1' => md5($str1), 'md5_str2' => md5($str2), 'bool' => md5($str1) == md5($str2)]); 结果两个值加密后竟然相等。 缺点你懂的,如果一个网站的某个用户密码加密后刚好是0e开头的,这个时候黑客过来破解,很容易就攻入了。
02 is_numeric漏洞会忽视0x这种十六进制的数 容易引发sql注入操作,暴露敏感信息 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,结果不言而喻
03 in_array漏洞in_array中是先将类型转为整形,再进行判断。 PHP作为弱类型语言,类型转换的时候,会有很大漏洞。 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。 <?phpvar_dump(in_array('2%20and%20%', [0,2,3])); 结果如下:
04 switch漏洞switch中是先将类型转为整形,再进行判断。 PHP作为弱类型语言,类型转换的时候,会有很大漏洞。 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。 <?php$i ='abc';switch ($i) { case 0: case 1: case 2: echo 'i是比3小的数'; break; case 3: echo 'i等于3';} 结果如下: i是比3小的数。 05 intval强转漏洞PHP作为弱类型语言,类型转换的时候,会有很大漏洞。 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。
|
|
来自: Fengsq501u81r4 > 《计算机》