DVWA---全级别Brute Force
Brute Force
黑客利用密码字典,使用穷举法猜解出用户口令。
两个小知识:
1.在DVWA各模块右下角有一个View Source的按钮,可以查看DVWA服务器端核心代码:

2.在DVWA Security中可切换等级:

LOW:
查看服务器端代码:

isset函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false。
服务器只验证了参数Login是否被设置,没有任何的防爆破机制,且对参数username、password没有做任何过滤,存在明显的sql注入漏洞。
方法一:利用burpsuite爆破。
首先我们将DVWA用burpsuite代理,我用的火狐浏览器,在工具---选项---网络---设置中开启手动代理,端口一定要选对,然后打开burpsuite,利用burpsuite进行抓包。

将抓到的包选中右键选择发送到Intruder模块,因为要对password参数进行爆破,所以我们首先清除所有$符,然后在password两边加上$符。

点击Payloads,载入字典(自己随便建的,瞎写一些再写个真密码模拟即可),点击左上角Intruder中的Start attack进行爆破。

我们发现在爆破结果中password的响应包长度(length)“与众不同”,可推测password为正确密码,手工验证登陆成功。

方法二:手工sql注入。
1.注入成功
Username:admin'or'1'='1
Password:(空)
2.注入成功
Username :admin'#
Password :(空)
Medium:
首先我们查看服务器端代码。

相比Low级别的代码,Medium级别的代码主要增加了mysql_real_escape_string函数(会对字符串中的特殊符号x00,n,r,,’,”,x1a进行转义),基本上能够抵御sql注入攻击。
说基本上是因为查到说 MySQL5.5.37以下版本如果设置编码为GBK,能够构造编码绕过mysql_real_escape_string 对单引号的转义。
mysql_real_escape_string函数参考链接:
http://blog.csdn.net/hornedreaper1988/article/details/43520257
http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html
除此之外,$pass做了MD5校验,杜绝了通过参数password进行sql注入的可能性,但依然没有加入有效的防爆破机制,所以依然可以使用Burpsuite进行爆破,与Low级别的爆破方法一样。
High:
首先我们查看服务器端代码。

相比Medium级别的代码,High级别的代码增加了Token,可以抵御CSRF攻击,同时也增加了爆破的难度,通过抓包,可以看到,登录验证时提交了四个参数:username、password、Login以及user_token。

每次服务器返回的登陆页面中都会包含一个随机的user_token的值,用户每次登录时都要将user_token一起提交。服务器收到请求后,会优先做token的检查,再进行sql查询。
除此之外,使用了stripslashes(去除字符串中的反斜线字符,如果有两个连续的反斜线,则只去掉一个),mysql_real_escape_string对参数username、password进行过滤、转义,进一步抵御sql注入。
利用Burpsuite进行爆破
使用burpsuite进行代理,打开burpsuite,利用burpsuite进行抓包,将抓到的包选中右键选择发送到Intruder模块,因为要对password和user_token两个参数进行爆破,所以我们首先清除所有$符,然后再password和user_token两边加上$符,攻击类型选择pitchfork(草叉模式):它可以使用多组Payload集合,在每一个不同的Payload标志位置上(最多20个),遍历所有的Payload。举例来说,如果有两个Payload标志位置,第一个Payload值为A和B,第二个Payload值为C和D,则发起攻击时,将共发起两次攻击,第一次使用的Payload分别为A和C,第二次使用的Payload分别为B和D。

在option选项卡中将攻击线程thread设置为1,因为Recursive_Grep模式不支持多线程攻击。

然后下拉找到Grep-Extract,意思是用于提取响应消息中的有用信息,点击Add,如下图进行设置,并将user_token的值复制,最后将Redirections设置为Always。

点击payloads,第一个参数设置与low级别设置相同,第二个参数选择Recursive grep(用服务器每次返回的数据来替换payload中的变量值),然后将options中的token作为第一次请求的初始值。

点击左上角Intruder中的Start attack进行爆破,我们发现在爆破结果中password的响应包长度(length)“与众不同”,可推测password为正确密码,手工验证登陆成功。

Impossible
首先我们查看服务器端代码。
可以看到Impossible级别的代码加入了可靠的防爆破机制,当检测到频繁的错误登录后,系统会将账户锁定,爆破也就无法继续。

同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入,这是因为不能使用PDO扩展本身执行任何数据库操作,而sql注入的关键就是通过破坏sql语句结构执行恶意的sql命令。
关于PDO
http://www.cnblogs.com/pinocchioatbeijing/archive/2012/03/20/2407869.html

浙公网安备 33010602011771号