宽字节注入

听某同学说这是某安全厂商的一道面试题,果断复习巩固,以备将来不时之需。

概念解释

宽字节:某字符的大小为两个字节(所有英文默认占一个字节,汉字占两个字节)

宽字节注入:是因为数据库使用了GBK编码

正文

程序员为了防止sql注入,对用户输入中的单引号(’)进行处理,在单引号前加上斜杠(\)进行转义,这样被处理后的sql语句中,单引号不再具有‘作用’,仅仅是‘内容’而已,换句话说,这个单引号无法发挥和前后单引号闭合的作用,仅仅成为‘内容‘

而安全测试人员要绕过这个转义处理,使单引号发挥作用,有两个思路:

1.让斜杠(\)失去作用(对反斜杠(\)转义,使其失去转义单引号的作用,成为‘内容’)

2.让斜杠(\)消失(宽字节注入)

 

 %df    %5c   组合出了一个  運 字,这样就达到了让反斜杠消失的目的,进而使单引号发挥作用。

以下为URL编码:

%27---------单引号(')

%20----------空格

%23-----------#号(#)

%5c------------反斜杠(\)

sqli靶场演示

在id=1后边输入单引号,发现系统使用反斜杠将单引号进行了转义,使其成为‘内容’。

在id=1后边输入%df',sql语句报错,说明单引号发挥了作用,反斜杠%5c与%df组合成了一个汉字。接下来就可以正常注入了。

防御

1.使用mysql_set_charset(utf8)指定字符集

2.gbk编码造成的宽字符注入问题,解决方法是设置character_set_client=binary。

3.矫正人们对于mysql_real_escape_string的误解,单独调用set names gbk和mysql_real_escape_string是无法避免宽字符注入问题的。还得调用mysql_set_charset来设置一下字符集。

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-07-01 21:09  弟中第  阅读(418)  评论(0)    收藏  举报