常见验证码漏洞总结
Posted kracer127
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见验证码漏洞总结相关的知识,希望对你有一定的参考价值。
目录
0X00 介绍
验证码(CAPTCHA)作为人机区分的手段,在计算机安全领域发挥着不可小觑的作用。缺少验证码,攻击者可通过暴力破解的方式非法接管用户账户,或对网站进行任意用户注册等。设置验证码就是为了防止自动化攻击,但是如果没有设计好的话就形同虚设,所以了解验证码的原理及产生漏洞的原因有助于更加全方位的提高网站的安全指数。
验证码的机制原理:
Step1:客户端发起请求。
Step2:服务端响应并创建一个新的SessionID同时生成随机验证码。
Step3:将验证码和SessionID一并返回给客户端。
Step4:客户端提交验证码连同SessionID给服务端。
Step5:服务端验证验证码同时销毁当前会话,返回给客户端结果。
0X01 验证码分类
1.1 图片验证码
目前最常见的验证方式,通过在图片上随机产生数字、英文字母、汉字或者问题,一般有四位或者六位验证码字符。通过添加干扰线,添加噪点以及增加字符的粘连程度和旋转角度来增加机器识别的难度。但是这种传统的验证码随着OCR技术的发展,能够轻易的被破解。
1.2 手机短信验证码
通过发送验证码到用户手机进行验证是否为本人操作。大型网站尤其是购物网站,都提供有手机短信验证码功能,可以比较准确和安全地保证购物的安全性,验证用户的正确性,是最有效的验证码系统。某些验证码接入商提供手机短信验证码服务,各网站通过接口发送请求到接入商的服务器,服务器发送随机数字或字母到手机中,由接入商的服务器统一做验证码的验证。
1.3 行为式验证码
是通过用户的某种操作行为来完成验证。例如:拖动式验证码、点触式验证码和旋转式验证等。
拖动式验证码:类似于手机的滑动解锁,根据提示用鼠标将滑块拖动到指定的位置完成验证。
点触式验证码:同样根据文字提示,点击图片中与文字描述相符的内容完成验证。
旋转式验证:用户需拖动图块将图片旋转还原为正确,方可完成验证。适用于对安全要求非常高的业务场景。
1.4 语音验证码
是通过语音电话直接呼叫用户手机或固定电话播报验证码,解决短信验证码到达率及政策性问题。常用于网站、移动客户端、银行金融等用户身份验证,以及支付确认等安全性要求更高的即时服务。
1.5 视频验证码
是验证码中的新秀,视频验证码中随机数字、字母和中文组合而成的验证码动态嵌入MP4,flv等格式的视频中,增大了破解难度。验证码视频动态变换,随机响应,可以有效防范字典攻击、穷举攻击等攻击行为。
0X02 常见验证码漏洞
2.1 漏洞的形成
目前大多数的验证码漏洞形成总结起来两点,验证码生成机制或验证机制存在缺陷引发的问题。
2.2 通用设计缺陷
2.2.1 验证码无效
有验证码模块,但验证模块与业务功能没有关联性,此为无效验证,无论输入什么都判断验证码正确,形同虚设。这种情况非常少,一般在新上线的系统中或者一些小站点比较常见。
2.2.2 验证码由客户端生成、验证
验证码由客户端js生成并且仅仅在客户端用js验证,通过抓包看是否有验证码字段或者是关闭js看能否通过验证。
2.2.3 验证码有回显
验证码在html或COOKIE中显示,或输出到response headers的其他字段,可被直接查看。
2.2.4 验证码固定
也叫验证码重复使用(重用)。是指验证码没有设使用期限,在验证码首次认证成功后没有删除session中的验证码,使得该验证码可被多次成功验证,从而造成危害。
Eg:填写正确登录信息和验证码然后抓取提交数据包,重复提交该数据包,登录成功则存在验证码重复使用问题。
2.2.5 验证码可爆破
服务端未对验证时间、次数作出限制,存在爆破的可能性。简单的系统存在可以直接爆破的可能性,但做过一些防护的系统还得进行一些绕过才能进行爆破。
burpsuite对纯数字验证码爆破时间估计:
对于4位纯数字验证码:从0000~9999的10000种可能用多线程在5分钟内跑完并不是很难。
对于6位纯数字验证码:六位数的验证码1000000位,单从爆破时间上来看就比4位数的多100倍。
2.2.6 验证码可猜测
由于验证码设置比较简单,可能只有数字或字母组成,也可能是其设定范围有限,导致验证码的数量一共就那么几个,内容可以被猜测。经常出现在图片验证码问题集场景。
2.2.7 验证码可绕过
由于逻辑设计缺陷,可绕过验证,常见绕过方式如直接删除COOKIE、验证码参数为空、直接删除验证码参数可绕过和修改Response状态值等。也可根据情况组合以上绕过方式。
Eg1:CmsEasyv5.5删除COOKIE可绕过验证。
Eg2:验证码参数值为空可绕过验证。
实战案例:
抓包改返回包修改为正确的返回包覆盖错误的返回包,如下:
“code”:1,”data”:”目标用户手机号”,”msg”:”绑定成功”
① data存在isVerfi参数,尝试更改。
① 将参数改为1,code回包3,手机没收到信息,存在验证码限制。
② 将参数改为0,code回显2,绕过了验证码限制。
2.3 图片验证码
除了上述通用设计缺陷,由于图形验证码设计过于简单,可使用工具自动化识别,存在图片验证码可自动识别漏洞。
编程能力强者可利用Python Image Library、tesseract-ocr、pytesser等python第三方库,经过二值化、文字分割等操作识别验证码。
burpsuite插件推荐:
xp_captcha:https://github.com/smxiazi/NEW_xp_CAPTCHA
captcha-kiler:https://github.com/c0ny1/captcha-killer/tags
reCAPTCHA:https://github.com/bit4woo/reCAPTCHA/releases/tag/v1.0
2.4 短信验证码
很多系统的短信验证码接口存在很多逻辑问题,因此产生的危害也很多,比如任意用户注册、任意用户重置密码、短信轰炸等,还可能导致CSRF。
短信验证码漏洞常出现在注册登录、密码找回、敏感信息修改、获取等模块。
2.4.1 短信轰炸
这类漏洞存在的原因是没有对短信验证码的发送时间、用户及其IP作一些限制。
Eg:抓包后利用burpsuite的repeater功能,如果返回包response结果均返回已发送成功则证明存在此漏洞。
2.4.2 任意用户注册
没有将短信验证码与手机绑定,可以使用任意手机号进行注册。
操作步骤如下:
1. 在注册界面,输入自己的手机号;
2. 发送验证码,拿到验证码,然后退出登录界面;
3. 重新进入注册界面,输入任意人的手机号,输入刚才拿到的自己的验证码,注册成功。
2.4.3 任意用户重置密码
一般出现在密码找回模块,系统没有将发送的短信验证码与手机绑定,可通过更改手机号获取验证码进行绕过,重置和登录该用户账号密码。即A手机的验证码,B可以拿来用。
但也有情况就是,系统将发送的短信验证码与手机绑定了,但没有将该手机号和相应账号进行绑定,还是可以绕过验证码的。
0X03 修复建议
3.1 使用安全性强的验证码
短信验证码不少于6位;有效期不超过1分钟;验证码错误次数超过上限应采取账户锁定策略。
3.2 验证码不应由客户端生成或返回到客户端
3.3 系统在开发时注意验证识别后销毁session中的验证码
3.4 限制用户提交的验证码不能为空,服务端对手机/邮箱的验证码进行二次校验
以上是关于常见验证码漏洞总结的主要内容,如果未能解决你的问题,请参考以下文章