LOW:
随便猜测一组用户名的密码,login的时候用Burp Suite抓包
然后send to the intruder,用 Clear§ 清除掉系统定义的字段,然后 Add§ 我们要爆破的用户名和密码,Attack type 选择 Cluster bomb 集束炸弹
学习一下
***四种攻击方式***
1. Sniper 狙击手模式
- 枚举单个参数
- payload每次只替换一个变量
2. Battering Ram 攻城锤模式
- 同时枚举多个参数
- 同时枚举的参数被相同的payload替换
3. Pitchfork 交叉攻击模式
- 同时枚举多个参数,并为一组
- 枚举的一组参数被一组payload替换(组内有关联)
4. Cluster Bomb 集束炸弹模式
- 同时枚举多个参数
- 为每个参数位置配备独立的payload列表,互不相关
然后进入intruder的payloads部分,在setting里面导入本地的字典,或者手动输入猜测的用户名和密码(记得导入两次,因为有两个参数,在payload set里换位置)
开始攻击!
攻击过程中可以实时刷新length,找出长度不同的那个,就是我们要的用户名和密码
关闭抓包,返回DVWA ,用这组用户名和密码登录
登陆成功!
MEDIUM:
优化地方:
- 每次登录失败之后,服务器强制延迟2秒,降低了我们爆破的速度
- 单一了错误提示,不再把用户名和密码分开报错
- 转义函数
我们分析源码
sleep(2)延迟两秒
再对比low和high的提交部分代码
low:
medium:
// 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 );
添加了转义函数放注入 mysqli_real_escape_string
解释:把用户输入的特殊字符(‘ “)加上反斜杠,让其失去破坏性
coclusion:medium难度的与low难度的区别不大,还可以用集束炸弹爆破,但是时间会延长到只能尝试三十组数据一分钟
HIGH:
优化地方
- 增加了token验证
- stripslashes() 先清理再转义,双倍安全
- 延迟时间变得不固定
token验证:
一个只有本人访问/刷新登录页面才会产生的动态密码,和登录密码相互独立,构成双重验证
我们来分析high的php源码,这一行增加了token验证
这里增加了不固定延迟时间
这里使用了stripslashes函数,先去除了多余的斜杠符号,再作用转义函mysqli_real_escape_string
先随便尝试一组用户名与密码,发现用bp抓包带上了token
转移到intruder中先clear,再add上password和token
之后去资源池resource pool里面把请求的并发数量改成1,因为token每次验证后报废才会生成新的token
最后进入settings里面,在grep-extract里面进行修改,先选中
点Add,进去之后点refetch response
找到我们需要的value值双击选中复制,此时上面的表达式也发生了变化
ok之后返回payloads,在第一个参数位(password)里面导入字典,类型选择simple list
第二个参数位里面下面的request里输入token,类型选择recursive grep
开始攻击!!!!!!!!!!!!
按长度得到我们的答案
IMPOSSIBLE:
优化部分:
- 加上了时间锁,其中total_failed_login预设定为了3,所以登录错误大于等于3的时候,就锁死了
- 参数化绑定:通过将查询语句与参数绑定,参数化查询能够确保输入的数据被正确处理,而不是直接拼接在SQL语句中,100%杜绝了sql注入
- 另外还有一些智能的反馈,比如锁定时常,最后尝试时间等,这里不再过多赘述