看看后端实现逻辑:
接收前端post提交的username和password,在数据库做查询
“select * from users where username=? and password=md5(?)”,
也就是将输入的账号和md5加密后的密码跟数据库中所存在的数值进行查询。
bind_param该函数绑定了 SQL 的参数,且告诉数据库参数的值。 “ss” 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。
若查询行数大于0,则 login success!否则,则输出username or password is not exists~
进来就看到常威在打…
咳~进来就看到一个表单就这么摆在我面前,只有username和password,题目提示得很明显了,表单暴力破解!
话不多说,甘蔗!
随便输入一些账号密码,然后抓包看看是什么妖魔鬼怪
可以看到,我们很轻松得就把这个包抓到手了,我们将它丢到intruder看看(右键即可看到 send to intruder,直接发送就好了)
嘿嘿,此时我们只需要保存账号和密码部分的爆破,其他清除即可。记得暴力破解方式要选择胶束炸弹,也就是Cluster bomb,这样才可以把我们输入的payload进行交叉爆破。
接着到playsload这里,将payload1,也就是我们要暴力破解的密码字典输入,这里我用的是常用的弱口令账号
admin
administrator
root
admin123
user
master
test
testadmin
tester
guest
siteadmin
payload2用的是top1000全国弱口令,http://www.yesck.com/down/TOP1000password.txt
这部分表单的基础上加上了字母和数字结合的验证码,真的是奸诈小人,换汤不换药
来,让俺们来look look它后端的实现逻辑:
用户名、密码、验证码都不为空的前提下,加入了验证码验证机制
代码通过判断strtolower($_POST[‘vcode’]和 strtolower( $_SESSION[‘vcode’])是否相等。
验证完成后,并没有及时销毁 $_SESSION[‘vcode’],这才导致了输入一遍验证码,爆破用户名和密码就可以爆破成功。
接下来我们看看验证码是怎么实现的,验证码由后端showvcode.php文件产生,且onclick点击图片会自动刷新。
再跟进下showvcode.php,看看showvcode.php里面有些啥子东西
可知道$_SESSION[‘vcode’]=vcodex(), $_SESSION[‘vcode’]是有vcodex()函数产生赋值的。那vcodex()又是什么呢?
带着这个疑问接着往下看又发现了一个function.php,看一下里面的验证码实现
正好发现了vcodex()函数
可以知道其实验证码就是随机在小写的英文字母和数字0-9里面取六个数组成。
至此,其实思路已经很明朗了,burp重复发包,并没有刷新页面,意味着
$_SESSION[‘vcode’] 一直是第一次产生的值,则strtolower( $_POST[‘vcode’]) 和 strtolower( $_SESSION[‘vcode’])一直相等,这为爆破提供了条件。而正常的逻辑中,应该在验证完一次后就销毁( $_SESSION[‘vcode’]变量,产生一个新的 $_SESSION[‘vcode’] 。
话不多说,甘蔗!
发现即使你重复放包,只要页面不刷新或者不去点击验证码,那么验证码一直都会说初始的那个值。
那么问题就回到了原来第一题破题的思路,只要把验证码定死在那个设定的值,剩下的只需要破解账号和密码即可!
按照第一题的步骤顺下去就好了,顺利login success!
后端部分只是做了简单的表单验证,没有做任何的过滤措施,也就是第一题的判断逻辑。
那么让我们看看它在前端都写了些什么东西
可以看到,验证码是有数字和26个大写字母组成
表单提交时前端先做验证,若validate()函数返回值为true,表单才会提交。验证条件即为验证码框里填写的字符串是否和createCode()函数产生的一样。把验证机制交给前端是不安全的,输入一遍正确的验证码即可爆破用户名和密码,甚至注销掉表单提交时的验证函数等等,黑客可以轻松绕过,这为爆破提供了条件。
这个只需要输入一次正确的验证码然后抓包,然后仿造上面的步骤重新来一次爆破即可。
值得注意的是,此时的验证码不需要再改,就算你输入错误的验证码也能正常放包不会报错。
这个是token防爆破,老规矩,先来审一审源码写的到底是些啥东西
后端的实现逻辑:验证条件为 $_POST[‘token’]== $_SESSION[‘token’],我们看看这两个值是怎么产生的。
$_SESSION[‘token’]是加载页面就产生的,通过set_token()函数,这个函数将 $_SESSION[‘token’]赋值为当前的微妙时间+一个五位数的前缀。
而 $_POST[‘token’]是嵌在前端隐藏的一个input里, $_POST[‘token’]就 等 于 _POST[‘token’]就等于 $_POST[‘token’]就等于_SESSION[‘token’]。
由以上可以知道,token是一直变化的,这为爆破提供了难度,但是不管怎样,token值既然已经返回到前端,就可以得到返回的token值进行爆破。
还是跟之前的步骤一样,随便输个账号密码然后抓包。
token爆破还是比较适合运用于知道账号,爆用户的密码。
这里我们先假设它的账号是admin吧。
抓到包之后将它发送到爆破那里去,注意这里爆破方式要选择 Pitch fork
接着到option 那里将线程改一下,改成1,因为一个token对应一次爆破。
再到grep - extract那里点击add ,然后fetch response ,选中token的值,burpsuite会帮你自动补齐
在payload这里,payload1我们选择弱口令top1000就好了
payload2我们选择Recursive grep,然后下面的request填上我们前一次获取到的token,开始爆破
我们可以看到,密码已经成功爆破出来了,正是123456
黄色框框也可以分析到,每一次后面的value值都跟下一次的payloads值一样,这样才能保证我们的token对应得上不会报错
修复建议:
1.登陆错误次数过多锁定账户
2.登陆错误次数过多锁定ip
3.验证码,记得及时刷新
4.不易自动识别的验证码,比如中文汉字,移动滑块,点击字母等等