banner
lca

lca

真正的不自由,是在自己的心中设下牢笼。

验证码模块常见的一些漏洞

验证码突破#

验证码主要用在登陆表单中进行登陆验证,防止表单被暴力破解。如果验证码模块设置不当,如客户端验证、服务端验证码不过期等,验证码就形同虚设。

一般有如下集中验证码分类:

  • 图形验证码
  • 短信验证码
  • 邮件验证码
  • 滑动验证码
  • 语音验证码

短信验证码#

验证码暴力破解#

现在的短信验证码大多都是 6 位数的验证码,6 位数的验证码不容易爆破,但是如果遇到 4 位数的验证码且失效时间和验证码未限制发送次数的情况下,那么就可以尝试爆破。

4 位数的验证码只需爆破 10000 次,次数算少的了,0000~9999 区间。

案例 1: 任意用户注册

攻击者填写任意手机号进行注册,服务器向攻击者填写的手机号发送短信验证码,此案例的验证码是 4 位数,设置验证码的范围为 0000~9999 区间,对验证码进行暴力破解,成功获取到验证码后,就自动注册了账号。

image

通过返回的数据包可以判定是否破解成功。

image

如上图所示,通过返回值的长度可以判定响应大小为 49 的是正确的验证码。

修复建议:

针对验证码的暴力测试,建议采取如下的加固方案:

(1)设置验证码的失效时间,建议为 180 秒;
(2)限制单位时间内验证码的失败尝试次数,如 5 分钟内连续失败 5 次即锁定该账号 15 分钟

验证码绕过测试#

漏洞原理:

在一些案例中,通过修改前端提交服务器返回的数据(例如:res_code 等字段),可以实现绕过验证码,执行我们的请求。

测试流程:

攻击者进入注册账户页面,输入任意手机号码,获取验证码,在注册账户页面填写任意验证码,提交请求并抓包,使用抓包工具查看并修改返回包信息, 转发返回数据包,查看是否注册成功。

image

修改响应包

image

修复建议:

针对此漏洞,建议在服务端增加验证码的认证机制,对客户端提交的验证码进行二次校验。

验证码重复使用#

漏洞原理:

在网站的登录或评论等页面,如果验证码认证成功后没有将 session 及时清空,将会导致验证码首次认证成功之后可重复使用。测试时可以抓取携带验证码的数据包重复提交,查看是否提交成功。

测试流程:

攻击者正常流程注册账号,输入页面验证码,抓取提交的数据包,使用发包工具对数据包中的用户名字段修改后进行重复提交,然后查看是否成功注册多个账号。

修复建议:

针对验证认证次数问题,建议验证码在一次认证成功后,服务端清空认证成功的 session,这样就可以有效防止验证码一次认证反复使用的问题。

验证码 GET 传输泄露#

可以看到,验证码就在 get 包中,直接就能获取到验证码, 这样一来,即使无须有的手机号依然可以注册,直接把验证码输入

image

短信轰炸#

漏洞原理:

短信发送模块处,未对短信的发送次数进行限制,导致可无限制发送短信验证码。

测试流程:

攻击者在短信发送处填写手机号,点击发送验证码,抓包,重复发包尝试是否可以多次接到短信验证码,如果 1s 中可以接收到多次验证码,说明存在短信轰炸漏洞。

一些绕过方法:

1、利用空格绕过

2、修改 cookie 值绕过

3、ip 绕过

4、修改返回值绕过

5、不同账户发送短信绕过

image

image

图片验证码#

验证码绕过 (on client)#

js 前端验证

image

禁用 javascript

浏览器 F12 - 设置 - 停用 JavaScript

image

image

来到登陆框

image

burp 抓包

image

intruder 爆破成功

image

验证码绕过(on server)#

image

image

同一个验证码发送多次不过期,可爆破,成功登陆

image

图片验证码自动识别测试#

下载 captcha-killer-modified#

captcha-killer的修改版,支持关键词识别base64编码的图片,添加免费ocr库,用于验证码爆破,适配新版Burpsuite

Releases处下载 jar 文件

image

burpsuite 加载此 jar 文件

然后下载 captcha-killer-modified 源码仓库,需要用到 codereg.py 文件,这个文件是用来开启验证码识别模块的,前提需要安装 dddddocr 库。

image

git clone https://github.com/f0ng/captcha-killer-modified.git

安装 ddddocr 库#

仓库地址:https://github.com/sml2h3/ddddocr

注:我的环境是 mac m1 pro

# brew安装onnxruntime
brew install onnxruntime
pip3 install ddddocr # python3.9安装运行codereg.py报错

使用 python3.10 安装 aiohttp

pip310 install aiohttp -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com

运行python310 codereg.py

报错:TypeError: The port is required to be int.

解决报错:

将脚本中default="8888"更改为default=8888再次运行即可

重新运行python310 codereg.py,正常

image

实战案例 1#

靶场是用 pikachu 的靶场

1、burp 请求验证码 url

image

请求验证码 URL,点击获取,可以获取右侧的验证码

image

上图中左侧的请求内容可以先抓个登陆框的包,然后修改 post 中的 url 为验证码的 url,下图中发送到 captcha-killer-modified 插件。

image

其他案例,关键字提取

image

2、设置 ddddocr 接口 url

设置请求模版,Request template

POST /reg HTTP/1.1
Host: 127.0.0.1:8888
Authorization:Basic f0ngauth
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 8332

<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>

接口地址设置为:http://127.0.0.1:8888,codereg.py 启动的服务

设置如下:

image

此时 captcha-killer-modified 面板的内容如下,精准识别了验证码

image

3、开始 intruder 爆破

  • 设置 attack type 为 pitchfork
  • 爆破密码字段和 vcode 验证码字段

image

设置密码处的 payload

image

设置验证码的 payload

image

最终识别率,这里用的靶场验证码比较复杂。

image

codereg.py 的输出

image

参考#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。