宽字节注入是一种特殊类型的SQL注入攻击,主要出现在使用GBK、GB2312、BIG5等多字节编码的系统中。这种注入利用了数据库和应用程序在处理宽字符(多字节字符)时的编码转换问题。
编码背景:在GBK等编码中,某些字符由两个字节表示(如"運"的GBK编码是0xC55E)
转义机制:当应用程序使用addslashes()
或mysql_real_escape_string()
等函数转义单引号时,会在单引号前添加反斜杠(0x5C)
漏洞成因:当系统将用户输入从某种编码(如UTF-8)转换为GBK时,可能将反斜杠(0x5C)与后续字节组合成一个有效的宽字符,从而"吃掉"转义字符
假设系统使用GBK编码,且存在以下SQL查询:
SELECT * FROM users WHERE username='$username' AND password='$password'
攻击者提交用户名:%df' OR 1=1 --
%df\' OR 1=1 --
→ 反斜杠(0x5C)被添加%df
(0xDF)和\
(0x5C)组合成GBK字符"運"(0xDF5C)SELECT * FROM users WHERE username='運' OR 1=1 -- ' AND password='...'
mysql_real_escape_string()
而非addslashes()
SET NAMES 'gbk'
// 存在漏洞的代码示例
$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
宽字节注入利用了编码转换过程中的特殊行为,使得传统的转义机制失效。防御的关键在于统一编码、使用参数化查询和正确设置数据库连接字符集。