SQL注入:从原理到实战,新手必防的“数据库漏洞杀手”(宽字节注入篇)
宽字节注入(GBK注入)是一种针对使用的数据库系统的SQL注入技术。其核心在于利用数据库对字符编码的解析特性,,从而注入恶意SQL语句。主要攻击场景为PHP+MySQL架构且开启或使用转义的场景。
·
宽字节注入(GBK注入)是一种针对使用GBK/GB2312等宽字符集编码的数据库系统的SQL注入技术。其核心在于利用数据库对字符编码的解析特性,绕过转义符(如反斜杠\)的过滤,从而注入恶意SQL语句。主要攻击场景为PHP+MySQL架构且开启magic_quotes_gpc或使用addslashes()转义的场景。
一、原理
核心机制:双字节吞并转义符
-
转义符问题:
- 当用户输入单引号
'时,PHP的addslashes()会将其转义为\'(即%5C%27)
- 当用户输入单引号
-
宽字节漏洞:
- GBK编码中,
%df%5C被解析为一个繁体字 “運”(%df%5c→遀) - 构造
%df'→ 转义为%df\'(即%df%5c%27) → 数据库将%df%5c识别为汉字 “遀”,剩余%27(单引号)逃逸
- GBK编码中,
编码漏洞链
用户输入:%df'
转义后: %df%5c%27
数据库解析:
%df%5c → 汉字"遀"(GBK编码)
%27 → 单引号'(未被转义)
最终形成注入:遀' and 1=1--+
二、注入流程
1. 判断是否存在注入
(1)输入1’,addslashes函数将 ’ 转义变为 ’ 。
(2)输入1%df’,‘转义为’,%df%5c进行结合变成"運",因此sql查询语句被改变,引起报错。
(3)将多余的 ’ 注释掉,按正常方法注入即可。
2. 获取表名
id=-1%df' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()%23

以下步骤与上篇类似,此处不再重复。
三、防御方案
- 统一字符集:
mysql_set_charset('utf8mb4'); // PHP中强制UTF8 - 禁用宽字节:
ini_set('mbstring.substitute_character', "none"); mbstring.internal_encoding = 'UTF-8'; - 转义符优化:
// 使用mysql_real_escape_string() 而非 addslashes() $id = mysql_real_escape_string($_GET['id']);
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)