暴力破解之验证码
验证码用来做什么?
- 登录暴力破解
- 防止机器恶意注册
验证码的认证流程
- 客户端request登录页面,后台生成验证码
- 后台使用算法生成图片,并将图片response给客户端;
- 同时将算法生成的值全局赋值存到SESSION中;
- 校验验证码
- 客户端将认证信息和验证码一同提交;
- 后台对提交的验证码与SESSION里面的进行比较;
- 客户端重新刷新页面,再次生成新验证码
- 验证码算法中一般包含随机函数,所以每次刷新都不一样。
验证码绕过-on client
常见问题
- 使用前端js实现验证码;
- 将验证码在cookie中泄露,容易被获取;
- 将验证码在前端源代码中泄露,容易被获取;
实验演示
随便输入账号不输入验证码
输入一个错误的验证码
查看页面源代码,可以发现,验证码的随机获取是由前端的JavaScript所控制
输入正确的验证码后,打开burpsuite,选中http,将其发送到Repeater中
可以在Repeater中修改内容来观察
![在这里插入图片描述](https://img-blog.csdnimg.cn/8b5e707ee17a4092976440a841fc049e.p
输入正确的用户名,密码,随便输入一个验证码,观察Response,可以看到登录成功。说明登录的成功与否,与验证码没有关系。
将http发送到intruder中去,进行暴力破解,验证码无法破解,只对用户名和密码进行攻击
观察长度可知,由两组正确的用户名和密码,查看Response显示登录成功。
验证码绕过-on server
常见问题
- 验证码在后台不过期,导致可以长期被使用
- 验证码校验不严格,逻辑出现问题
- 证码设计的太过简单和有规律,容易被猜解
实验演示
先抓一次包,发送到Repeater中
然后刷新验证码
记住前端的验证码,打开burpsuite
输入在页面显示的验证码
然后更改用户名和密码,不更改验证码。
此处验证码得到了第二次使用,说明验证码可以长期使用。
暴力破解防范措施
- 设计安全的验证码(安全的流程+复杂而有可用的图形);
- 对认证错误的提交进行计数并给出限制,比如连续5次密码错误,锁定2消失;
- 必要的情况下,使用双因素认证;
token对放暴力破解的意义
一个简单的token的实例
//生成一个token,以当前微妙时间+一个5位的前缀
function set_token(){
if(isset($_SESSION['token'])){
unset($_SESSION['token']);
}
$_SESSION['token']=str.replace('.','',uniqid(mt_rand (10000,99999),true));
}
一般的做法:
- 将token以“type= ‘hidden’ " 的形式输出在表单中;
- 在提交的认证的时候一起提交,并在后台对其进行校验;
但是,由于淇token值输出在前端源码中,容易被获取,因此也就失去了防暴力破解的意义。一般Token在防止CSRF上会有比较好的功效。