Brute Force(暴力破解)
暴力破解一般指穷举法,穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。
Low(低级)
方法一、BurpSuite暴力破解
进入DVWA将等级调为low
打开相应级别的php文件,查看用户名和密码
使用admin和password登陆,登陆成功
打开burpsuite设置手动代理
然后输入admin 随便输入一个密码(password除外),然后打开burpsuite抓包
发送到爆破模块
我们提前在桌面创建文本文档,在其中把所有怀疑的密码都写进去,这就是创建字典。
点击Load,选择我们刚开始创建的字典,点击打开
进入Options,把Number of threads调为50
要对password参数进行爆破,所以选中password参数Add $
在菜单栏点击Start Attack,开始爆破:
根据长度对比,发现一个与众不同,可推测password为正确密码,手工验证登陆成功:
方法二、手工注入
虽然这是爆破破解模块,但是因为网页防护等级较低,所以也可以sql注入
用户名使用admin'# 密码随意,即可登录
用户名使用admin 'or '1='1 密码随意,即可登录
Medium(中级)
Medium级别的代码主要增加了mysql_real_escape_string函数,这个函数会对字符串中的特殊符号(x00,n,r,,’,”,x1a)进行转义
$pass也做了MD5校验,杜绝了通过参数password进行sql注入的可能性。以上的内容我们在中级的php文件的代码中都能看到
这时手工注入的方式就被过滤掉了,我们只能采取暴力破解的方式,用Burp Suite抓包,具体的操作步骤与Low等级相同,不再赘述。
High(高级)
我们查看php文件,发现增加了user_token参数,所以爆破要选择两个参数来进行。user_token,用户令牌,每次服务器返回的登陆页面中都会包含一个随机的user_token的值,用户每次登录时都要将user_token一起提交。
所以,我们这里不仅要爆破密码,还需要爆破用户令牌user_token。同时,High级别的代码中,使用了stripslashes函数(去除字符串中的反斜线字符,如果有两个连续的反斜线,则只去掉一个)
mysql_real_escape_string对参数username、password进行过滤、转义,进一步抵御sql注入
通过分析,我们采用的方法,还是Burp Suite来进行穷举,把所有可能的结果全都试一遍。照旧抓包,此时设置两个参数 password和user_token为变量
攻击类型选择pitchfork,意思是草叉模式(Pitchfork ),它可以使用多组Payload集合,在每一个不同的Payload标志位置上(最多20个),遍历所有的Payload,举例来说,如果有两个Payload标志位置,第一个Payload值为A和B,第二个Payload值为C和D,则发起攻击时,将共发起两次攻击,第一次使用的Payload分别为A和C,第二次使用的Payload分别为B和D。
接下来进入Options中,在option选项卡中将攻击线程thread设置为1,因为Recursive_Grep模式不支持多线程攻击
选择Grep-Extract,意思是用于提取响应消息中的有用信息,在Grep - Extract模块中,点击Add,出现下图,在左上方Start after expression中,输入 value='即可,其他部分无需输入,点击Refetch response, 就会在下方的内容栏里出现若干内容,我们查看后,把value='后面的数字(即服务器返回的token,表示每次从响应中获取该值)选中,并且复制该值,因为待会还要另作他用,最后点击确定 cb56e150316ed8a6076567cb6873fd29
将Redirections设置为Always
到Payload里面。我们需要把Payload set设置为2,因为我们有两个参数需要爆破,下面的Payload type需要对两种爆破分别设置,先选择Simple list,然后在下面载入字典(这里需注意下,亲身体会出现问题,解决方法是在Payload set为1的时候载入字典,然后再改成2)
之后把Payload type调到Recursive grep,下面的Payload Options就变成了当前的Recursive grep模式了。在最下面一个文本框,把刚刚在Options中复制的那个token值复制到其中
然后点击爆破,可以找到长度不一样的值,这个就是我们要寻找的密码
将浏览器改为无代理,输入admin和password 登陆成功
当然也可以使用脚本,网上有很多类似的教程,由于未掌握语言,所以在此不做演示。
Impossible
这个级别我们无法使用暴力破解来爆破这个难度,Impossible级别的代码加入了可靠的防爆破机制,当检测到频繁的错误登录后,系统会将账户锁定,爆破也就无法继续,简而言之,在代码中我们可以看到对登录次数做了限定,这也最接近我们现实生活中的真实情况。同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入,这是因为不能使用PDO扩展本身执行任何数据库操作,而sql注入的关键就是通过破坏sql语句结构执行恶意的sql命令。