浅谈短信验证码漏洞
字数 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 特殊字符填充绕过

  • 漏洞逻辑
    1. 用户输入手机号
    2. 后端判断手机号是否在冷却期内
    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等身份标识
  • 示例URLhttps://xxx.xxx.xxx/login.php?action=send&mobile=11111111111&send_code=undefined

二、验证码可枚举漏洞

  • 漏洞描述:验证码位数少(4-5位数字)且有效期长
  • 攻击方法
    • 4位数字验证码:最多10,000次枚举
    • 使用Burp Suite可在10分钟内完成爆破
  • 危害:可破解任意用户验证码

三、手机号码篡改漏洞

  • 漏洞类型
    1. 验证码与手机号未绑定
      • 篡改接收验证码的手机号
      • 使用验证码进行高危操作(登录、改密)
    2. 验证码劫持
      • 在找回密码流程中篡改请求包中的手机号
      • 系统仍向原用户名关联的手机发送验证码
      • 攻击者可获取验证码重置密码

四、自定义验证码内容漏洞

  • 案例:抖音海外版(TikTok)
  • 漏洞描述:可篡改短信中的下载链接参数
  • 攻击方法
    • 修改DOWNLOAD_URL参数
    • 实现钓鱼攻击
  • 危害:可传播恶意软件或进行诈骗

五、验证码客户端绕过

  • 漏洞描述:验证结果由客户端决定
  • 历史攻击方法
    • 随意输入验证码
    • 拦截响应包修改状态码(如改为0)
  • 现状:大厂商已基本修复此类漏洞

六、综合防御方案

1. 服务端验证

  • 手机号与验证码在服务端进行唯一性绑定验证
  • 禁止前端决定验证结果

2. 频率限制

  • 设置合理的短信发送冷却时间(建议≥60秒)
  • 对单手机号每日获取验证码次数进行限制(如≤5次/天)
  • 封禁恶意请求的手机号而非IP地址

3. 验证码安全

  • 使用6位及以上数字+字母组合
  • 设置短有效期(如5分钟)
  • 保证一次性使用(用后即失效)

4. 输入处理

  • 对手机号输入进行规范化处理(去除前后空格等)
  • 验证原始输入与规范化后的一致性

5. 内容控制

  • 禁止用户自定义短信内容
  • 对短信模板中的动态参数进行严格校验

6. 验证码增强

  • 采用复合验证方式(如滑块+短信)
  • 使用行为验证码替代传统图形验证码

通过实施以上防御措施,可有效防范各类短信验证码相关漏洞,保障系统安全性和用户体验。

短信验证码漏洞全面分析与防御指南 一、短信轰炸漏洞 1.1 无任何限制的短信轰炸 漏洞描述 :系统对短信发送请求无任何限制措施,攻击者可通过工具(如Burp Suite)重放数据包实现短信轰炸 攻击方法 :直接捕获短信发送请求包进行无限重放 危害 :消耗目标网站短信资源,骚扰手机用户 1.2 有验证码的短信轰炸 漏洞描述 :系统添加了验证码但存在缺陷 攻击方法 : 验证码可重放:同无限制轰炸 验证码不可重放:使用自动化工具(如Selenium)配合验证码识别技术 技术实现 : 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. 验证码增强 采用复合验证方式(如滑块+短信) 使用行为验证码替代传统图形验证码 通过实施以上防御措施,可有效防范各类短信验证码相关漏洞,保障系统安全性和用户体验。