一、使用条件
1、数据库使用GBK编码
2、使用了addslashes()
函数
addslashes()
函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号(’)
- 双引号(”)
- 反斜杠(\)
- NULL
二、注入过程
1、确认是否为宽字节注入
假如有回显,我们可以直接使用单引号探测,观察回显结果中单引号前是否有反斜杠。或者当我们有部分源码时,可以直接观察是否使用addslashes()
函数。

2、使单引号逃逸
例如:
http://localhost:8899/sqli-lab/Less-33/index.php?id=-1%df' union select 1,database(),user()--+
我们知道,\'
的URL编码为%5c%27
,我们在前面再添加一个%df
,由于GBK编码的特性会将两个字节当做一个字符,所以%df%5c
会被当成一个汉字,即“運”。然后单引号%27
就被独立出来了,可以正常使用。
3、表名的单引号转义
当我们要使用表名时,我们在表名外面加上单引号,例如'tzy'
,但是这个时候就不能再用宽字节了,不然构造出来的汉字就会破坏数据库名字。这个时候我们有两种解决方法:
(1)使用database()
直接使用database()
代替数据库名,是等价的
(2)使用十六进制编码数据库名
编码为十六进制后可以直接使用
那么爆列名等时候要使用表名也是同样的操作了。
4、使用sqlmap实现宽字节注入
宽字节注入也可以直接使用sqlmap,我们只需要在单引号前加上%df
,然后指定数据库名称即可,例如:
python sqlmap.py -u http://localhost:8899/sqli-lab/Less-33/index.php?id=1%df%27 -D "security" --tables