DVWA靶场之Brute Force(暴破)通关
DVWA最经典PHP/MySQL老靶场,简单回顾一下通关流程吧
DVWA十大金刚,也是最常见的十种漏洞利用:Brute Force(暴破)、Command Injection(命令行注入)、CSRF(跨站请求伪造)、File Inclusion(文件包含)、File Upload(文件上传)、Insecure CAPTCHA(不安全的验证码)、SQL Injection(SQL注入)、SQL Injection(Blind)(SQL盲注)、XSS(Reflected)(反射型跨站脚本)、XSS(Stored)(存储型跨站脚本)
靶场分4个难度,low medium high impossible,难度递增
有源代码,正面不行反面审计突破
本来想一次性写完十个的,后来发现内容量有点大......那就分开写吧
0x01暴破
Low:没啥说的,用户名admin已知,要暴破出密码是什么(如果用户名也不知道,那就要暴破到地老天荒了),简单了很多
Burp suite开始,用户名输admin,密码随便写,打开截断,send to intruder,选中密码部分,攻击类型选狙击手,payloads中加密码字典,start attack开搞
另:可以利用sql注入,源代码$query= "SELECT * FROM `users` WHERE user = '$user'AND password='$pass';";
那么用户名就可以admin’# 截断后面的,密码也不用输入了
Medium:
多了个函数mysql_real_escape_string,基本可以抵御注入……吧(大佬绕过帖子 https://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html),pass有md5(),注入会麻烦,不过这本来就是暴破,不注入了,用暴破的方法就好
重复low级别的操作即可
High:
增加了checkToken、stripslashes剥离反斜杠、mysql_real_escape_string转义,更安全了,无脑暴破应该是不行了
因为每次服务器回到登录界面,都会给你一个user_token,你记住喽,下次再登录带着这个user_token一起提交给服务器,服务器先检查user_token,对了,再做sql查询,不对,一边玩去吧
由于有两个参数user_token和password需要暴破,所以这次将请求包发到intruder后,将这两个参数处上标,选草叉模式,因为要两个位置两个payload分别暴破,你暴破你的,我暴破我的
Password还用原来的字典payload就行,如何搞user_token呢?
在intruder模块下的option中,找到Grep – Extract,点击Add,fetch response,获取一下这次请求返回的结果,二话不说先把返回包中<input type='hidden' name='user_token' value=……>此处的value值复制到小本儿上,一会要用,之后点ok,一定把request engine中 number of threads改成1,否则会报错,recursive grep payloads cannot be used with multiple request threads
返回payloads栏目,payload 1 选原来强度暴破的字典
payload 2 选择payload type为“Recursive grep”
initial payload for first request粘贴之前复制到小本儿上的token,最后start attack 开搞
把上次请求得到的按服务器规则生成的token作为本次,下次,下下次,往后无数次请求的参数暴破,就没有报错,看length不一样的那个就是密码
另:第一反应是写py,应该也可以,后续写再好补上
Impossible:
嗯。。。。。。代码中好像不仅写了时间检测的方法,连续登录时间区分不开就会把账户锁置1,还用了一个叫PDO(PHP数据对象)的东西
PDO在PHP5.1版本以后存在,按官方说法是一个轻量级的、具有兼容接口的PHP数据连接拓展。它所提供的数据接入抽象层,具有与具体数据库类型无关的优势,为它所支持的数据库提供统一的操作接口。
遗憾的是,我们没法通过PDO本身来执行数据库操作
$data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
$data->bindParam( ':user', $user, PDO::PARAM_STR);
$data->bindParam( ':password', $pass, PDO::PARAM_STR );
$data->execute();
$row = $data->fetch();
比较以前低级别的
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
中间加了一层,莫得办法
附:关于burp suite暴破的四种方法
举个例子,如果有4个暴破点
sniper狙击手:(一枪一个小朋友,每一颗子弹消灭一个敌人)用payload把每一个点都搞一遍,控制变量,搞一个点时其他点保持原样不变,有10个payload的话,搞40遍
battering ram攻城锤(势大力沉,干就完了,一招鲜吃遍天):用一个payload同时搞4个点,有10个payload的话,搞10遍
pitch-fork草叉(三根四根五根叉齿,茅草麦秸花生棵,按顺序挨个来一遍,哪个顺手用哪个):在每个暴破点用不同的payload,按顺序匹配,次数以某个点最少的payload为准
payload1:1、5、9、13、17
payload2:2、6、10、14、18
payload3:3、7、11、15、19
payload4:4、8、12、16、20
点1 点2 点3 点4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
cluster bomb集束炸弹(排列组合总有一颗炸弹能炸到你):排列组合 1234、1238、12312、12316、12320、1274、1278、12712、12716、12720......