宽字节注入

文章目录

    • 1.简介及概述
    • 2.产生原因
    • 3.涉及函数
    • 4.实际应用
    • 5.总结

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并不是唯一的,这里我只是选取了网上最常用的一种方法罢了

你可能感兴趣的:(web安全,mysql,web安全)