Brute Force(暴力破解)

Low

首先看一下源码,提取出关键部分:

1
2
3
4
5
6
7
8
9
10
11
<?php
---
// 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 ) {
---
}
---
?>

可以看到想从数据库中获取数据,就需要满足 if( $result && mysqli_num_rows( $result ) == 1 ) ,即只要满足 $query 查询语句等于 1 ,即可从数据库中获取不为空的 $result ,破解就成功了。

可以看到破解的关键语句在这里

1
SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';

破解的关键在于,不知道 $pass 于是想办法把 AND 避开,只需要将用户名输入为 admin' or '1'='1 ,替代 $user 后的效果如下

1
SELECT * FROM `users` WHERE user = 'admin' or '1'='1' AND password = '$pass';

可以看到根据逻辑连接词的执行顺序,or之后的语句都被跳过了,破解成功,拿到了数据库中的图片。

Medium

查看源码,发现在读取用户名和密码的地方加入了一行代码

1
$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)) ? "" : ""));

影响我们注入的关键是 mysqli_real_escape_string ,这个函数的作用是转移字符,也就是说,Low 级别下的 ' 不能不能用了,使用 burp suite 爆破

这里注意 burp suite 的使用,要使用内置浏览器才能抓到 localhost 的内容,我真傻,试了一下午加一晚上。。。

配置ip和端口,我这里 8080 端口被占用了,这里使用 8081 端口

在内置浏览器中打开 DVWA ,输入用户名和密码,可以看到 burp suite 捕捉到了包

发送到爆破模块,然后清除全部变量,再对username和password添加变量进行暴力破解,并设置爆破类型。

爆破类型分四种:Sniper(狙击手)、Battering ram(攻城锤)、Pitchfork(草叉模式)、Cluster bomb(集束炸弹)。

根据不同的爆破需求选择使用,这里假设用户名和密码都未知,使用 Cluster bomb ,可以同时将用户名和密码爆出来

将我们要测试的部分用 $ $ 标出来

可以搜索变量的字典用来匹配,这里为了方便,简单的输入几个样例来匹配测试

可以看到正确用户名和密码的组合长度要大于其他的组合,由此可以判断出正确的结果

不过为什么空字符也是正确的呢?因为在抓包时输入的是正确的用户名和密码,会有一次原字符提交,第一次的提交是正确的。

High

根据源码可以知道,这个级别对爆破攻击有一定的防护作用,但是也有疏忽的地方。

这个级别要校验token,每次都需要更新token。使用mysqli_real_escape_string(str)函数,而且完全的抵抗了SQL的注入。

切换到 high level 同样的方法抓包,发送给 Intruder

playload1 还是用 simple list

开始爆破,爆破结果如下