浅谈短信验证码漏洞
字数 1544 2025-08-25 22:59:09
短信验证码漏洞全面分析与防御指南
一、短信轰炸漏洞
1.1 无任何限制的短信轰炸
- 漏洞描述:系统对短信发送请求无任何限制措施,攻击者可通过工具(如Burp Suite)重放数据包实现短信轰炸
- 攻击方法:直接捕获短信发送请求包进行无限重放
- 危害:消耗目标网站短信资源,骚扰手机用户
1.2 有验证码的短信轰炸
- 漏洞描述:系统添加了验证码但存在缺陷
- 攻击方法:
- 验证码可重放:同无限制轰炸
- 验证码不可重放:使用自动化工具(如Selenium)配合验证码识别技术
- 技术实现:
from selenium import webdriver from PIL import Image import requests def yanzhengma(): files = open("E:/img/t1.png", 'rb') r = requests.post('http://127.0.0.1:7779', data=files) return r.text def sendPhone(brower, ph): brower.get('https://xxx.xxx.xxx') phone = brower.find_element_by_xpath("//*[@id=\"mobile\"]") phone.send_keys(ph) # 截取验证码图片 brower.get_screenshot_as_file('E://img/t.png') im = Image.open('E://img/t.png') box = (1157, 320, 1274, 380) # 验证码位置坐标 region = im.crop(box) region.save('E:/img/t1.png') # 识别并提交验证码 yzm = yanzhengma() image = brower.find_element_by_xpath("//*[@id=\"verifyCode\"]") image.send_keys(yzm) submit = brower.find_element_by_xpath("//*[@id=\"sendSms\"]") submit.click()
1.3 特殊字符填充绕过
- 漏洞逻辑:
- 用户输入手机号
- 后端判断手机号是否在冷却期内
- 去除非数字字符后与数据库比对
- 攻击方法:在手机号前后添加空格或特殊字符(如" 11111111111"、"11111111111 ")
- 防御缺陷:未对原始输入进行规范化处理
1.4 短信发送间隔过短
- 漏洞描述:系统设置的短信发送冷却时间不足(如30秒)
- 攻击方法:
- 收集一批手机号
- 控制每个号码请求间隔略大于冷却时间
- 实现持续轰炸效果
1.5 IP限制绕过
- 漏洞类型:
- 仅限制IP发送频率
- 前端可伪造IP校验
- 攻击方法:
- 使用代理池轮换IP
- 伪造HTTP头(X-Forwarded-For、Client-Ip)
- 工具推荐:BurpSuite的FakeIP插件(https://github.com/TheKingOfDuck/BurpFakeIP/)
1.6 图片验证码可置空
- 漏洞描述:前端不传递验证码参数时后端不校验
- 攻击方法:
- 删除验证码参数(如send_code=undefined)
- 删除cookie等身份标识
- 示例URL:
https://xxx.xxx.xxx/login.php?action=send&mobile=11111111111&send_code=undefined
二、验证码可枚举漏洞
- 漏洞描述:验证码位数少(4-5位数字)且有效期长
- 攻击方法:
- 4位数字验证码:最多10,000次枚举
- 使用Burp Suite可在10分钟内完成爆破
- 危害:可破解任意用户验证码
三、手机号码篡改漏洞
- 漏洞类型:
- 验证码与手机号未绑定:
- 篡改接收验证码的手机号
- 使用验证码进行高危操作(登录、改密)
- 验证码劫持:
- 在找回密码流程中篡改请求包中的手机号
- 系统仍向原用户名关联的手机发送验证码
- 攻击者可获取验证码重置密码
- 验证码与手机号未绑定:
四、自定义验证码内容漏洞
- 案例:抖音海外版(TikTok)
- 漏洞描述:可篡改短信中的下载链接参数
- 攻击方法:
- 修改DOWNLOAD_URL参数
- 实现钓鱼攻击
- 危害:可传播恶意软件或进行诈骗
五、验证码客户端绕过
- 漏洞描述:验证结果由客户端决定
- 历史攻击方法:
- 随意输入验证码
- 拦截响应包修改状态码(如改为0)
- 现状:大厂商已基本修复此类漏洞
六、综合防御方案
1. 服务端验证
- 手机号与验证码在服务端进行唯一性绑定验证
- 禁止前端决定验证结果
2. 频率限制
- 设置合理的短信发送冷却时间(建议≥60秒)
- 对单手机号每日获取验证码次数进行限制(如≤5次/天)
- 封禁恶意请求的手机号而非IP地址
3. 验证码安全
- 使用6位及以上数字+字母组合
- 设置短有效期(如5分钟)
- 保证一次性使用(用后即失效)
4. 输入处理
- 对手机号输入进行规范化处理(去除前后空格等)
- 验证原始输入与规范化后的一致性
5. 内容控制
- 禁止用户自定义短信内容
- 对短信模板中的动态参数进行严格校验
6. 验证码增强
- 采用复合验证方式(如滑块+短信)
- 使用行为验证码替代传统图形验证码
通过实施以上防御措施,可有效防范各类短信验证码相关漏洞,保障系统安全性和用户体验。