宽字节注入
原理
利用mysql特性, 在使用GBK编码时将/进行转义
ASCII码传输中文是会变成字符串: utf-8, GBK(宽字节注入, 默认两个字节为一个汉字)
URL 转码
十六进制形式
- 空格 %20
- ' %27
- # %23
- \ %5C
如何从addslashes函数中逃逸
addslashes -
在GBK编码中, 会使用addslashes函数(在传入值中插入“/”以转义)
如何逃逸
- 将\转义
- 把\弄没
e.g.
注入 http://192.168.3.23/wide/0x01/index.php?id=2 时, 在后面加' 变成
http://192.168.3.23/wide/0x01/index.php?id=2', 数据库并没有报错
原因: addslashes()已经把我们提交的单引号给转义了
因为我们的目的是让单引号溢出而使数据库报错,但是现在单引号被转义了所以变成了"2'".
按照GBK的编码算法, 我们输入的是2%5C%27
- %5C是addlashes()添加的/
- %27是希望逃逸的单引号
解决方法: 因为GBK编码默认两个字符为一个汉字, 我们可以通过输入宽字符%df使反斜杠和这个%df形成一个汉字,这样后面的单引号就不会被转义而达到逃逸的效果
输入http://192.168.3.23/wide/0x01/index.php?id=2%df'
这时,根据GBK编码,输入的内容为2%df%5C%27
这时, %df和%5C组成了汉字 運 查询就变为2運',单引号成功逃逸