手机短信验证码渗透测试实战

地球胖头鱼 2021-01-25
Web安全 发布于 2021-01-25 10:36:51 阅读 133 评论 0

验证码绕过

一般情况网站或者其它的业务系统在找回密码时都会通过手机号或者邮箱来验证用户身份。但是可悲的是他们在验证的过程中产生了一些逻辑错误。

什么错误呢?大概是这样的,用户输入手机号,点击获取验证码,服务端校验手机号是否正确,正确则返回类似errno=0的参数,不正确则返回类似errno=-1的参数,然后客户端通过js判断服务返回的值,如果返回errno=0,那说明手机号正确,调用发送验证码的服务,否则不调用并提示手机号错误或不存在。这里的错误点就在于不应该由服务端返回errno这个参数再由客户端来验证,应该是服务端验证完手机号后直接做出操作,如果手机号正确则直接调用发送验证码的服务,不正确则直接返回手机号不存在之类的提示。

以下是一次测试记录,已经进行脱敏,如发现敏感信息,请及时联系删除

找回密码页面

随便输入一个手机号

手机短信验证码渗透测试实战

查看响应

这里返回error=-1,这个-1表示手机号不存在,error等于其它值标准其它内容。

不更换手机号,拦截响应包

回到proxy模块,拦截响应包,我们把-1改成其它值试试

点了好多下forward,终于看到了errno=-1

我们把errno=-1改为errno=0,这里的思路就是0代表的是没有错误,验证成功,-1代表手机号不存在

不停的点forward,又出现errno=-1,再次改为0,同上

接着就看到了验证码发送成功,这是不是就说明我们可以通过修改error的值来绕过这个系统的判断了呢?,但是我们知道,我们的手机号是接不到验证码的怎么办呢?

尝试绕过验证码

其实同理,按照我们上面操作继续干就行,随便输入一个验证码,如果响应包中出现errno=-1,我们就改为0

神奇的一幕出现了,我们的手机号绕过了,验证码也成功绕过。ok点到为止,不敢瞎搞了,咱只是说说思路,也不敢真的修改!

验证码重放

所谓的验证码重放就是指服务端代码没有严格校验对于验证码发送服务的调用而导致的。这里的逻辑在于客户端点击发送验证码后,浏览器提示60s后重试,但是服务端没有校验同一用户是否在指定时间段内进行多次发送验证码请求。

遇到需要手机号获取验证码的情况,直接浏览器开代理,bp上拦截,把获取验证码的请求拦截,发送到repeater模块,进行重放,看你的手机是否能够收到多个验证码,如果可以说明存在验证码存放漏洞。

输入能接收验证码的收集

浏览器开启代理,使用bp进行抓包,拦截到发送验证的请求被即可

将请求发送到repeater模块

将请求包发送到repeater模块,我们多点几次go,看看我们的手机是否会收到相应点击数量的验证码信息,如果收到了说明存在验证码重放漏洞,否则不存在。

查看收到的信息,发现存在验证码重放漏洞

原创:小白学IT

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
地球胖头鱼
未填写
  • 作者发布文章209
  • 作者收获粉丝7
  • 作者收到点赞0
  • 所有文章被收藏了1
  • 博客总访问量排行第2
  • 博客总访问量4.6 万(每日更新)
查看所有博文