6876h9/fool-the-lockout
GitHub: 6876h9/fool-the-lockout
针对 Web 限速机制的绕过利用脚本,通过分析 Flask 源码逻辑,利用固定时间窗口重置漏洞实现无限制的凭证爆破。
Stars: 0 | Forks: 0
# 绕过锁定
**平台:** CyLab Security Academy(原 picoCTF)
**分类:** Web Exploitation
**难度:** Medium
**解题数:** 1,845
**作者:** David Gaviria
**题解由:** [6876h9](https://github.com/6876h9) 提供
**Flag:** `picoCTF{f00l_7h4t_l1m1t3r_011089cc}`
## 题目描述
## 提供的文件
| 文件 | 描述 |
|------|-------------|
| `app.py` | 目标应用的完整 Flask 源代码 |
| `creds-dump.txt` | 100 组 `username;password` 凭证对 |
## 源代码分析
`app.py` 中的限速器由三个常量定义:
```
MAX_REQUESTS = 10 # max failed attempts before lockout
EPOCH_DURATION = 30 # time window in seconds
LOCKOUT_DURATION = 120 # lockout duration in seconds
```
`exceeded_rate_limit()` 函数使用 `request.remote_addr` 跟踪每个 IP 的失败尝试次数。每次向 `/login` 发送 POST 请求都会增加客户端 IP 的计数器。一旦该计数器在单个时间窗口内超过 `MAX_REQUESTS`,该 IP 将被锁定 `LOCKOUT_DURATION` 秒。
**关键缺陷**在于 `refresh_request_rates_db()` 函数:
```
if curr_time - epoch_start_time > EPOCH_DURATION:
request_rates[client_ip]["num_requests"] = 0
request_rates[client_ip]["epoch_start"] = -1
```
经过 30 秒后,计数器会被完全重置为零。各时间窗口之间没有持久化的跟踪记录。这意味着攻击者可以在每个 30 秒的窗口内无限期地发送多达 9 次尝试——永远不会达到 10 次的锁定阈值。
代码中没有信任 `X-Forwarded-For` 头,因此伪造 IP 头并不是此处的攻击向量。该漏洞纯粹出在时间窗口重置逻辑上。
## 漏洞利用
策略如下:
1. 从 `creds-dump.txt` 加载所有 100 个凭证对。
2. 发送 **9 次登录尝试**(比 10 次的阈值少 1 次)。
3. 等待 **31 秒**(超过 30 秒时间窗口边界 1 秒)。
4. 重复上述步骤,直到收到 `302 Found` 重定向,这标志着登录成功。
5. 捕获会话 cookie 并获取主页以提取 flag。
### 运行解题脚本
```
# 安装依赖
pip install requests
# 运行 (在 solve.py 中更新 TARGET 以匹配你的实例 URL)
python3 solve.py
```
### 预期输出
```
[*] Loaded 100 credential pairs.
[*] Batch size: 9 | Sleep between batches: 31s
[ 1/100] rora:winner1 -> HTTP 200
[ 2/100] birendra:rumble -> HTTP 200
[ 3/100] khalid:sting -> HTTP 302
[+] Valid credentials found: khalid:sting
[+] Flag: picoCTF{f00l_7h4t_l1m1t3r_011089cc}
```
## 截图
### 登录页面

### 使用有效凭证登录

### CyLab 终端中的脚本输出

### 捕获的 Flag

## 漏洞类别
这属于 **CWE-799:交互频率控制不当**,更具体地说是 **CWE-307:对过度身份验证尝试的不当限制**。
根本原因在于,限速器在固定的时间窗口边界上重置其计数器,而不是使用滑动窗口。滑动窗口(单独跟踪每次尝试的时间戳)将完全防止这种情况发生,因为旧的尝试只会逐个过期,而不是一次性全部失效。
正确的实现还应考虑:
- 跨服务器重启的持久化存储(当前的字典仅存在于内存中)
- 除了 IP 级别的锁定之外,还应实施账户级别的锁定,以应对分布式攻击
- 在没有经过负载均衡器级别验证的情况下,绝不要将客户端提供的请求头(`X-Forwarded-For`、`X-Real-IP`)用于安全决策
## Flag
```
picoCTF{f00l_7h4t_l1m1t3r_011089cc}
```
标签:CISA项目, Credential Stuffing, CTF Writeup, Epoch重置, Flask安全, picoCTF, PoC, Web Exploitation, Web安全, Web漏洞利用, 凭证爆破, 时间窗口重置漏洞, 暴力破解, 源码审计, 登录安全, 网络攻防, 蓝队分析, 身份验证绕过, 逆向工具, 速率限制绕过, 锁定机制绕过