宽字节注入(GBK注入)是一种针对使用GBK/GB2312等宽字符集编码的数据库系统的SQL注入技术。其核心在于利用数据库对字符编码的解析特性,绕过转义符(如反斜杠\)的过滤,从而注入恶意SQL语句。主要攻击场景为PHP+MySQL架构且开启magic_quotes_gpc或使用addslashes()转义的场景。


一、原理

核心机制:双字节吞并转义符

  1. 转义符问题

    • 当用户输入单引号 ' 时,PHP的addslashes()会将其转义为 \'(即%5C%27
  2. 宽字节漏洞

    • GBK编码中,%df%5C 被解析为一个繁体字 “運”(%df%5c
    • 构造 %df' → 转义为 %df\'(即 %df%5c%27) → 数据库将 %df%5c 识别为汉字 “遀”,剩余 %27(单引号)逃逸

编码漏洞链

用户输入:%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

在这里插入图片描述
以下步骤与上篇类似,此处不再重复。

三、防御方案

  1. 统一字符集
    mysql_set_charset('utf8mb4');  // PHP中强制UTF8
    
  2. 禁用宽字节
    ini_set('mbstring.substitute_character', "none");  
    mbstring.internal_encoding = 'UTF-8';
    
  3. 转义符优化
    // 使用mysql_real_escape_string() 而非 addslashes()
    $id = mysql_real_escape_string($_GET['id']);
    
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐