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

SQL注入中宽字节注入是什么
最新回答
遠看男神近看男神經

2020-09-08 01:48:18

宽字节注入是SQL注入的一种特殊绕过方式,其核心原理是利用数据库编码对多字节字符的解析特性,绕过安全防护机制(如转义函数)实现注入攻击。

一、宽字节注入的底层机制
当数据库使用多字节编码(如GBK、BIG5)时,某些字符由两个字节组成。攻击者通过构造特定宽字节(如%df),可与数据库转义字符(如)组合形成合法多字节字符。例如,在GBK编码中,的十六进制为0x5c,若攻击者输入%df%27(%27是单引号'的URL编码),0xdf与0x5c会被数据库解析为汉字“运”,导致原本被转义的单引号恢复活性,从而闭合SQL语句并注入恶意代码。

二、关键防护绕过场景
以addslashes()函数为例,该函数会在单引号、双引号等字符前添加反斜杠进行转义。但在宽字节编码下,若用户输入%df',经过URL解码后为0xdf 0x27,addslashes()会将其转为0xdf 0x5c 0x27。此时,0xdf 0x5c被数据库识别为合法汉字,单引号0x27未被转义,从而绕过防护机制。这种绕过方式常见于PHP等使用addslashes()或magic_quotes_gpc的旧系统。

三、典型攻击流程

  1. 探测编码类型:通过页面响应或请求头确认数据库使用GBK、BIG5等宽字节编码。
  2. 构造注入payload:输入%df'等组合,观察是否因引号未闭合导致SQL错误。
  3. 自动化工具利用:使用SQLmap等工具,通过--tamper脚本注入宽字节payload(如%df%27)。
  4. 数据提取:若目标字段(如密码)采用MD5等弱加密,可直接解密获取敏感信息。

四、防御措施

  1. 统一使用UTF-8编码:UTF-8中反斜杠0x5c不会与其他字节组成合法字符,可阻断宽字节注入。
  2. 参数化查询:使用预编译语句(如PDO、MySQLi)彻底分离SQL逻辑与数据。
  3. 过滤特殊字符:对输入数据严格校验,禁止非预期字符(如%、)的传入。

:GB2312因字符集范围较小,通常不存在宽字节注入风险,但GBK、BIG5等编码需重点防范。