手机号验证码&图片验证码漏洞利用总结
字数 3520 2025-10-18 11:17:50
手机与图片验证码安全漏洞详解与利用教学
文档说明
本文档基于安全研究者的实战经验总结,系统性地阐述了在Web应用程序渗透测试中,手机短信验证码和图片验证码常见的逻辑漏洞、利用方法及潜在危害。旨在用于安全学习、授权测试及开发者安全自查。
第一章:手机号验证码漏洞
1.1 漏洞类型一:短信轰炸漏洞
- 漏洞原理: 利用接口设计缺陷,在无需或绕过频率限制的情况下,向同一手机号在短时间内发送大量短信,造成骚扰与资源损耗。
- 利用方法:
- 并发请求: 使用Burp Suite的
Turbo Intruder或类似并发插件,对发送短信的请求进行高并发攻击。 - 重放攻击: 使用Burp Suite的
Repeater模块,无限次重放单个发送短信的数据包。
- 并发请求: 使用Burp Suite的
- 实战技巧:
- 如果
Repeater重放成功,其危害评级通常高于并发攻击,应优先提交。 - 在厂商修复后(例如增加了频率限制),可再次尝试并发攻击,验证修复是否彻底,可能发现新的绕过机会。
- 如果
- 常见绕过思路:
- 参数污染: 在手机号参数值前后添加空格(如
phone= 182xxxxxxx)。 - 格式变异: 在手机号前添加
86或+86(如phone=86182xxxxxxx)。
- 参数污染: 在手机号参数值前后添加空格(如
- 危害评级: 通常为低危。但若能持续对单号码造成轰炸,影响恶劣,评级可能提升。
- 注: “横向轰炸”(向大量不同手机号各发一条短信)因危害分散,大部分安全平台不予收录。
1.2 漏洞类型二:验证码返回前端
- 漏洞原理: 短信验证码明文出现在客户端HTTP响应包中(如JSON返回值、HTML源码或Header头)。
- 利用方法:
- 拦截发送验证码的请求。
- 观察其响应包,直接查找验证码字段(如
code,verifyCode,smsCode)。 - 获取验证码后,可直接用于注册、登录等流程。
- 危害评级: 高危。此漏洞使得验证码形同虚设,直接导致身份验证机制被绕过。
1.3 漏洞类型三:手机号验证码“双发”漏洞
- 漏洞原理: 服务端在处理请求时,因参数解析逻辑错误,同时向请求中指定的攻击者手机号和受害者手机号发送了相同的验证码。
- 利用方法:
- 拦截登录或注册时发送验证码的请求。
- 修改手机号参数,尝试以下Payload之一:
- 参数值拼接:
phone=182AAAAAAA,166BBBBBBB(攻击者手机号在前,受害者在后)。 - 参数污染:
phone=182AAAAAAA&phone=166BBBBBBB。
- 参数值拼接:
- 观察两部手机,均收到相同验证码。攻击者即可用自己收到的验证码登录受害者账号。
- 实战技巧:
- 该漏洞通常在系统的多个功能点(登录、注册、绑定手机)同时存在。
- 优先提交登录口的“双发”漏洞,因为“任意用户登录”的危害远大于“任意用户注册”。
- 扩展利用: 邮件验证功能也可能存在类似的“双发”逻辑漏洞。
- 危害评级: 高危或中危(取决于可操控的账号权限)。
1.4 漏洞类型四:短信内容篡改
- 漏洞原理: 发送短信的请求参数中,包含了验证码值或短信正文内容,且该参数值客户端可控。
- 利用方法:
- 拦截发送短信的请求。
- 寻找可能控制短信内容的参数,如:
code=123456: 直接控制验证码的值。message=【XX系统】您的验证码是:123456: 直接控制整个短信模板。
- 修改参数值为任意内容并发送。
- 潜在危害: 极高危。攻击者可冒充官方发送钓鱼链接、诈骗信息、黄赌毒内容,对平台信誉和用户安全造成毁灭性打击。
1.5 漏洞类型五:验证码可爆破
- 漏洞原理: 验证码复杂度(长度、字符集)不足,且服务端未在验证失败后使验证码失效,或未启用账号锁定机制。
- 利用方法:
- 使用Burp Suite的
Intruder模块。 - 对验证码参数进行暴力破解。
- 4位纯数字: 攻击载荷范围为0000-9999,共10000次请求。
- 6位纯数字: 攻击载荷范围为000000-999999,共100万次请求。
- 使用Burp Suite的
- 实战技巧:
- 4位验证码爆破在SRC和渗透测试中普遍被认可。
- 6位验证码爆破因请求次数多、耗时长,仅部分SRC收取,在项目测试中需根据实际情况判断是否提交。
1.6 漏洞类型六:默认/万能验证码
- 漏洞原理: 系统存在一个固定的“万能验证码”(如000000、123456、999999)或测试用的默认验证码,输入任何手机号配合此码均可验证成功。
- 利用方法:
- 正常流程获取验证码并尝试登录。
- 在爆破或测试过程中,发现除真实收到的验证码外,另一个固定码也能成功。
- 使用任意手机号配合该万能验证码进行登录验证。
- 危害评级: 高危。此漏洞是严重的后台配置错误。
第二章:图片验证码漏洞
2.1 漏洞类型一:验证码复用
- 漏洞原理: 服务器在校验时,只判断用户输入的验证码与当前会话中保存的验证码是否一致,但未在首次校验后(无论成功与否)立即销毁会话中的验证码,导致一次正确的验证码可被多次使用。
- 利用方法:
- 输入正确的账号、密码和验证码,拦截登录请求。
- 将该请求在
Repeater中重放。 - 观察响应:如果只返回“密码错误”而非“验证码错误”,则说明验证码已被复用。
- 此时,保持验证码参数不变,对密码进行爆破,验证码的防爆破功能已失效。
- 危害评级: 中危。主要危害是绕过了验证码的防爆破设计。
2.2 漏洞类型二:验证码置空/删除参数绕过
- 漏洞原理: 服务端校验逻辑不严谨。
- 置空绕过: 服务器未处理空值情况,当验证码参数为空(如
code=)时,校验逻辑被绕过。 - 删除参数绕过: 直接删除整个验证码参数(如将
user=admin&pass=123&code=abcd改为user=admin&pass=123),服务器因找不到参数而跳过校验。
- 置空绕过: 服务器未处理空值情况,当验证码参数为空(如
- 利用方法:
- 拦截携带验证码的请求。
- 尝试将验证码参数的值设为空。
- 如果失败,尝试直接删除整个验证码参数名和值。
- 若请求成功通过验证步骤,则存在漏洞。
- 危害评级: 中危。同样导致验证码防爆破功能失效。
2.3 漏洞类型三:前端验证
- 漏洞原理: 验证码的校验逻辑完全在浏览器端通过JavaScript完成,校验通过后才将账号密码等核心数据发送到服务器。服务器端没有二次校验。
- 利用方法:
- 输入账号、密码和错误验证码,抓包。
- 观察数据包中是否包含验证码参数。
- 如果请求包中只有账号密码,没有验证码相关参数,则极可能是前端验证。
- 直接构造账号密码的请求包发给服务器,即可绕过验证码。
- 危害评级: 中危。这是非常低级的错误。
2.4 漏洞类型四:验证码拒绝服务漏洞
- 漏洞原理: 生成验证码图片的接口,其参数(如宽度
width和高度height)客户端可控且未做合理限制。攻击者通过传入极大值,消耗服务器大量资源(CPU、内存)来生成一张巨大的图片,从而导致服务响应缓慢甚至崩溃。 - 利用方法:
- 找到生成验证码图片的URL(通常在页面Img标签的src属性中)。
- 右键在新标签页打开该链接,并拦截请求。
- 修改
width和height参数为极大值(如999999)。 - 重放请求,观察服务器响应时间和返回数据大小。如果响应时间显著变长,返回的图片数据量巨大,则存在漏洞。
- 重要提醒: 测试此漏洞务必谨慎,属于“点到为止”型测试,切勿持续攻击导致业务瘫痪。
- 危害评级: 中危或低危(取决于对业务的影响程度)。
总结与建议
对于渗透测试者/SRC白帽子:
- 按照漏洞危害优先级进行测试:优先关注“验证码返回”、“双发漏洞”、“内容篡改”等高危漏洞。
- 善用Burp Suite的各个模块(Scanner, Repeater, Intruder, Turbo Intruder)进行自动化辅助测试。
- 注意漏洞的关联性,一个功能点的漏洞可能存在于整个系统的类似功能中。
对于开发者:
- 后端校验: 所有验证码的生成、发送、校验逻辑必须在服务器端完成。
- 一次性生效: 验证码无论验证成功与否,使用后应立即在服务端会话中作废。
- 频率限制: 对单IP、单手机号、单账号的验证码请求频率做严格限制。
- 强弱隔离: 验证码生成与校验的环节应分离,避免逻辑耦合导致漏洞。
- 输入校验: 对客户端传入的所有参数(如手机号、图片尺寸)进行合法性校验和范围限制。
- 避免硬编码: 严禁使用万能验证码或测试码上线生产环境。
文档生成基于公开技术总结,仅用于安全教学与研究。在实际测试中,请务必确保获得相关系统的正式授权,并遵守《网络安全法》等法律法规。