正则表达式注入攻击详解
字数 952 2025-11-29 01:56:35
正则表达式注入攻击详解
正则表达式注入(Regex Injection)是一种通过操纵正则表达式模式或输入数据,使正则引擎进入异常状态(如灾难性回溯),导致服务拒绝(ReDoS)或信息泄露的攻击方式。它与代码注入不同,攻击目标不是执行代码,而是破坏正则引擎的性能或逻辑。
一、攻击原理
-
正则引擎的工作机制
- 正则引擎(如PCRE、RE2)通过状态机匹配输入文本与模式。
- 某些模式可能导致指数级回溯(例如嵌套量词
(a+)+b),匹配时间随输入长度呈爆炸式增长。
-
注入点识别
- 动态构建正则表达式:若用户输入被直接拼接到正则模式中(例如搜索功能中允许输入正则元字符),攻击者可插入恶意模式。
- 可控的输入数据:即使模式固定,攻击者可能通过精心构造的输入触发回溯(例如向模式
^(a+)+$提交aaaaaaaaX)。
-
灾难性回溯(Catastrophic Backtracking)
- 示例模式:
^(a+)+$ - 输入
"aaaaaaaaX"时,引擎会尝试所有可能的a+分组组合,最终匹配失败,但耗时极长。
- 示例模式:
二、攻击步骤
-
探测正则模式
- 通过错误信息或响应时间差异推断服务器使用的正则表达式(例如提交
.*(.*)*观察延迟)。
- 通过错误信息或响应时间差异推断服务器使用的正则表达式(例如提交
-
构造恶意输入
- 若模式动态生成:提交
.*$或(?=.*))破坏模式结构,导致语法错误或逻辑绕过。 - 若模式固定:针对量词嵌套提交长字符串+不匹配字符(如
a?a?a?aaa匹配"aaaX")。
- 若模式动态生成:提交
-
触发资源耗尽
- 单次请求即可使CPU占用率飙升,导致服务不可用。
三、防御措施
-
避免动态构建正则表达式
- 严格校验用户输入,过滤正则元字符(如
.*+?{}[]()),或将其转义为字面值。
- 严格校验用户输入,过滤正则元字符(如
-
使用非回溯引擎
- 换用线性时间引擎(如RE2),避免回溯问题。
-
设置超时机制
- 限制单次正则匹配的最大时间(如Python的
regex.set_timeout(0.1))。
- 限制单次正则匹配的最大时间(如Python的
-
简化正则模式
- 避免嵌套量词、无限重复组(如
(a+)*),改用原子组(?>...)或占有量词a++。
- 避免嵌套量词、无限重复组(如
四、实例分析
- 漏洞代码(Python):
import re user_input = input("搜索内容: ") # 用户输入".*.*.*.*.*.*.*.*.*.*.*.*" pattern = f"^{user_input}$" # 动态拼接模式 re.match(pattern, "test") # 触发回溯 - 修复方案:
user_input = re.escape(user_input) # 转义元字符 pattern = f"^{user_input}$"
通过控制正则模式或输入数据,攻击者可利用引擎缺陷引发拒绝服务。防御需结合输入过滤、引擎选型与超时控制,确保正则匹配的可靠性与性能。