宽字节注入
听某同学说这是某安全厂商的一道面试题,果断复习巩固,以备将来不时之需。
概念解释
宽字节:某字符的大小为两个字节(所有英文默认占一个字节,汉字占两个字节)
宽字节注入:是因为数据库使用了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来设置一下字符集。

浙公网安备 33010602011771号