导言:
昨晚一哥们问渗透面试题目有什么经典的,因为前段时间看了法师的书,我对==和===号记忆很深刻,特别留意了下,就给他说了下在php==和===的问题。看他不太理解,我也正好写下这篇文章来总结下学习历程。
0x01
我们都知道php中有两种比较的符号 == 与 ===。
=== 在进行比较的时候,会先判断类型是否相等,再比较
== 在进行比较的时候,会先将变量做类型转化
0x02
首先我们看下下面的比较
输出:
上面的代码可以说明==在判断时确实做了类型转换,那么转换规则如下:
如果该字符串没有包含'.','e','E'并且其数值在整形的范围之内该字符串被当作int来取值。
其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
那么:
- a转换成了0, 0==0 ,为true
- 1a转换取开始值1, 1==1 ,为true
- a1转换取值为0, 0==1 ,为false
a1转换取值为0, 0==0 ,为true
至于最后一个比较,”0e123456”==”0e456789”相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等。
0x03 案例
我们假如在登陆验证的时候,取了数据库存储的MD5进行比较。
假设用户采用类似0e[0-9].的密码,我们输入一个密码,这个密码进行MD5加密后同样可以产生0e[0-9].这种形式的MD5,那么做==判断的时候,是否可以直接登陆?
如:
我们输入QNKCDZO
md5(QNKCDZO,32) =0e830400451993494058024219903391
成功登陆账号。
当然,前提是这个原先密码设置的时候经过一次MD5加密后要也是0e[0-9].*的。
除了我代码中的,还有240610708,s878926199a,s214587387a,s878926199a,s1091221200a,s1885207154a等
0x04 扩展
说明了几个安全问题
1、该网站在对密码采用了不完备的加密体制md5一次加密。
2、某些用户的密码可能会形同虚设。
3、当网站的交易记录产生了ID=0e462097431906509019562988这种 0e[0-9].形式时,攻击者可伪造任意 0e[0-9].的形式绕过为ID的判断对记录数据进行风险操作。类似的形式还有”603E-4234”== “272E-3063”。