验证码渗透总结
[TOC]
本文涉及内容在我的《任意用户登录漏洞挖掘思路》文章中的验证码部分有所提及,为避免重复造轮子,请同步学习
验证码通用测试思路
关于验证码渗透,这里先放一幅总览图,如下
市面上的验证码基本分为图形验证码、短信验证码这两类,当然,通过验证方式再细分,比如识别点击图案、滑块拼图、旋转使图形满足正确方向的验证码。这里先讲讲通用的验证码测试思路。
验证流程不当信息泄露
这属于逻辑漏洞的一种。有些网站在验证用户提交的表单时,并没有首先进行验证码校验,而是先校验用户id是否存在,若不存在返回类似“用户名不存在”的提示信息(而不是先返回“验证码正确/失败”等信息)。此时,可随意填写验证码,来批量遍历出系统中已注册的用户名列表。
测试手法:比如遇到一个有验证码的登录站点,可以账密都随便输,先填写错误的验证码尝试登录,再填写正确的验证码尝试登录,查看账密输入逻辑是不是在验证码输入逻辑的前面,如果是的话就很可能存在这个问题
验证码刷新配置不当
有些网站的验证码接口仅当用户请求验证码生成接口时才会动态刷新。攻击者可以通过Burp抓包的方法,使用drop阻断请求验证码生成接口的请求,使用固定验证码进行批量破解
这种场景还是比较多的
常见场景:遇到一个有验证码的登录站点,随便输入账密。验证码先正常输入,点击登录,如果在当前页面提示账密错误,并且更新了验证码,而不是直接刷新当前页面,这种就很可能会有这个漏洞。
这里说一下上面这个场景,服务器后端的处理逻辑:
- 服务器判断了账密错误
- 前端弹出或者打印一个提示信息,如“账密错误”
- 然后给密码输入栏置空
- 再请求验证码刷新接口,来更新验证码【如果此时丢弃请求验证码的请求,那验证码就不会变,就可以使用固定验证码进行批量破解】
验证码旧接口兼容问题
有些网站之前的登录验证接口是没有验证码的,而后面由于功能需求增加了验证码验证功能。但为了兼容旧按口,就判断用户提交表单是否提交了某一个参数(参数名如verifycode),如果没有提交则不进行验证码检验。
这种场景下,只需要通过BupSuitc修改请求包,将参数去掉即可实现绕过。
用户登录次数绕过
一些对用户体验有要求的网站,在登录接口设计时,会首先不弹出验证码。此时,用户登录不需要输入验证码,而当用户登录失败超过3次以后,则强制要求用户填写验证码。但是,有一些网站判断用户登录失败次数,采用Session计数的方式,当用户登录失败超过3次时,攻击者可以清空自己的cookie,要求服务器下发新的Session以继续登录,此时,仍然是不需要填写验证码的。因此,可以通过自动化工具尝试登录,每次请求都要求服务器生成新的Session,使得错误次数永远为1,则绕过了验证码机制。
图形验证码
图形验证码长宽可控
简单测试方法,就是看到一个登录框,然后打开图片链接,在图片链接中就有机会看到两个参数值。比如,一个是 width,一个是 length。这两个参数是计算图片验证码的长宽,如果长宽过高就会过度消耗的是服务器的 CPU 资源,这种情况就会造成DDOS漏洞
图形验证码的生成大多都基于复杂的图像生成算法,本来就很消耗CPU、GPU性能,此时攻击者再把尺寸增大,就会成倍消耗性能,如果大到一定程度再结合高并发,服务器很有可能瞬间崩溃,也就造成了Dos攻击。
这种漏洞之前在我的《DDoS漏洞挖掘》文章中提到过,需要更详细的测试方法请移步
图形验证码可绕过
有时候开发,会写两套图形验证码流程,一套是在生产运行阶段必须使用正确验证码才能通过服务器校验。另外一套是在测试环境下,把验证码设置为 null 或者是 留空 都可以登录验证码置为空,提高开发工作效率。还有的时候,将验证码修改为 true 就好了。这个是因为开发在进行图形验证码判断的时候,只要是验证码收到的是 true 就会通过
图形验证码可识别
这个就是开发在制作图形验证码功能的时候,没有在图形验证码中加入足够多的噪点,使验证码能够被现有的工具进行识别。一般用于登录应用程序内进行渗透测试,或者是项目报告凑数用的,基本上的SRC都不收。
验证码可识别属于验证码爆破的一种,详细可移步我的《任意用户登录漏洞挖掘思路》
图形验证码随机值可控
图形验证码是后端随机生成的,如果这个参数暴露,就可以控制验证码的值
为什么图形验证码明明是图片,内容却可以编辑?有种格式叫作SVG的矢量图,是一种用于描述二维矢量图形的XML标记语言,SVG图像存储的是图形元素和属性的定义,而不是像素点的颜色信息(区别于位图),所以只要修改用于SVG中显示的变量的值,就可以编辑SVG图的内容。
比如下图中的characters参数,它就是用控制SVG中显示的值的变量,暴露在了url中
修改characters参数的值为aaaa,可以看到图形验证码变为aaaa
图形验证码返回到前端
在响应包中返回了下次图形验证码的内容
短信验证码
短信轰炸
又称短信炸弹,可以分为横向和纵向,如下:
- 横向短信轰炸:一个手机号接收到多条短信
- 纵向短信轰炸:多个手机接收到同一条短信
测试方法同样在我的《任意用户登录漏洞挖掘思路》提及,请移步
短信验证码可爆破
如果验证码被爆破成功的话,在 SRC 里面通常是按照高危处理
测试方法同样在我的《任意用户登录漏洞挖掘思路》提及,请移步
短信验证码内容可编辑
一些短信验证码的接口是从请求包中某一参数获取短信验证码内容的,那么我们就可以在请求包中编辑短信的内容
更多验证码渗透技巧
下面这些验证码渗透技巧在我的《任意用户登录漏洞挖掘思路》文章中的验证码部分有所提及
- 验证码明文返回
- 存在万能验证码
- 验证码未绑定用户
- 获取验证码的手机号字段可双写
- 验证码为空/任意验证码可成功验证