m-elmohands/simple-ReDos

GitHub: m-elmohands/simple-ReDos

一个基于正则表达式灾难性回溯的计时攻击PoC脚本,通过测量HTTP响应延迟逐字符提取远程服务器上的机密值。

Stars: 0 | Forks: 0

# ReDOS 计时攻击漏洞利用 ## 概述 此 Python 脚本演示了一种基于**正则表达式拒绝服务**的计时攻击,旨在从远程服务器中提取机密值。它利用正则表达式引擎中的**灾难性回溯**来创建可测量的计时侧信道。 ## 工作原理 ### 1. 漏洞:灾难性回溯 payload 使用嵌套量词发送精心构造的正则表达式模式: ``` ^(?=^.X)$(((.*)*)*)*salt$ ``` 关键组件 `(((.*)*)*)*` 在基于 NFA 的正则表达式引擎(如 Python 的 `re` 模块)中会产生**灾难性回溯**。当前瞻断言 `(?=^.{X})` 匹配成功时,引擎会尝试匹配后续模式。如果后续模式匹配失败(例如,猜测了错误的字符),嵌套量词会导致指数级回溯,消耗大量 CPU 时间并导致**HTTP 响应延迟**。 ### 2. 长度检测 (`get_length`) 脚本首先通过发送递增的长度值来确定机密值的长度: ``` payload = str(i) + "}$" # Results in: ^(?=^.{i}$)(((.*)*)*)*salt$ ``` 当 `i` 等于机密值的实际长度时,前瞻 `(?=^.{i}$)` 会匹配整个字符串。然后,引擎会尝试将 `(((.*)*)*)*salt$` 与空字符串进行匹配(因为前瞻不消耗字符),从而引发灾难性回溯并导致**响应延迟 ≥ 2 秒**。 ### 3. 字符暴力破解 (`brute_force`) 确定长度后,脚本会逐个字符提取机密值: ``` payload = str(i) + "}" + str(j) # Results in: ^(?=^.{i}j)(((.*)*)*)*salt$ ``` 对于每个位置 `i`,它会测试字符集中的每一个字符 `j`。当找到正确的字符时,前瞻匹配成功,从而触发回溯延迟。脚本会记录该字符并移至下一个位置。 ### 4. 字符集 用于暴力破解的字符集包括: - `_`, `!`, `&`, `$` - 所有 ASCII 字母(`a-z`, `A-Z`) - 所有数字(`0-9`) ## 环境要求 - Python 3.x - `requests` 库 ``` pip install requests ``` ## 配置说明 编辑脚本并设置目标 URL: ``` target_url = "https://target.example.com/vulnerable-endpoint" ``` 目标 endpoint 必须满足: 1. 接受带有表单数据的 `POST` 请求 2. 具有容易受到正则表达式注入攻击的参数(在本例中为 `license`) 3. 使用易受灾难性回溯影响的基于 NFA 的正则表达式引擎 ## 使用方法 ### 1. 设置目标 URL ``` target_url = "http://challenge.ctf/validate" ``` ### 2. 运行脚本 ``` python3 redos_exploit.py ``` ### 3. 预期输出 ``` Secret length is 32 Start in ReDOS Attack .... T Th Thi This ... ThisIsTheSecretFlag123 ``` ## 代码结构 | 函数 | 用途 | |----------|---------| | `postRequest(i, j, length)` | 构造并发送恶意 payload | | `get_length()` | 通过二分/计时侧信道确定机密值长度 | | `brute_force()` | 逐个字符提取机密值 | ## Payload 拆解分析 ### 长度检测 Payload ``` license=^(?=^.{N}$)(((.*)*)*)*salt$&check=Check ``` - `(?=^.{N}$)` — 断言字符串长度恰好为 N 个字符的前瞻 - `(((.*)*)*)*` — 灾难性回溯模式 - `salt$` — 在前瞻成功后强制模式匹配失败 ### 字符提取 Payload ``` license=^(?=^.{N}C)(((.*)*)*)*salt$&check=Check ``` - `(?=^.{N}C)` — 断言位置 N 处字符为 C 的前瞻 - 使用相同的回溯模式,在匹配时产生计时延迟 ## 故障排除 | 问题 | 解决方案 | |-------|----------| | 未检测到延迟 | 提高阈值(当前为 2 秒)。网络延迟可能需要进行调整。 | | 出现误报 | 提高延迟阈值,或为每个字符增加多个计时采样。 | | 连接错误 | 检查目标 URL 和网络连接。 | | 字符集错误 | 如果机密值包含特殊符号,请在 `list` 变量中添加额外的字符。 | ## 道德规范使用 此技术利用了正则表达式实现中的算法复杂性漏洞。请仅在以下情况下使用此脚本: - 针对您拥有或获得书面授权进行测试的系统 - 在 CTF(夺旗赛)比赛中 - 用于有适当监督的学术研究 未经授权访问计算机系统在包括《计算机欺诈和滥用法》(CFAA)及类似国际立法在内的法律下是非法行为。 ## 参考资料 - [OWASP ReDOS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS) - [灾难性回溯 (Regex101)](https://regex101.com/catastrophic) - [Web 应用中的计时攻击](https://cwe.mitre.org/data/definitions/208.html)
标签:Python, ReDoS, 侧信道攻击, 密码管理, 无后门, 逆向工具