〝 古人学问遗无力,少壮功夫老始成 〞:因为PHP是弱类型语言,所以内置的很多函数,在进行转换和比较的时候,会有各种漏洞需要格外关注。不然很容易在安全上造成各种各样的漏洞,当然平时可能问题不会显现,但是如果人家恶意攻击,这将首当其冲,必然安全部门首先让你来背锅,所以代码能严格就要严格,尽量在平时养成良好的习惯
01
md5加密漏洞
比较哈希字符串的时候,php程序把每一个以0x开头的哈希值都解释为科学计数法0的多少次方,恒为0。
所以如果两个不同的密码经过哈希以后,其哈希值都是以0e开头的,那么php将会认为他们相同。
另外md5加密是有几率两个字符串不同,但是加密后的值是相同的情况,这种情况称为哈希碰撞。
$str1 =s878926199a;
$str2 =s214587387a;echojson_encode([md5_str1=> md5($str1),md5_str2=> md5($str2),bool=> md5($str1) == md5($str2)
]);
结果两个值加密后竟然相等。
缺点你懂的,如果一个网站的某个用户密码加密后刚好是0e开头的,这个时候黑客过来破解,很容易就攻入了。
{md5_str1:"0e545993274517709034328855841020",md5_str2:"0e848240448830537924465865611904",bool: true
}
02
is_numeric漏洞
会忽视0x这种十六进制的数
容易引发sql注入操作,暴露敏感信息
echojson_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,结果不言而喻
[true,true,true,false,false]
03
in_array漏洞
in_array中是先将类型转为整形,再进行判断。
PHP作为弱类型语言,类型转换的时候,会有很大漏洞。
转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。
phpvar_dump(in_array("2%20and%20%", [0,2,3]));
结果如下:
bool(true)
04
switch漏洞
switch中是先将类型转为整形,再进行判断。
PHP作为弱类型语言,类型转换的时候,会有很大漏洞。
转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。
$i ="abc";switch($i) {case0:case1:case2:echo"i是比3小的数";break;case3:echo"i等于3";
}
结果如下:
i是比3小的数。
05
intval强转漏洞
PHP作为弱类型语言,类型转换的时候,会有很大漏洞。
转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。
phpvar_dump(intval(2));//2var_dump(intval(3abcd));//3var_dump(intval(abcd));//0
以上就是本次分享的所有内容!