1.什么是宽字节注入
宽字节注入(Wide Byte Injection)是一种常见的SQL注入攻击技术,主要针对使用宽字节字符集(如GBK、GB2312等)的Web应用程序。以下是其核心原理和特点:
1. 技术原理
- 字符编码差异 :宽字节字符集(如GBK)使用2个字节表示一个字符,而ASCII编码使用1个字节。
- 转义字符被"吃掉" :当应用程序使用单引号( ' )作为SQL查询的参数边界时,通常会通过添加反斜杠( \ )进行转义。但在宽字节环境下,攻击者可以输入一个特殊字符(如 %df ),使其与转义字符 \ (十六进制为 %5c )组合成一个有效的GBK字符(如 %df%5c 对应GBK中的"運"字),从而使转义失效。
2. 攻击过程
- 输入特殊字符 :攻击者在输入框中提交包含宽字节编码的payload,如 %df' OR 1=1# 。
- 转义被绕过 :后端代码对单引号进行转义,变为 %df' OR 1=1# ,但 %df%5c 会被解析为一个GBK字符,导致单引号未被转义。
- SQL注入成功 :最终执行的SQL语句可能变为 SELECT * FROM users WHERE username='運' OR 1=1#' ,从而绕过身份验证或获取敏感数据。
2.怎么判断是否为宽字节注入
1. 检查目标网站的字符编码
宽字节注入仅在使用 宽字节字符集 (如GBK、GB2312、Big5等)的环境下可能发生。若网站使用UTF-8编码,通常不会触发该漏洞。 检测方法 :
- 查看HTTP响应头的 Content-Type 字段,例如: Content-Type: text/html; charset=gbk 。
- 查看页面源码中的 标签,例如: 。
2. 测试单引号转义情况
宽字节注入的前提是应用程序对单引号( ' )进行转义(通常添加反斜杠 \ )。首先测试单引号是否被转义: 操作 :
- 在输入框(如登录、搜索框)中输入单引号 ' ,提交后观察响应。 预期结果 :
- 若返回SQL语法错误(如 You have an error in your SQL syntax ),说明单引号未被转义,可能存在普通SQL注入,但不是宽字节注入。
- 若无错误(可能被转义为 ' ),则继续下一步测试。
3. 尝试宽字节字符绕过转义
核心测试步骤:利用宽字节编码(如GBK)将转义字符 \ (十六进制为 %5c )“吃掉”,使单引号恢复为未转义状态。 操作 :
- 输入宽字节字符+单引号的组合,例如: %df' ( %df 是GBK编码中常见的高位字节)。 原理 :若后端使用GBK编码, %df (十六进制)会与转义的 \ ( %5c )组合成一个有效的GBK字符(如 %df%5c 对应GBK中的“運”字),导致单引号 ' 未被转义。 预期结果 :
- 若返回SQL语法错误(如 You have an error in your SQL syntax ),说明宽字节注入漏洞存在。
- 若无错误,可能是其他防护机制(如参数化查询)或字符编码不是宽字节。
4. 验证SQL注入效果
若第3步出现SQL错误,可进一步构造payload验证注入是否成功: 操作 :
- 输入 %df' OR 1=1# ,提交后观察响应。 预期结果 :
- 若返回所有数据(如登录成功、显示所有记录),说明注入成功。
- 若返回与正常请求不同的结果,也可确认漏洞存在。
评论区
评论加载中...