宽字节注入

前言

如何解决 注入时 输入的    '(单引号)    被转义成    \'(反斜杠+单引号)



  1. 首先我们来看一下sql注入中遇到的问题

单引号被转义

遇到这种情况,说明单引号在插入时被转义了,那么如何去bypass?



  1. 使用宽字节注入,把单引号前的\给消除掉,这样就可以正常使用单引号去闭合了

宽字节注入

这里使用的方法是在单引号前面加上%df

关于为什么要加上%df就可以宽字节注入了呢?请听我娓娓道来~



单引号前被插入了 \ 说明php源码代码中出现了以下函数,那么首先我们要了解一下这些函数。

PHP转义函数

  • addslashes,

  • mysql_real_escape_string,

  • mysql_escape_string



宽字节注入条件:

  1. 使用addslashes函数 (并且开启GPC)

  2. 数据库编码设置为GBK (php编码为 utf-8 或其它非GBK格式)



宽字节注入流程:

  1. 正常被转义:

         –>            \‘          (单引号 -> 反斜杠+单引号)

  1. 加%df 宽字节注入过滤:

%df’    –>   %df%27% –>   %df%5c%27    –>   運’

浏览器输入 –> url编码     –> addslashes转义    –> %df%5c被转义成汉字



宽字节注入原理:

  1. %df%5c 为什么会被转义成为汉字 呢?

%df’经过addslashes编码之后带入了‘\’

%df’ 就变成了 %df' –> %df%5c%27 (url编码后)

%df%5c%27 在带入到mysql时使用了GBK,%df%5c被转译成汉字 so最后输出结果为 運'



  1. 讲到GBK编码转义 为什么%df%5c%27 只转义%5c而不转义%27 呢?

GBK编码,它的编码范围是0x8140~0xFEFE(不包括xx7F),
在遇到 %df(ascii(223)) > ascii(128) 时自动拼接%5c,
因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了。