暴力破解的绕过和防范
- 爆破之不安全的验证码分析
–on client
–on server
验证码:
- 防止暴力破解
- 防止机器恶意注册
验证码的认证流程:
客户端request登陆页面,后台生成验证码:
后台使用算法生成图片,并将图片response给客户端
同时将算法生成的值全局赋值存到session中
校验验证码:客户端将认证信息和验证码一同提交
后台对提交的验证码与session里面的进行比较
客户端重新刷新页面,再次生成新的验证码:验证码算法中一般包含随机函数,所以每次刷新都会改变
演示
环境:buu中的Pikachu,burp*
随意输入一个验证码尝试,提示错误,随后根据环境输入正确验证码,则会提示用户名或者密码不存在
现在看来其实是不能对图片验证码进行暴力破解(除非你为了这个写一个深度学习,那你属实牛逼)
随后看下页面的源码,这里可以看到验证码的生成是在前端JS脚本里进行的,每次点击下就能生成一个新的验证码
代码如下
var code; //在全局 定义验证码 | |
function createCode() { | |
code = “”; | |
var codeLength = 5;//验证码的长度 | |
var checkCode = document.getElementById(“checkCode”); | |
var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,’A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’,’K’,’L’,’M’,’N’,’O’,’P’,’Q’,’R’,’S’,’T’,’U’,’V’,’W’,’X’,’Y’,’Z’);//所有候选组成验证码的字符,当然也可以用中文的 | |
for (var i = 0; i < codeLength; i++) { | |
var charIndex = Math.floor(Math.random() * 36); | |
code += selectChar[charIndex]; | |
} | |
//alert(code); | |
if (checkCode) { | |
checkCode.className = “code”; | |
checkCode.value = code; | |
} | |
} | |
function validate() { | |
var inputCode = document.querySelector(‘#bf_client .vcode’).value; | |
if (inputCode.length <= 0) { | |
alert(“请输入验证码!”); | |
return false; | |
} else if (inputCode != code) { | |
alert(“验证码输入错误!”); | |
createCode();//刷新验证码 | |
return false; | |
} | |
else { | |
return true; | |
} | |
} | |
createCode(); | |
这里就不对具体的原理进行剖析,可自行解读
随后对一次登陆请求进行抓包,查看详情
随后发送至repeater,并go
然后写一个随机的验证码提交查看返回信息
提示用户名或者密码不存在,说明其并没有在后台进行验证(这玩意对于懂原理的人没鸟用)
随后按照上一期的暴力破解直接载入字典跑就行了
- on client常见问题
- 使用前端JS实现验证码(鸟用)
- 将验证码在cookie中泄露,容易被获取
- 将验证码在前端代码中泄露,容易被获取