sql注入中最关键的一步就是将引号进行闭合,而常见的addslashes()函数、mysql_escape_string函数、get_magic_quotes_gpc()函数、mysql_real_escape_string()函数的使用将引号进行了转义,这时我们要绕过这些函数进行注入,宽字节注入就是其中一种方法。
何时能进行宽字节注入
1.mysql数据库使用GBK编码
2.对引号进行了转义(加\)
特殊情况:
1.数据库使用了安全的编码模式
2.使用了iconv() 函数进行一些特殊的编码转换(utf-8-->utf-16,GBK-->utf-8等)
宽字节注入原理
在数据库设置mysql_set_charset(“gbk”)即使用GBK编码时,输入字符的ASCII码大于128(到达汉字的范围)会将这个字符以及后面的一个字符当作一个汉字去识别。在转义 ' 时,通常是将其转换为\',url编码后为%5c%27,我们如果要绕过,就得把\过滤掉。常用的方法就是在%5c%27之前加%df,由于%df的ASCII码为223,数据库会将%df%5c当成一个汉字“連”,%27成功逃逸。(其中%df可以换成ASCII码大于128的字符)
特殊情况中,iconv()函数解析错误导致在编码转换时\被吃掉。
例子
sqlilabs中less32-37都可以使用宽字节注入进行绕过
Less-32
payload:
http://localhost/sqli-labs-master/Less-32/?id=-1%df%27union%20select%201,database(),user()--+
由下方hint和hex可知%df%5c被当成一个汉字�去处理了,从而引号逃逸。
Less-34
payload:
uname=-1%df' union select 1,2#&passwd=admin&submit=Submit
与get不同的是,post传参时数据不会经过urlencode,所以我们要写成%df'形式。
特殊情况
在sqlilabs Less-32文件中找到mysql_query("SET NAMES gbk");修改为mysql_query("SET NAMES utf8");再添加iconv函数将gbk转换成utf-8的话才会产生宽字节注入。