首先登录 DVWA 靶场
DVWA 默认的用户有5个,用户名及密码如下:
admin/password
gordonb/abc123
1337/charley
pablo/letmein
smithy/password
难度等级设置为 low ,我们先从最简单的开始
来到 Brute Force(暴力破解)
我们可以输入用户名和密码
简单测了几个,回显用户名或密码不正确
但是并未对我们输入的内容及次数进行限制,因此直接进行爆破
暴力破解我们使用工具 burpsuite
关于 burpsuite 的安装及破解教程网上有很多,我这里就不再过多赘述
之后配置好代理转发,默认是监听本地的 8080 端口
EG 浏览器的话给大家推荐一个好用的小插件:Proxy SwitchyOmega
用来配置代理
这里还需要解决一个问题,因为我们的 DVWA 靶场搭建在本地,127.0.0.1 是一个回环地址,burpsuite 是无法抓取的,需要替换成自己的内网地址并进行一些配置。
具体参考我之前的博客
关于burpsuite无法抓到本地请求包的解决方案:
https://myon6.blog.csdn.net/article/details/135731145?spm=1001.2014.3001.5502
端口的话为了避免冲突我们重新配一个
之后我们访问靶场地址时将 127.0.0.1 替换为自己内网 ip ,我这里是 192.168.112.221
然后重新登录进入靶场,重新设置难度等级
简单测试一下,抓包成功
接下来我们正式进入暴力破解
开启 burpsuite 拦截抓包,先随便输一个用户名和密码进行登录
将包发到攻击模块(intruder)
设置爆破位置:
选择爆破模式:
配置攻击载荷(这里也就是爆破的字典)
这种字典网上也有很多,自行下载导入即可
配置好后我们直接开始攻击
我们需要筛选出长度不同的
长度不同说明回显结果不一样(一般就是成功了的)
通过暴力破解我们得到登录用户名和密码为:admin/password 这种就是弱口令
如果你想更深入去了解那么就看它文件的源码
<?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);
}
?>
这段代码是一个简单的登录系统,但存在很多的安全问题 :
1、在 SQL 查询中,用户提供的 username 和 password 直接被拼接到查询语句中,这可能导致 SQL 注入攻击。攻击者可以在输入中插入恶意代码来绕过身份验证或者获取敏感信息。
$user = $_GET['username'];
$pass = $_GET['password'];
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
2、使用了 md5 进行密码哈希,这是一个弱哈希算法,易于被暴力破解。
$pass = md5( $pass );
3、在使用 mysqli_query() 执行查询之前没有检查数据库连接的状态,也没有正确关闭数据库连接,这可能会导致资源泄漏或者其他问题。
$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>' );
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
4、当数据库查询失败时,直接将详细的错误信息暴露给用户,可能造成敏感信息泄露。
die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
5、用户的密码是通过 GET 方法传输的,这意味着密码可能会出现在 URL 中。
if( isset( $_GET[ 'Login' ] ) )
实际测试也确实是这样
对于 medium 等级其实和 low 方法一样(直接爆破),我们对比源码
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$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
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
与 low 的区别:
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
该代码对用户名和密码进行了输入验证,使用了 mysqli_real_escape_string() 函数来消毒输入,转义特殊字符,一定程度上可以防御 SQL 注入攻击。
此外:
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
在登录失败的情况下,该代码添加了一个 sleep(2) 的延迟,它会增加攻击者猜测密码的时间,可以一定程度上抵御暴力破解攻击,但是攻击者任然可以直接进行爆破。
因为攻击流程和方法都一样,因此这里就不做过多演示了。
后面会继续更新 high 难度以及其他漏洞的相关介绍与渗透方法。