宽字节注入
前言
如何解决 注入时 输入的 '(单引号) 被转义成 \'(反斜杠+单引号)
- 首先我们来看一下sql注入中遇到的问题

遇到这种情况,说明单引号在插入时被转义了,那么如何去bypass?
- 使用宽字节注入,把单引号前的\给消除掉,这样就可以正常使用单引号去闭合了

这里使用的方法是在单引号前面加上%df。
关于为什么要加上%df就可以宽字节注入了呢?请听我娓娓道来~
单引号前被插入了 \ 说明php源码代码中出现了以下函数,那么首先我们要了解一下这些函数。
PHP转义函数
addslashes,
mysql_real_escape_string,
mysql_escape_string
宽字节注入条件:
使用addslashes函数 (并且开启GPC)
数据库编码设置为GBK (php编码为 utf-8 或其它非GBK格式)
宽字节注入流程:
- 正常被转义:
‘ –> \‘ (单引号 -> 反斜杠+单引号)
- 加%df 宽字节注入过滤:
%df’ –> %df%27% –> %df%5c%27 –> 運’
浏览器输入 –> url编码 –> addslashes转义 –> %df%5c被转义成汉字 運
宽字节注入原理:
- %df%5c 为什么会被转义成为汉字
運呢?
%df’经过addslashes编码之后带入了‘\’
%df’ 就变成了 %df' –> %df%5c%27 (url编码后)
%df%5c%27 在带入到mysql时使用了GBK,%df%5c被转译成汉字運 so最后输出结果为 運'
- 讲到GBK编码转义 为什么%df%5c%27 只转义%5c而不转义%27 呢?
GBK编码,它的编码范围是0x8140~0xFEFE(不包括xx7F),
在遇到 %df(ascii(223)) > ascii(128) 时自动拼接%5c,
因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了。
发布于
tags:
{ Web安全 }