首页 > 其他分享 >一句话读懂宽字节注入

一句话读懂宽字节注入

时间:2022-08-14 10:47:01浏览次数:57  
标签:编码 字节 字符 单引号 GBK 0x27 读懂 注入

宽字节注入

对于从事安全行业的人来说,提起宽字节,不得不提起宽字节注入。
宽字节是由两个字节组成的。
前置知识
0x27是GBK编码中的单引号“’”
0x5C是GBK编码中的反斜杠“\”。
0xBF和0xBF27都不是有效的GBK编码
0xBF5C是GBK编码中的汉字“縗”。
现在,我们将字符串0xBF27作为函数addslashes(这个函数是PHP中防止SQL注入的一个函数)的输入,
该函数发现0xBF和0xBF27都不是有效的字符编码从而跳过了无法识别的0xBF,
又发现0x27是特殊字符单引号“’”,所以在0x27前加上了“\”(0x5C),最终输出0xBF5C27。
0xBF5C27这个字符串将被理所当然地理解为由0xBF5C和0x27这两个字符组成,
于是addslashes的输出便成了“縗’”,原本该被用来转义“’”的“\”被0xBF吞掉了。

举个例子:
就是我们遇到一个疑似存在SQL注入的点,可以发现是?id=1
当我们输入?id=1'的时候,其中的单引号会被转义为一个字符,到了数据库层面就是?id=1\'
\的编码是%5c
此时我们的单引号不会被当作SQL语句中的单引号,而是一个正常的字符。
也就不存在我们所说的SQL注入。
不过此时如果数据库的编码是GBK编码,我们可以通过'吃掉'\来阻止数据库将我们的单引号转义。
比如我们输入?id=1%BF',此时将这个数据传回到数据库中的时候,由于数据库使用的宽字节编码,是两个字节,所以数据库就会将%BF 和%5c就会组成一个新的字符。由于我们的单引号最后只剩下一个字节,所以我们的单引号就会逃逸出来。实现SQL注入。

为什么是%BF

其实不光是%BF,从上面的前置知识可以知道,想要吞噬反斜线,就要满足几个条件

  • %XX 与 %27(就是单引号)不是有效字符
  • %XX 自己不是有效字符
  • %XX 与 %5C(就是反斜线)是有效字符

GBK编码中的单字节字符完全兼容ASCII编码。
双字节字符的总体编码范围为0x8140~0xFEFE。
首字节在0x810xFE之间,尾字节在0x400xFE之间,剔除0xXX7F一条线。

从上面可以知道,尾字节范围在0x40~0xFE之间,0x27不在此范围内,0x5C恰巧在此范围内。
所以能够吞掉转义单引号的转义符“\”的0xXX有很多很多,远不止0xBF一个。
只要0xXX在0x81~0xFE之间就都可以达到此效果。简单测试下确实如此。

标签:编码,字节,字符,单引号,GBK,0x27,读懂,注入
From: https://www.cnblogs.com/atzxc/p/16584933.html

相关文章