宽字节注入
漏洞原理
一般程序员用gbk编码做开发的时候,会用 set names 'gbk'
来设定,这句话等同于
set
character_set_connection = ‘gbk’,
character_set_result = ‘gbk’,
character_set_client = ‘gbk’;
漏洞发生的原因是执行了 set character_set_client = 'gbk';
之后,mysql就会认为客户端传过来的数据是gbk编码的,从而使用gbk去解码,而mysql_real_escape
是在解码前执行的。
但是直接用 set names 'gbk'
的话real_escape
是不知道设置的数据的编码的,就会加 %5c 。此时server拿到数据解码 就认为提交的字符+%5c是gbk的一个字符,这样就产生漏洞了。
宽字节注入是由于不同编码中中英文所占字符的不同所导致的。
通常来说,在GBK编码当中,一个汉字占用2个字节。而UTF-8编码中,一个汉字占用3个字节。
在一般的sql注入时,参数id=1在数据库查询时是被单引号包围的。当传入id=1’时,传入的单引号又被转义符(反斜线)转义,导致参数ID无法逃逸单引号的包围,所以在一般情况下,此处是不存在sql注入漏洞的。
不过有个特例,就是当数据库的编码是GBK时,可