SQL注入时"or" "and"等关键字被过滤了,怎么处理?

当常用字符被注释无法使用时,通常采取以下方法(可自行搜索 sql 注入绕开过滤等):

字母被注释 (or、and 等)

1. 大小写变形

如:Or、OR、oR 等

2. 改变编码

如:通过 hex、urlencode、url 等编码
举例:如果 or 被过滤时,我们可以采用 url 编码(其相当于把 ascii 编码的 0x 给替换成 %,比如 o 的 ascii 为 0x6f,url 编码就是 %6f),这个时候我们可以试试 %6fr,即把 o 换成 url 编码,也可以全换,也可以大小写的换,如果没被过滤就成功了,(如果 % 被过滤了的话…)
【注:这个可以积极的去使用,比如测试时 and 被注释,使用 && 替换也失败,这个时候不妨试试 %26%26(& 的 url 编码)】

3. 添加注释

如:/* */(这个不止可以应对字母被注释)
举例:某个过滤器能够过滤的字符如下——“select”、”from ”、”limit ” 等,注意这些字符最后面都有一个空格,这个时候我们就能通过内联注释来绕过这个过滤器,如:

SELECT/**/username,password/**/FROM/**/users

【注:这个注释甚至可以穿插在关键字当中,例如被过滤了 or,我们可以把order by改成o/**/rder by,参考的资料上是这么说,但本人试了没成功,不知是否依旧实用】

4. 往字符里面插入被过滤的字符

比如 or 被过滤了,我们可以往里面加 or,即注入:oorr,这个时候里面的 or 就被删去了,剩下的组成新字符,也就是 or,是个很好用的绕过方法,像这种类似的还有很多,需要我们去思考

5. 利用符号形式

如:&&、||
举例:

‘ || updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

数字被注释 (1、2 等)

6. 使用浮点数,如:1.0、2.0

符号被注释 (>、< 等)

7. 利用函数来替代

如盲注时经常用到比较,这时候要是比较符号被注释了不能用平常的方法了,所以需要用某些函数如greatest()greatest(n1,n2,n3,...)函数返回输入参数 (n1,n2,n3,...) 的最大值】、least()等,比如语句:select * from users where id=1 and ascii(substr(database(),0,1))>64就可以替换成select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
【注:当 or 被注释时,像 order by 这种含有相关字符的语句也同样无法使用,这个时候如果改变大小写也无用时,可以使用上述的内联注释/**/,或者用别的编码形式,如果不行的话,那就只能放弃使用 order by,可以尝试使用 group by 语句等】

原文地址 www.jianshu.com