绕过–宽字节注入攻击
宽字节注入攻击
由于sql注入的盛行,不少网站管理员都意识到了这种攻击方式的厉害,纷纷想出不少办法来避免,例如使用一些 Mysql 中转义的函数 addslashes,mysql_real_escape_string, mysql_escape_string等等。其实这些函数就是为了过滤用户输入的一些数据,对特殊的字符加上反斜杠“\”进行转义。
- Addslashes()函数:对get、post、cookie等传递的参数中的’、“、\、null等进行转义
- mysql_real_escape_string()函数:转义如\x00、\n、\r、\、’、“、\x1a等
- mysql_escape_string:注意,php5.3中已经不使用。
常用符号:
空格 :%20
单引号: %27
#: %23
\ :%5C
字符集:
在了解宽字节注入之前,我们先来看一看字符集是什么。字符集也叫字符编码,是一种将符号转换为二
进制数的映射关系。
几种常见的字符集:
-
ASCII 编码:单字节编码
-
latin1 编码:单字节编码
-
gbk 编码:一个字符占1个字节**,两个字节以上叫宽字节**,设置“set character_set_client=gbk”(gbk编码设置),通常导致编码转换的注入问题,尤其是使用php 连接mysql数据库的时候
一个gbk汉字占两个字节,取值范围是(编码位数):第一个字节是(129-254),第二个字节(64-254),
当设置gbk编码后,遇到连续两个字节,都符合gbk取值范围,会自动解析为一个汉字
-
UTF-8 编码:使用一至四字节编码, 0x00–0x7F 范围内是一位,和 ASCII 保持一致。其它字符用二至四个字节变长表示。 由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCII表示的字符使用UNICODE并不高效。因此出现了中间格式字符集&