下面来分析一下DVWA中的Brute Force暴力破解,在页面的文本框中输入用户名和密码,如果输入错误,会出现错误提示。

image

正确的密码跟DVWA登录密码一样,都是password。正确输入的页面:

image

所谓的暴力破解,就是在不知道密码的情况下,通过软件挨个密码进行尝试,从而最终将密码破解出来。

我们还是先选择low级别,查看一下源码。

image

有了之前的基础,很容易就可以发现这段代码中存在SQL注入漏洞,问题就出在下面这行语句:

$qry = “SELECT * FROM `users` WHERE user=’$user’ AND password=’$pass’;”;

比如我们输入用户名“admin’ or ‘a’=’a”,那么无论输入什么密码都可以正常登录,这就是经典的密码绕过漏洞。

原理其实很简单,只要将那段用户名代入到代码中就可以理解了。

$qry = “SELECT * FROM `users` WHERE user=’admin’ or ‘a’ = ‘a’ AND password=’$pass’;”;

因为了有了“or ‘a’ = ‘a’”的存在,所以后面的“AND password=’$pass’”密码验证根本就没有发挥作用。

之前已经分析过了low级别的Brute Force代码,下面再分别分析一下medium和high级别的代码。

medium级别代码:

image

很明显就可以看到medium和low级别的区别,在这里对负责接收用户参数的变量$user和$pass进行了过滤,过滤的方法仍然是使用mysql_real_escape_string()函数。这样密码绕过就行不通了,但对于暴力破解却是没有丝毫影响,利用Burpsuite仍然可以很快破解出密码。

下面再看下high级别的代码:

image

high级别首先仍是对$user和$pass变量进行了过滤,当然在过滤之前先使用stripslashes()函数清除了魔法引号的转义。再仔细观察一下与medium级别代码的区别,就会发现在if语句的else部分增加了一行代码“sleep(3)”,也就是说如果密码输入错误,那么就需要等待3秒钟才可以继续输入。这个设计很明显是用来防御暴力破解的,在Burpsuite中测试一下就可发现密码破解的时间被大大延长了,这样如果将密码设置的稍微复杂一些,再加上适当的停顿时间,基本上就可以有效地防御暴力破解。

当然,防御暴力破解的最有效方法是在登录页面中加入验证码,虽然有些验证码也是可以被突破的,但如果将验证码也设置的稍微复杂一些,就像最近被吐槽的12306验证码,那么暴力破解基本上就是不可能了。