界面:
目标:
这里的暴力破解就是,使用自己的用户名和密码字典,一个个尝试是否能登陆成功,即穷举。
BurpSuit暴力破解使用教程.
一、打开BurpSuit,配置好代理,准备抓取浏览器的数据包。
二、在DVWA界面表单中随意输入用户名和密码,然后点击"Login"提交。
例如:
Username:talentq
Password:123456
三、提交后通过BurpSuit实施暴力破解。
1、表单提交后,BurpSuit就会截取到数据包;
2、在空白处右键选择"Send to Intruder",或者直接按Ctrl+I键;
3、进出Intruder,清除所有原来默认的变量;
4、选择Attack Type为Cluster Bomb,将用户名和密码的值设置为变量;
5、分别对每一个参数选择字典;
6、开始暴力破解后,观察新弹出窗口的Length字段,长度不同的很可能就是破解成功的情况。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/21efeae781209348056b4f96ef4644b7.png)
我选择的字典太大了,所以会跑很长时间,不过只要字典里有正确的用户名和密码,总会破解成功的。另外如果用户名或者密码复杂的话,暴力破解难度就会很大了。
DVWA这题数据库里面有五个用户。一般大家都先默认有用户名admin(这题也的确有),然后只针对密码爆破。这种只有一个参数的爆破在选择Attack Type时选择Sniper。
题目的"Objective"中提到,目标是破解管理员密码(即用户名为admin的账号密码),破解其他的算作加分项,但我毫无头绪。难道硬跑用户名?这得跑到哪一年。
上述步骤可能不完善,请见谅,写得详尽的确很费时间,我也是边学边写的。
另外为了增加游戏体验,可以手动在自己的字典里加入正确的用户名和密码。这里我把把答案贴出来:
四、查看后端源码
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ];
// Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
为了方便学习,也贴出浏览器网页的源代码里的表单:
PHP源代码我只能看个意思,实际上里面的语法、结构、函数等我是很模糊的。接下来就来学习源代码。
第一眼印象:代码被<?php 代码内容?>括起来,里面有一个if else结构,最后还有一行不知道什么东西。
<?php ?>:PHP代码需要写在这个标签里。
$_GET变量:菜鸟教程.
isset()函数:菜鸟教程.
md5()函数:菜鸟教程.
单引号与双引号的区别:PHP中单引号和双引号的区别.
mysqli_query()函数:菜鸟教程.
$GLOBALS:PHP Manual.
die()函数:菜鸟教程.
is_object() 函数:菜鸟教程.
mysqli_error()函数:菜鸟教程.参数是数据库连接,这个连接是一个对象。看到这里,我感觉已经避不开mysqli_connect()这个函数了。
mysqli_connect()函数:菜鸟教程. 返回值是表示连接的对象。这个连接对象是什么呢,我使用var_dump()打印出来是一堆版本、错误、线程等信息,难怪许多函数需要它作为参数。
mysqli_connect_error()函数:菜鸟教程. 没有参数,返回一个描述错误的字符串。如果没有错误发生则返回 NULL。
mysqli_num_rows()函数:菜鸟教程. 返回结果集的行数。
mysqli_fetch_assoc()函数:菜鸟教程. 从结果集中取得一行作为关联数组。
mysqli_close()函数:菜鸟教程. 关闭数据库连接,如果成功则返回 TRUE,如果失败则返回 FALSE。
在这里插一句,一直对PHP中的 TRUE 和 FALSE 的大小写很迷惑,在这里贴上大小写的讲解。PHP中的变量名、函数名等大小写有区别吗?.
is_null()函数:菜鸟教程. 检测变量是否为 NULL,如果指定变量为 NULL,则返回 TRUE,否则返回 FALSE。
五、代码学习结束后,发现Low等级对username和password字段没有任何过滤,所以这里也存在SQL注入。(默认知道存在用户名admin)
输入:
username:admin’ or ‘1’='1
password:(随便输入或者为空)
结果:
输入:
username:admin’#
password:(随便输入或者为空)
结果:
由于后端代码对查询的行数进行了限制,如果查询的结果超过1行就会返回Username and/or password incorrect.
,所以我还是不知道如何查询到其他的用户名和密码。
DVWA——Brute Force的Low级别结束!