插件窝 干货文章 SQL注入中宽字节注入是什么

SQL注入中宽字节注入是什么

编码 转义 字节 使用 438    来源:    2025-04-24

宽字节注入(SQL Injection)详解

宽字节注入是一种特殊类型的SQL注入攻击,主要出现在使用GBK、GB2312、BIG5等多字节编码的系统中。这种注入利用了数据库和应用程序在处理宽字符(多字节字符)时的编码转换问题。

基本原理

  1. 编码背景:在GBK等编码中,某些字符由两个字节表示(如"運"的GBK编码是0xC55E)

  2. 转义机制:当应用程序使用addslashes()mysql_real_escape_string()等函数转义单引号时,会在单引号前添加反斜杠(0x5C)

  3. 漏洞成因:当系统将用户输入从某种编码(如UTF-8)转换为GBK时,可能将反斜杠(0x5C)与后续字节组合成一个有效的宽字符,从而"吃掉"转义字符

攻击示例

假设系统使用GBK编码,且存在以下SQL查询:

SELECT * FROM users WHERE username='$username' AND password='$password'

攻击者提交用户名:%df' OR 1=1 --

  1. 系统首先对输入转义:%df\' OR 1=1 -- → 反斜杠(0x5C)被添加
  2. 编码转换时,%df(0xDF)和\(0x5C)组合成GBK字符"運"(0xDF5C)
  3. 最终SQL变为:SELECT * FROM users WHERE username='運' OR 1=1 -- ' AND password='...'

防御措施

  1. 统一编码:使用UTF-8等统一编码,避免编码转换问题
  2. 参数化查询:使用预处理语句(Prepared Statements)而非字符串拼接
  3. 安全函数:使用mysql_real_escape_string()而非addslashes()
  4. 字符集设置:明确设置连接字符集,如SET NAMES 'gbk'
  5. 过滤检查:对输入进行严格过滤和验证

实际案例

// 存在漏洞的代码示例
$conn = mysql_connect("localhost", "user", "pass");
mysql_query("SET NAMES 'gbk'", $conn);
$user = mysql_real_escape_string($_GET['user']);
$sql = "SELECT * FROM users WHERE user='$user'";

攻击者可以构造特殊输入绕过转义,如:%df%27%20OR%201=1%23

总结

宽字节注入利用了编码转换过程中的特殊行为,使得传统的转义机制失效。防御的关键在于统一编码、使用参数化查询和正确设置数据库连接字符集。