在Web安全领域,SQL注入的攻防是一场持续的技术博弈。当基础的注入方法被防御机制(如WAF、输入过滤器)阻挡时,攻击者会采用各种精妙的技巧来绕过这些限制。

下面这个表格汇总了主要的绕过技巧及其核心思路,可以让你快速建立起整体认知。

绕过类别

核心思路

典型方法举例

关键字混淆

干扰WAF或过滤器对恶意关键词(如UNION, SELECT)的识别。

大小写混合、内联注释、双写关键字、注释分割关键词。

空白符替代

当空格被过滤时,使用其他字符或符号充当分隔符。

使用注释/**/、制表符等控制字符、括号。

字符编码

对载荷进行编码,绕过基于字符串匹配的过滤。

URL编码、十六进制编码、Unicode编码、使用CHAR()函数。

语法替换

使用功能相同但写法不同的SQL语法或函数。

LIKE/IN替换=、用FROM...FOR替代SUBSTR()中的逗号、用OFFSET替代LIMIT中的逗号、逻辑运算符替换。

特殊攻击

利用特定环境配置(如字符集)实现绕过。

宽字节注入、HTTP参数污染。

💡 关键技巧详解与举例

了解大类后,我们通过一些具体场景和例子来加深理解。

1. 混淆与分割关键字

这是应对简单黑名单过滤的有效方法。

  • 大小写混合:如果过滤器只检测小写的select,可以尝试SeLeCt

  • 内联注释:在MySQL中,/*!SELECT*/会被正常执行。这常被用来分割关键字,例如 UNI/*!12345ON*/ SEL/*!12345ECT*/,其中的数字可以指定MySQL版本限制。

  • 双写关键字:如果过滤器是将union替换为空字符串,那么输入 ununionion在经过替换后,剩下的部分正好是 union,从而绕过检查。

2. 替代空白符与逗号

在盲注等场景中,绕过对空格和逗号的限制至关重要。

  • 空白符替代:除了常用的 /**/,还可以使用制表符 (%09)、换行符 (%0a) 等。此外,利用括号也可以避免使用空格,例如 ?id=1 and(1=1)

  • 绕过逗号:对于 SUBSTR(str, 1, 1)这样的函数,可以使用 SUBSTR(str FROM 1 FOR 1)的语法来避免逗号。对于 LIMIT 0,1,则可以改写为 LIMIT 1 OFFSET 0

3. 编码与特殊字符
  • 十六进制编码:当引号被过滤时,可以将字符串转换为十六进制。例如,查询 users表时,可以将 "users"替换为 0x7573657273,这样查询条件可写为 table_name=0x7573657273,避免了使用引号。

  • 宽字节注入:这种技巧主要针对使用addslashes等函数对单引号进行转义(将 '转为 \'),且数据库连接使用GBK等宽字符集的情况。通过输入 %df%27%df会和转义符号\`(编码为%5c)结合成一个汉字“運”,从而使单引号%27`逃逸出来,造成注入。

🛡️ 实战思维:如何系统性地测试绕过方法

面对一道存在过滤的SQL注入题,可以遵循以下思路:

  1. 信息收集:首先判断注入类型(数字型/字符型)和存在的过滤规则。通过提交简单的 'and 1=1union select等 payload,观察服务器的返回错误信息或拦截提示,初步了解过滤器拦截了哪些关键词和字符。

  2. 模糊测试:系统地尝试各种绕过技巧。可以从简单的空格替代(如/**/)和大小写变换开始,如果不行,再逐步尝试内联注释、编码等方式。

  3. 逐步构造:成功绕过对关键字的检测后,还需要处理语法细节。例如,如果union select被成功绕过,但逗号被过滤,那么在联合查询中就需要使用 JOIN语法或者 FROM...FOR语法来替代。

  4. 自动化工具sqlmap这类工具内置了很多绕过脚本(tamper script),例如 space2comment.py(空格替换为注释)、charencode.py(字符编码)等,可以在手动测试有思路后,利用工具提高效率。

💎 总结

SQL注入的绕过技术多种多样,其核心在于利用WAF/过滤器与应用后端SQL解析器之间的差异。防御方通常采用正则表达式进行模式匹配,而攻击者则通过变形、分割、编码等方式,使得恶意载荷在防御方看来是“正常”的,却能顺利被数据库解析执行

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐