1.简介及概述
如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节
宽字节注入是利用mysql编码方式的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字。
宽字节注入其实是sql注入防范措施的一种绕过。应用于PHP的某些函数在一些预定义字符前加\,来达到转义的目的,使得我们无法去构造闭合从而达到我们的目的。
宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)
“\”的编码为%5c,在前面加一个%df就构成了一个繁体字
2.产生原因
程序员为了防止SQL注入,就会调用一些函数,将单引号或双引号进行转义操作,转义无非便是在单或双引号前加上斜杠(\)进行转义 ,但这样并非安全,因为数据库使用的是宽字节编码,两个连在一起的字符会被当做是一个汉字,而在PHP使用的UTF8编码则认为是两个独立的字符,如果我们在单或双引号前添加一个字符,使其和斜杠(\)组合被当作一个汉字,从而保留单或双引号,使其发挥应用的作用。但添加的字符的Ascii要大于128,两个字符才能组合成汉字 ,因为前一个ascii码要大于128,才到汉字的范围 ,这一点需要注意。
3.涉及函数
(1)addslashes() 函数返回在预定义字符之前添加反斜杠的字符串
(2)mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
(3)mysql_escape_string() 转义一个字符串
(4)php.ini中magic_quote_gpc的配置
4.实际应用
在输入点输入以下payload
%df' and 1=1 -- + 回显正常
%df' and 1=2 -- + 回显错误
说明存在sql注入,而且是宽字节注入
5.总结
其实这里就是为了绕过转义符号,从而构造闭合,其他的与前面写过的sql注入并无太大区别。
这里的%df并不是唯一的,这里我只是选取了网上最常用的一种方法罢了