前言 SQL在CTF每一次比赛中基本上都会出现,所以有了这一篇总结,防忘,最后更新于2018/10/11。 简而言之:SQL注入用户输入的数据变成了代码被执行
我们希望用户输入的 id 的值,仅仅是一个字符串,传入数据库执行,但是当输入了:2 or 1=1 时,其中的 or 1=1 是作为了 sql语句 来执行的。sql注入绕过
以下绕过方式可自己在虚拟机搭建一个mysql数据库环境,实际操作练习;
注释符号绕过
常用的注释符有
实例
大小写绕过
常用于waf
的正则对大小写不敏感的情况,一般都是题目自己故意这样设计。例如:waf过滤了关键字
select
,可以尝试使用
Select
等绕过。
内联注释绕过
内联注释就是把一些特有的仅在MYSQL上的语句放在/*!...*/
中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。
双写关键字绕过
在某一些简单的waf
中,将关键字
select
等只使用
replace()
函数置换为空,这时候可以使用双写关键字绕过。例如
select
变成
seleselectct
,在经过
waf
的处理之后又变成
select
,达到绕过的要求。
特殊编码绕过
十六进制绕过ascii编码绕过Test
等价于CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)
tip:好像新版mysql不能用了
空格过滤绕过
一般绕过空格过滤的方法有以下几种方法来取代空格 实例过滤or and xor not 绕过
过滤等号=绕过
不加通配符
的
like
执行的效果和
=
一致,所以可以用来绕过。
正常加上通配符的
like
:
不加上通配符的
like
可以用来取代
=
:
rlike:模糊匹配,只要字段的值中存在要查找的 部分 就会被选择出来用来取代
=
时,
rlike
的用法和上面的
like
一样,没有通配符效果和
=
一样
regexp:MySQL中使用 REGEXP 操作符来进行正则表达式匹配
使用大小于号来绕过
<> 等价于 !=
所以在前面再加一个!
结果就是等号了
等号绕过也可以使用strcmp(str1,str2)函数、between关键字等,具体可以参考后面的过滤大小于号绕过
过滤大小于号绕过
在sql盲注中,一般使用大小于号来判断ascii码值的大小来达到爆破的效果。但是如果过滤了大小于号的话,那就凉凉。怎么会呢,可以使用以下的关键字来绕过
greatest(n1, n2, n3…):返回n中的最大值
least(n1,n2,n3…):返回n中的最小值
strcmp(str1,str2):若所有的字符串均相同,则返回STRCMP(),若根据当前分类次序,第一个参数小于第二个,则返回 -1,其它情况返回 1
过滤引号绕过
使用十六进制
宽字节
常用在web应用使用的字符集为GBK
时,并且过滤了引号,就可以试试宽字节。
过滤逗号绕过sql盲注时常用到以下的函数: substr()
substr(string, pos, len):从pos开始,取长度为len的子串
substr(string, pos):从pos开始,取到string的最后
substring()
用法和substr()一样
mid()
用法和substr()一样,但是mid()是为了向下兼容VB6.0,已经过时,以上的几个函数的pos都是从1开始的
left()和right()
left(string, len)和right(string, len):分别是从左或从右取string中长度为len的子串
limit
limit pos len:在返回项中从pos开始去len个返回值,pos的从0开始
ascii()和char()
ascii(char):把char这个字符转为ascii码
char(ascii_int):和ascii()的作用相反,将ascii码转字符
from pos for len
,其中pos代表从pos个开始读取len长度的子串例如在
substr()
等函数中,常规的写法是
如果过滤了逗号,可以这样使用
from pos for len
来取代
在sql盲注中,如果过滤逗号,以下参考下面的写法绕过
也可使用
join
关键字来绕过
其中的
等价于
使用like
关键字
适用于substr()
等提取子串的函数中的逗号
适用于
limit
中的逗号被过滤的情况
limit 2,1
等价于
limit 1 offset 2
过滤函数绕过
sleep() -->benchmark()
ascii()–>hex()、bin()
替代之后再使用对应的进制转string即可group_concat()–>concat_ws()
substr(),substring(),mid()可以相互取代, 取子串的函数还有left(),right()
user() --> @@user、datadir–>@@datadir
ord()–>ascii():这两个函数在处理英文时效果一样,但是处理中文等时不一致。
转载自:https://blog.csdn.net/huanghelouzi/article/details/82995313