手机验证码常见漏洞总结

简介: 0X00 前言   手机验证码在web应用中得到越来越多的应用,通常在用户登陆,用户注册,密码重置等业务模块用手机验证码进行身份验证。针对手机验证码可能存在的问题,收集了一些手机验证码漏洞的案例,这里做一个归纳总结,在测试中,让自己的思路更加明确。

0X00 前言

  手机验证码在web应用中得到越来越多的应用,通常在用户登陆,用户注册,密码重置等业务模块用手机验证码进行身份验证。针对手机验证码可能存在的问题,收集了一些手机验证码漏洞的案例,这里做一个归纳总结,在测试中,让自己的思路更加明确。常见的手机验证码漏洞如下: 

1、无效验证

2、客户端验证绕过

3、短信轰炸

4、验证码爆破

5、验证码与手机号未绑定

0X01 无效验证

  有验证码模块,但验证模块与业务功能没有关联性,此为无效验证,一般在新上线的系统中比较常见。

案例一: 

  获取短信验证码后,随意输入验证码,直接输入两次密码,可成功更改用户密码,没有对短信验证码进行验证,可能导致CSRF等问题。

案例二:任意用户注册

  第一步,利用自己的手机号接收验证码进行验证,下一步跳转到一个设定密码的页面

  第二步,抓包,篡改手机号,使用任意手机号进行注册

问题剖析:业务一致性存在安全隐患,身份验证与密码修改过程分开,验证无效。

参考链接:https://woo.49.gs/static/bugs/wooyun-2016-0189300.html

        https://woo.49.gs/static/bugs/wooyun-2013-026652.html

0X02 客户端验证绕过 

  客户端验证是不安全的,可能导致任意账号注册、登录及重置任意用户密码等一系列问题。

案例一:直接返回明文验证码

  点击获取收集验证码,监听到两条json数据,可以发现验证码就藏在ticket里面,输入9360即可登陆成功。

案例二:返回密文验证码

  验证加密后返回客户端,用户解密即可获取验证码。

 

案例三:拦截替换返回包

  第一步,使用正常账号修改密码,获取验证码通过时服务器返回数据,保存该信息

  第二步,使用fiddler下断,之后点击确定,服务器会返回验证码错误之类的信息,使用{"MessageHeader":{"MessageID":"RSP036","ErrorCode":"S000","Description":"成功!"}}此信息进行替换后再执行,密码修改成功。

问题剖析:常见于APP等客户端软件,通过拦截替换返回信息,绕过客户端本地验证。

参考链接:吉祥航空可以绕过手机验证码修改任意账号密码 

      http://cb.drops.wiki/bugs/wooyun-2015-0104509.html

0X03 短信轰炸

  短信轰炸是手机验证码漏洞中最常见的一种漏洞类型。

  在测试的过程中,对短信验证码接口进行重放,导致大量发送恶意短信。

案例一:无限制,任意下发

案例二:有一定时间间隔,无限下发

  每隔60秒可下发一条短信,无限下发,短信轰炸。在测试过程中,可通过编写Python脚本来计算短信下发时间间隔,实现短信轰炸。

 

#coding=utf-8
import json
import requests
import time
start_time = time.time()
count =input("Please input counts:")
phone =raw_input("Please inut your phone:")
i=0
while (i<count):
    url= "http://xxxx.cn:9092/map/GenerationUpdate"
    data=json.dumps({"headerInfo": { "functionCode": "randomcode4G"},"requestContent":{"phoneNumber":phone}})

    header = { 'User-Agent' : 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1''Host': 'xxxx.com:9092',
        }  
    r = requests.post(url, data=data,headers=header,timeout=5)
    result=r.content
    if result.count('serviceCode":0'):
        print 'Sending message : %d seconds ' % (time.time()-start_time)
    i=i+1
    #print 'send %s time'%(i)

0X04 验证码爆破 

  短信验证码一般由4位或6位数字组成,若服务端未对验证时间、次数进行限制,则存在被爆破的可能。

  输入手机号获取验证码,输入任意短信验证码,发起请求,抓包,将短信验证码字段设置成payloads取值范围为000000-999999进行暴力破解,根据返回响应包长度判断是否爆破成功。

0X05 验证码与手机号未绑定

  一般来说短信验证码仅能使用一次,验证码和手机号未绑定,验证码一段时期内有效,那么就可能出现如下情况:

  1、A手机的验证码,B可以拿来用

  2、A手机在一定时间间隔内接到两个验证码,都可以用。(该问题可能为产品策略设定,参考链接:https://woo.49.gs/static/bugs/wooyun-2012-08679.html)

  检测接收验证码的手机号和绑定的手机号是否一致。

案例一:任意用户密码重置

  1.使用自己手机号收取验证码

  2.自己的验证码和对方的手机号填上,下一步城管设置新密码

 

 

 参考链接:

https://woo.49.gs/static/bugs/wooyun-2014-080315.html

https://woo.49.gs/static/bugs/wooyun-2012-013836.html

 

解决方案:

  1.在服务器进行有效验证,手机号和验证码在服务器进行唯一性绑定验证。

  2.在服务端限制验证码发送周期,设置时效,限制次数。

 

​ 关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。

 

 

 

目录
相关文章
|
4月前
|
存储 JSON JavaScript
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-1
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
132 0
|
4月前
|
网络协议 JavaScript 前端开发
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名2
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名
1392 0
|
SQL Java
如何使用阿里云短信服务实现登录页面,手机验证码登录?1
如何使用阿里云短信服务实现登录页面,手机验证码登录?
351 0
|
29天前
|
JavaScript NoSQL Redis
Vue中实现修改邮箱、手机号等流程的大致过程、验证码由后端的redis生成验证(版本1.0)
这篇文章记录了在Vue中实现修改手机号和邮箱的大致流程,包括使用过滤器部分隐藏展示的手机号和邮箱,以及通过点击触发路由跳转的便捷方式。文章还描述了旧号码和新号码验证的界面实现,其中验证码由后端生成并通过弹窗展示给用户,未来可以接入真正的手机验证码接口。此外,还提供了修改邮箱的页面效果截图,并强调了学习是一个永无止境的过程。
Vue中实现修改邮箱、手机号等流程的大致过程、验证码由后端的redis生成验证(版本1.0)
|
3月前
|
存储 小程序 前端开发
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
251 0
|
30天前
|
存储 NoSQL Java
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
该博客文章展示了如何在Linux虚拟机上使用Redis和Jedis客户端实现手机验证码的验证功能,包括验证码的生成、存储、验证以及限制每天发送次数的逻辑,并提供了测试结果截图。
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
|
19天前
|
存储 监控 开发工具
Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
22 0
|
20天前
【Azure 环境】中国区Azure B2C 是否支持手机验证码登录呢?
【Azure 环境】中国区Azure B2C 是否支持手机验证码登录呢?
|
4月前
|
网络协议 JavaScript 前端开发
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名1
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名
349 0
|
3月前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
89 5