文章目录
(1)暴力破解是什么
暴力破解在ctf中是归于密码口令里的知识,暴力破解常用于破解用户名或者密码,通过脚本不断的尝试可能的密码类型。类似nmap这一类工具,爆网站的目录的时候也是通过这种逻辑,用各种常用路径的尝试暴力破解文件网站的路径的。
(2)暴力破解的一般防范方法
- 1、设计更难得验证码
- 2、后端主要不要有逻辑上的漏洞(不要将验证码以文本得形式以各种方法返回给前端,或者出现输入不同错误导致返回有什么明显不同)
- 3、php.ini设置合理且注意用完验证码之后就要被销毁
- 4、设置失败登录限制,登录失败次数太多就要被限制一段时间之后再登录
(3)前后端常见的漏洞
<0>无防护下的暴力破解
拿pikachu上的 ‘ 基于表单的暴力破解 ’ 举例
【源码分析】
打开“基于表单的暴力破解”模块鼠标右键打开菜单,点击查看源码,会发现没有设置javascript代码做验证码防护,再打开后端的bf_form.php文件,审计后端源码,如下图:
if(isset($_POST['submit']) && $_POST['username'] && $_POST['password']){
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "select * from users where username=? and password=md5(?)";
$line_pre = $link->prepare($sql);
$line_pre->bind_param('ss',$username,$password);
if($line_pre->execute()){
$line_pre->store_result();
if($line_pre->num_rows>0){
$html.= '<p> login success</p>';
} else{
$html.= '<p> username or password is not exists~</p>';
}
} else{
$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';
}
}
代码做了这么几件事
- 1、将传过来的username和pasword分别赋值给
$username
和$password
- 2、进行sql预编译(上面的函数中没有相应的
$link
代码,其实在这之前有$link=connect();
这个语句才能用prepare方法进行预编译) - 3、用bind_param方法将
$username
和$password
变量传入sql语句中(bind_param中的第一个参数是按照顺序对输入的变量做声明类型的,比如有s–string、d–double、i–integer、b–bool) - 4、后用store_result方法将执行之后的结果集转移,然后用num_rows看返回的结果集有几行,若大于零则返回’login success‘
从上面分析出代码对sql做了防范但是没有生成验证码的模块,也没有检验验证码的模块也就是说没有对暴力破解做防护。我们可以直接用burpsuite抓包之后用intruder模块进行爆破。
【操作步骤】
-
1、首先输入一个随机的账户名和密码,作者这里的密码被我用开发者工具改了一下html不然密码会是一个个实心的黑弹弹
-
2、之后在inetcpl.cpl中设置代理,用burpsuite抓包
-
3、发送到intruder模块设置attack type类型为cluster bomb将默认的变量clear,然后加入新的变量。cluster bomb类型允许给不同变量设置不同的字典,且组合字典中的各种值。(下图和intruder模块没有任何关系,截图截错了)
-
4、在Payloads模块添加爆破的字典,下面要做的就是给第一和第二个变量分别甚至字典,有自己的字典的可以用add from list处添加或者修改payload type的类型为runting list都可以打开目录导入字典。笔者因为已经直到真正的密码是什么,所以没有导入,在simple list模式下添加了几个词段意思一下。
-
5、之后点击start attack开始爆破,爆破完成之后会发现用户名为admin而密码为123456的返回长度和其它的完全不同,这就说明该结果为正确答案