目录
在不同的环境之下,相同的代码可能带来不一样的实现效果,对于开发人员来说,不同的环境应该写出兼容性更好的代码,对于安全人员来说,利用环境,也可以让一行普通的语句变成漏洞。
一、PHP的特性
1.弱类型
(1)简介
在PHP中有一些相等的值:
在PHP中,比较两个值是否相等,可以用“==”或者“===”两种符号,前者会在比较的时候自动进行类型转换,而不是改变原来的值,所以存在漏洞的位置往往是“==”,其中的一个常见错误用法就是:
这个时候,如果input变量的值为labc,则比较的时候labc会被转换为1,if语句的条件满足,进而造成其他的漏洞,另一个常见的场景是在运用函数的时候,参数和返回值经过了类型转换造成漏洞。
(2)实例1
如何才能满足下面这样一个if判断语句?
需要使两个变量不相等而MD5值相等。这样的思路可以通过MD5碰撞的方法来解决。对于PHP来讲,MD5的返回值是一个32位的字符串,若这个字符串以“0e”开头,类型转换机制将会把它识别为一个科学计数法表示的数字“0”,下面给出两个MD5以0e开头的字符串
aabg7XSs=0e087386482136013740957780965295
aabC9Rqs=0e041022518165728065344349536299
提交这两个字符串即可绕过
(3)实例2
如果上面的“==”变成了“===”就不能成功了,但是仍然可以利用PHP的特性来进行,可以在URL栏中提交a[]=1&b=[]=2成功绕过,因为当我们令MD5函数的参数为一个数组的时候,函数会报错,并返回NULL值,虽然函数的参数时两个不同的数组,但是返回的值都是NULL。
同样是在程序返回值中容易判断错误的函数还有很多,如:strpos,见PHP手册
这也是一种经常能见到的写法,当str1在str2开头时,函数的返回值是0,而0 == false是成立的,这就会造成开发者逻辑之蛙的结果。
2.PHP反序列化漏洞
PHP提供的serialize和unserialize函数将任意类型的数据转换成string类型或者从string类型还原成任