Brute Force
Brute Force(暴力破解)
Low
首先看一下源码,提取出关键部分:
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
开始爆破,爆破结果如下