sql绕过方式(部分
sql的一些些绕过方式?(随便记一下)
大小写绕过
数据库使用不区分大小写的方式处理sql关键字。
内联注释绕过
内联注释就是把一些特有的仅在MYSQL上的语句放在 /*!...*/
中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。
编码绕过
- Hex 编码:将 SQL 关键字编码为十六进制值,这样过滤机制就不会识别它们。例如,SELECT 编码为 0x53454C454354。
空格过滤绕过
一般绕过空格过滤的方法有以下几种方法来取代空格
1 | /**/ |
多语句注入
多语句意思就是可以执行多个语句,利用分号进行隔开
1 | 示例:id=1";WAITFOR DELAY '0:0:3';delete from users; --+ |
双写绕过
在某一些简单的waf中,将关键字select等只使用replace()函数置换为空,这时候可以使用双写关键字绕过。例如select
变成seleselectct
,在经过waf的处理之后又变成select,达到绕过的要求。
宽字节注入
如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节
宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,即将两个ascii字符误认为是一个宽字节字符。
转义函数
addslashes函数
对单引号(’)、双引号(“)、反斜线()与x00 (NULL字符)
magic_quotes_gpc函数
判断解析用户提交的数据,有post、get、cookie数据时增加转义字符“\”
通常情况下,SQL注入点是通过单引号来识别的。但当数据经过 addslashes()
处理时,单引号会被转义成无功能性字符,在判断注入点时失效。攻击者利用宽字节字符集(如GBK)将两个字节识别为一个汉字,绕过反斜线转义机制,并使单引号逃逸,实现对数据库查询语句的篡改。
假设有以下测试payload:
1 | 输入payload: ' or 1=1 # |
分析:’的url编码是%27,经过addslashes()以后,’就变成了',对应的url编码就是%5c%27
针对上述情况,可以构造绕过payload:
1 | 构造绕过payload: %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
一样,没有通配符效果和=
一样