1. 从一道CTF题说起:BabySQli 1的破局之旅
最近在带新人入门CTF,发现很多朋友卡在Web安全的第一道坎——SQL注入上,尤其是遇到各种过滤和限制时,往往就束手无策了。正好,BUUCTF平台上的那道“BabySQli 1”是个绝佳的入门教学案例。它没有复杂的二次注入或堆叠查询,核心就是考察你如何在一个看似“过滤”了关键字符的环境下,依然能完成注入,拿到flag。这道题之所以经典,是因为它把SQL注入绕过中最基础、也最考验思路的几种技巧,浓缩在了一个简单的登录框里。今天,我就以这道题为引子,掰开揉碎了聊聊,在实战中,当你的 union 、 select 甚至空格都被“ban”掉的时候,脑子里应该冒出哪些“骚操作”。这不仅仅是解一道题,更是理解WAF(Web应用防火墙)和开发者过滤逻辑的起点,理解了“绕”的原理,你才能从“脚本小子”进化到能真正思考的“白帽子”。
2. BabySQli 1 题目场景与初步侦察
题目通常是一个简单的登录页面,只有一个用户名(username)和密码(password)的输入框,以及一个提交按钮。我们的目标很明确:绕过登录验证,以管理员或特定用户身份登录,从而获取flag。
2.1 第一步:经典探测与碰壁
拿到这种登录框,老手的肌肉记忆就是先试试万能密码。比如在用户名处输入 admin' or '1'='1 ,密码随意。如果后端SQL语句是 SELECT * FROM users WHERE username='$username' AND password='$password' ,那么拼接后就变成了 SELECT * FROM users WHERE username='admin' or '1'='1' AND password='xxx' 。由于 '1'='1' 恒真,这条语句很可能返回用户表中的第一条记录(通常是管理员),从而实现绕过。
但在BabySQli 1里,你这么干,大概率会得到一个错误页面,或者一个固定的错误提示(比如“wrong user”)。这说明什么?说明我们的单引号 ' 或者 or 这类关键词可能被检测并处理了。这是我们的第一个信号:存在过滤。
接下来,我们需要判断过滤的强度和范围。一个系统性的探测方法是使用“差分探测”:
- 探测空格处理 :输入
admin(正常)和admin(中间带空格)。观察返回是否相同。如果带空格返回错误,可能空格被过滤或转义。 - 探测关键词 :尝试
admin' AND '1'='1和admin' ANANDD '1'='1。如果后者能通过而前者报错,说明AND被作为一个整体关键词过滤了。同样测试OR、UNION、SELECT、FROM、WHERE等。 - 探测注释符 :尝试
admin'--或admin'#。注释符能帮我们截断后面的SQL语句,是注入的利器。如果加了注释符反而报错,说明注释符可能被过滤或转义。 - 探测引号闭合 :这是判断注入类型的关键。尝试
admin'和admin\'。如果admin'报错而admin\'不报错,说明后端使用了addslashes()或mysql_real_escape_string()等函数对单引号进行了转义(在前面加反斜杠\),那么单引号注入就可能走不通,需要考虑数字型注入或宽字节注入等。
在BabySQli 1的实战中,经过简单测试,你可能会发现:直接使用 union select 会失败,页面返回异常。但使用 union 和 select 之间插入一些东西,比如 union/**/select ,却可能成功。这就引出了我们的第一个绕过技巧: 注释符混淆 。
实操心得 :永远不要只试一次就下结论。Web应用对输入的处理可能有多个环节(前端JS验证、后端WAF、后端代码过滤、数据库自身),返回的错误信息也各不相同。有的会直接显示数据库错误(这是最友好的),有的返回统一的错误页,有的甚至返回200状态码但内容不同。你需要像法医一样,对比正常请求和异常请求在响应时间、响应体长度、响应内容上的细微差别。Burp Suite的Repeater模块和Diff功能是干这活的“神器”。
2.2 绕过思路的起点:理解过滤的本质
开发者和WAF过滤SQL注入,通常有几种手段:
- 黑名单 :维护一个“坏词”列表(如
union,select,or,and,sleep,benchmark,',",#,--等),发现输入中包含这些词就进行拦截(直接拒绝、替换为空、替换为其他字符)。这是最常见但也最容易被绕过的方式。 - 白名单 :只允许输入符合特定格式的字符(如仅限字母数字)。这种防御很强,但有时过于严格影响用户体验。
- 转义 :对特殊字符(如引号、反斜杠)前面加上转义符,使其失去特殊含义,变成普通字符。
- 预编译语句(参数化查询) :这是从根本上杜绝SQL注入的最佳实践,将SQL语句结构与数据分离。如果题目用了这个,那通常就不是考绕过了,而是考其他漏洞(如二次注入)。
BabySQli 1的过滤,从现象看,更像是一种“懒惰”或“不完善”的黑名单过滤。它可能只是简单地用正则表达式匹配 union select 这样的连续关键词,却没有考虑到攻击者可以用多种方式将它们“拆开”。
3. 核心绕过技巧详解:从注释符到编码变异
当我们确认存在基于关键词的过滤后,脑子里就应该有一个“工具箱”。下面我结合BabySQli 1和其他CTF、实战场景,把这些技巧一个个拿出来讲透。
3.1 注释符的妙用:不只是注释
注释符在SQL注入中扮演着“瑞士军刀”的角色。最常见的注释符有:
<

3624

被折叠的 条评论
为什么被折叠?



