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

导言:
昨晚一哥们问渗透面试题目有什么经典的,因为前段时间看了法师的书,我对==和===号记忆很深刻,特别留意了下,就给他说了下在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”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值