PHP双等于缺陷引发的安全问题

来源:互联网 发布:麻将概率分析软件 编辑:程序博客网 时间:2024/05/18 10:05
导言:昨晚一哥们问渗透面试题目有什么经典的,因为前段时间看了法师的书,我对==和===号记忆很深刻,特别留意了下,就给他说了下在php==和===的问题。看他不太理解,我也正好写下这篇文章来总结下学习历程。

0x01

  我们都知道php中有两种比较的符号 == 与 ===。  === 在进行比较的时候,会先判断类型是否相等,再比较    == 在进行比较的时候,会先将变量做类型转化

0x02

首先我们看下下面的比较

01

输出:
02

上面的代码可以说明==在判断时确实做了类型转换,那么转换规则如下:如果该字符串没有包含'.','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 案例
    03

    我们假如在登陆验证的时候,取了数据库存储的MD5进行比较。

    假设用户采用类似0e[0-9].的密码,我们输入一个密码,这个密码进行MD5加密后同样可以产生0e[0-9].这种形式的MD5,那么做==判断的时候,是否可以直接登陆?

    如:
    04
    我们输入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”。

原创粉丝点击