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, 侧信道攻击, 密码管理, 无后门, 逆向工具