入门级别的文章,适合新手食用,大佬请忽略~(勿喷,我最近天天被喷)
=====前言=====
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写。验证码常被用于鉴别人机,本篇文章将简单的讲述验证码使用中那些不安全的机制。
=====概述=====
客户端:
1.假的验证码
2.验证码的判断在客户端完成
3.验证码输出在前端或者cookie中
服务端:
1.验证码销毁机制不当
2.使用token作为验证码
3.自动识别和其他绕过
=====浅析=====
1.假的验证码
登录界面有要求输入验证码,但是这个“验证码”直接写死在页面中,可能单纯的为了高大上一点吧~直接输入提交就好了,等于没有验证码。
2.验证码的判断在客户端完成
稍微高大上一点了,通过前端js生成验证码并在前端完成验证,这种在早期的开发中还是比较多的。只需要输入一次然后抓包就可以无限重放达到暴力破解的目的,这里的验证码都不会传到后端去的。
3.验证码输出在前端或者cookie中
验证码输出在在前端的一个被隐藏的标签中,攻击者可以读取,实现绕过。
为了避免Session占用服务器资源,验证码加密后存在cookie中,攻击者可以读取,实现绕过。
4.验证码销毁机制不当
如上图的登录页面,验证码的更新可以通过点击验证码或者刷新页面来实现。可以看到如果没有输入或者输入错误的验证码,将返回错误并不进行账户密码的验证。
当我们输入了正确的验证码后,后端开始验证账号密码的并将结果返回给客户端。
那么只要我们不刷新验证码,那么储存在服务端的验证码就不会过期,通过无限重放达到暴力破解的目的。这是因为服务端没有设置验证码的使用次数,正常的一般都是使用过一次后就销毁。
5.使用token作为验证码
这种情况很少见,开发者为了减少工作量,直接把token作为验证码来用。
token用于验证登录状态,当你登录后服务端会给你一个token,你接下来的所有的正常操作都是携带token进行的,服务端会判断你的token是否存在以及正确与否。token是有一个存活期的,也就是说你登录后过个一个小时需要重新登录,那么token的存活期就是一个小时,过期后你需要重新登录来获取一个新的token。
如上图所示,并没有要求输验证码,但是当我们请求这个页面时,服务端已经给了我们一个token存在header里面了,如上图可以通过抓包可以看到除了账号密码还提交了一个token。当token被用作于验证码时,只要在token的存活期内,就可以无限重放实现暴力破解。
6.自动识别和其他绕过
正所谓道高一尺魔高一丈,除了上述的那些极其不安全的机制外可以简单绕过外,现在的技术可以绕过很多“相对安全”的验证,比如说图像识别。还有像点击验证,滑块验证等,网上也有很多大佬出了相关教程。
=====结尾=====
话又说回来,毕竟是暴力破解,所以需要大量的请求,所以现在都会在服务端进行限制,比如说限制ip的请求次数,限制账号的验证次数等等。还有就是不只是单单的验证码,而是采用多因素验证,就像银行你除了正确输入密码,还需要插入UsbKey一样。
觉得有用的可以在右下角点个“在看”
本文始发于微信公众号(台下言书):web安全入门之浅析暴力破解中的验证码
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论