正则表达式注入攻击详解
字数 952 2025-11-29 01:56:35

正则表达式注入攻击详解

正则表达式注入(Regex Injection)是一种通过操纵正则表达式模式或输入数据,使正则引擎进入异常状态(如灾难性回溯),导致服务拒绝(ReDoS)或信息泄露的攻击方式。它与代码注入不同,攻击目标不是执行代码,而是破坏正则引擎的性能或逻辑。

一、攻击原理

  1. 正则引擎的工作机制

    • 正则引擎(如PCRE、RE2)通过状态机匹配输入文本与模式。
    • 某些模式可能导致指数级回溯(例如嵌套量词(a+)+b),匹配时间随输入长度呈爆炸式增长。
  2. 注入点识别

    • 动态构建正则表达式:若用户输入被直接拼接到正则模式中(例如搜索功能中允许输入正则元字符),攻击者可插入恶意模式。
    • 可控的输入数据:即使模式固定,攻击者可能通过精心构造的输入触发回溯(例如向模式^(a+)+$提交aaaaaaaaX)。
  3. 灾难性回溯(Catastrophic Backtracking)

    • 示例模式:^(a+)+$
    • 输入"aaaaaaaaX"时,引擎会尝试所有可能的a+分组组合,最终匹配失败,但耗时极长。

二、攻击步骤

  1. 探测正则模式

    • 通过错误信息或响应时间差异推断服务器使用的正则表达式(例如提交.*(.*)*观察延迟)。
  2. 构造恶意输入

    • 若模式动态生成:提交.*$(?=.*))破坏模式结构,导致语法错误或逻辑绕过。
    • 若模式固定:针对量词嵌套提交长字符串+不匹配字符(如a?a?a?aaa匹配"aaaX")。
  3. 触发资源耗尽

    • 单次请求即可使CPU占用率飙升,导致服务不可用。

三、防御措施

  1. 避免动态构建正则表达式

    • 严格校验用户输入,过滤正则元字符(如.*+?{}[]()),或将其转义为字面值。
  2. 使用非回溯引擎

    • 换用线性时间引擎(如RE2),避免回溯问题。
  3. 设置超时机制

    • 限制单次正则匹配的最大时间(如Python的regex.set_timeout(0.1))。
  4. 简化正则模式

    • 避免嵌套量词、无限重复组(如(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}$"
    

通过控制正则模式或输入数据,攻击者可利用引擎缺陷引发拒绝服务。防御需结合输入过滤、引擎选型与超时控制,确保正则匹配的可靠性与性能。

正则表达式注入攻击详解 正则表达式注入(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) )。 简化正则模式 避免嵌套量词、无限重复组(如 (a+)* ),改用原子组 (?>...) 或占有量词 a++ 。 四、实例分析 漏洞代码(Python) : 修复方案 : 通过控制正则模式或输入数据,攻击者可利用引擎缺陷引发拒绝服务。防御需结合输入过滤、引擎选型与超时控制,确保正则匹配的可靠性与性能。