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} ``` ## 截图 ### 登录页面 ![登录页面](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/ed72e3596b105702.png) ### 使用有效凭证登录 ![使用 khalid 登录](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/0980532654105707.png) ### CyLab 终端中的脚本输出 ![CyLab 终端](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8d6f813be3105714.png) ### 捕获的 Flag ![Flag](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/d6a7eb6787105718.png) ## 漏洞类别 这属于 **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漏洞利用, 凭证爆破, 时间窗口重置漏洞, 暴力破解, 源码审计, 登录安全, 网络攻防, 蓝队分析, 身份验证绕过, 逆向工具, 速率限制绕过, 锁定机制绕过