实验来源于:Pikachu漏洞平台教学视频
一、漏洞概述以及测试流程
暴力破解攻击:连续性尝试+字典+自动化
理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间。
判定一个网站是否存在暴力破解漏洞:
- 是否要求用户设置复杂的密码
- 是否每次认证都使用安全的验证码
- 是否对尝试登录的行为进行判断和限制
- 是否采用了双因素认证
二、基于表单的暴力破解
尝试过只输入账号或密码提示都为“username or password is not exists~”
打开Burp Suite,在用户名和密码部分,随便输入,点击提交。
打开Burp Suite,可看到刚刚输入的用户名和密码。
将这一条记录右键send to intruder
position选项卡中,选择变量,username和password。
攻击类型选择Cluster bomb
在Payloads选项卡下,选择字典
在Options选项卡下,Grep-Match添加"username or passoword is not exists"
开始攻击
显示结果:
“username or passoword is not exists"没有打勾的账号密码,表示输入这对账号密码是,系统没有提示"username or passoword is not exists”,即此为正确的账号密码。
另:正确的数据,length和其他的不一样。
输入账号密码,登录成功。
三、 验证码绕过(on client)
查看其网页源码可以发现,验证码仅仅是前端利用JS进行了一个简单的验证而没有发送到后端
输入账号密码和正确的验证码,打开Burp Suite查看
send to Repeater,将正确的验证码随意修改后点击GO进行数据重放
可以看到提示并不是验证码错误而是"username or password is not exists"
由此看出这个验证码根本没有经过后台验证,仅仅是用JS判断了一下输入的验证码与给出的是否一致。
此时可以采取与上一个实验相同的手段,send to Intruder利用字典对账号密码进行爆破。
由此可知账号密码,在网站输入正确的验证码即可成功登录。
验证码一定要通过服务端进行验证!!!
四、 验证码绕过(on server)
验证码要注意的问题:
- 是否在后台做过期处理
(即使后台验证了验证码,但由于不过期,可以一直使用) - 验证码校验不合格,逻辑出现问题
(在校验时只校验了账号密码,没有校验验证码) - 验证码的设计不够随机,具有规律太过简单
输入错误验证码或者不输入显示验证码错误或不能为空
输入正确验证码与错误的账号信息,进行抓包
send to Repeater,如上一个实验,输入错误的验证码或者不输入密码,点击GO,发现报错,验证码不能为空或者验证码输入错误
证明验证码是通过后台进行校验的,无法绕过。
接下来,看一下它的时效性,是否存在不过期的问题
先进入登录页面,得到一个正确的验证码,进入send to Repeater输入验证码,GO
返回的信息是"username or password is not exists"
继续使用该验证码,换不同的账号密码,GO
返回的信息依旧是"username or password is not exists"
说明这个验证码可以一直用
然后send to intruder,重复第一个实验的内容
附上代码:
if(isset($_POST['submit'])) {
if (empty($_POST['username'])) {
$html .= "<p class='notice'>用户名不能为空</p>";
} else {
if (empty($_POST['password'])) {
$html .= "<p class='notice'>密码不能为空</p>";
} else {
if (empty($_POST['vcode'])) {
$html .= "<p class='notice'>验证码不能为空哦!</p>";
} else {
// 验证验证码是否正确
if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {
$html .= "<p class='notice'>验证码输入错误哦!</p>";
//应该在验证完成后,销毁该$_SESSION['vcode']
}else{
$username = $_POST['username'];
$password = $_POST['password'];
$vcode = $_POST['vcode'];
$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()==1){
$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>';
}
}
}
}
}
}
解决方案是:生成验证码后,增加session保存生成的随机数,校验验证码后,一旦进入后台,不管校验成功或者失败,均需要session.removeAttribute(“变量名”)
五、问题
我有一个问题想不通:
既然验证码长期有效,为什么在网页登录时,第一次验证码错误后不能在此使用该验证码
但是在Burp Suite的重放中,也连着使用同一个验证码,改了两次账号密码,第二次的错误提示,不是验证码错误却是用户名或密码不存在呢?
在重放时不也是同一个验证码使用了两次?
在查阅资料后,我认为还是我对重放的概念不够清晰:
重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击的基本原理就是把以前窃听到的数据原封不动地重新发送给接收方。
作者:杀死程序猿
链接:https://www.jianshu.com/p/a810a6b14841
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
雪碧可乐_2020/4/18_0:40