pikachu 暴力破解
pikachu靶场
环境:phpstudy(MySQL5.7.26+Apache2.4.39)+pikachu靶场
暴力破解
基于表单的暴力破解
- 填写账号密码,submit时抓包
- send to intruder之后设置爆破字典
-
跑出可以使用的账号和密码,登录成功
其实上面一张图已经可以看到密码了
数据包Length与其他不同
验证码绕过(on server)
- 尝试使用之前破解出来的账号密码并且不提交验证码,显示验证码为空,而且在抓包的时候不小心看到了hint
-
显示账号不变,那就继续使用之前的admin/123456,抓包会POST一段形如
username=admin&password=123456&vcode=1234&submit=Login
的代码 -
将上面代码中vcode内容按照验证码内容改写后send,Response中找不到关于验证码的内容,搜索后发现login success
-
正常做法应该是再去intruder进行一次爆破
得出结论是有验证码可以抵御部分爆破,但是验证码需要有时效性,登录不成功需要及时更换(现在正常网站登录不成功都会自动更换)
●验证码在后台不过期,导致可以长期被使用;
●验证码校验不严格,逻辑出现问题;
●验证码设计的太过简单和有规律,容易被猜解在跟着老师学长做的渗透测试中,验证码太容易/重复/可以被OCR识别也可以被算成是漏洞
验证码(on client)
看到一个十分简陋的框,直接抓包看response
看到一段前端代码
<script language="javascript" type="text/javascript">
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();
</script>
用chatgpt给它来一段注释
这段代码实现了一个验证码的功能。它定义了一个全局变量 code,表示验证码的值。然后定义了一个 createCode 函数,用于生成验证码。在这个函数中,定义了一个变量 codeLength,表示验证码的长度。然后定义了一个数组 selectChar,表示所有可能用来组成验证码的字符。
接下来,使用 for 循环,随机选择 selectChar 数组中的字符,并拼接到 code 变量中。最后,将生成的验证码值赋值给 checkCode 元素的 value 属性。
另外还定义了一个 validate 函数,用于验证用户输入的验证码是否正确。如果用户没有输入验证码,则提示用户输入验证码;如果用户输入的验证码不正确,则提示错误并刷新验证码。
最后,在页面加载完毕后,调用 createCode 函数,生成一个新的验证码。
但是验证码完全是前端random出来的,意味着与服务器并没有交互并进行确定,验证码并没有验证作用
token防爆破
token了解下,后面搞CSRF会用到....虽然这里并没有什么鸟用.
依旧抓包,POST的内容为username=admin&password=1111&token=5167863aaab5a2ce73894292892&submit=Login
可以看到中间新增了一段token
因为admin账号存在,固定账号为admin,intruder中设置变量为password
和token
使用admin/123456登录成功