
# Snow Monkey Forms <= 12.0.3 – Nicht authentifizierte beliebige Dateilöschung über Path Traversal (CVE-2026-1056)
Dieses Repository enthält einen Proof of Concept (PoC) für eine kritische Schwachstelle im Snow Monkey Forms WordPress-Plugin (Versionen <= 12.0.3). Die Schwachstelle ermöglicht es einem nicht authentifizierten Angreifer, beliebige Dateien auf dem Server über Path Traversal zu löschen.
Referenz: Sarawut Poolkhet (MisterHelloz)
Snow_Monkey\Plugin\Forms\App\Rest\Route\View.php/wp-json/snow-monkey-form/v1/view)Die Schwachstelle befindet sich im REST-API-Handler unter Snow_Monkey\Plugin\Forms\App\Rest\Route\View.php. Die send()-Methode steuert den Ablauf basierend auf den vom Benutzer eingegebenen Parametern.
// Datei: App/Rest/Route/View.php
public function send() {
Csrf::save_token();
$method = Meta::get_method(); // Stammt aus $_POST['snow-monkey-forms-meta']['method']
// SCHWACHSTELLE: Wenn 'method' gleich 'input' ist, wird die kritische CSRF-Prüfung UMGEHEN.
if ( 'input' === $method ) {
return $this->_send(); // Direkter Ausführungsfluss zu _send()
}
// Die CSRF-Prüfung wird nur für andere Methoden durchgeführt (z. B. 'confirm', 'complete')
if ( ! Csrf::validate( Meta::get_token() ) ) { ... }
Durch die Angabe von input als Methodenparameter zwingt ein Angreifer die Anwendung, die Funktion _send() sofort auszuführen und dabei die Sicherheitskontrolle Csrf::validate() zu überspringen, die unbefugte Aktionen verhindern soll.
Innerhalb der _send()-Methode versucht die Anwendung, eine Bereinigungsroutine für benutzerspezifische temporäre Verzeichnisse durchzuführen. Diese Routine basiert auf dem Parameter formid.
// Datei: App/Rest/Route/View.php -> _send()
// 'form_id' stammt direkt aus POST-Daten über die Meta-Klasse ohne Bereinigung
$user_dirpath = Directory::generate_user_dirpath( $this->setting->get( 'form_id' ), false );
Directory::do_empty( $user_dirpath, true ); // Inhalte rekursiv löschen
Directory::remove( $user_dirpath ); // Das Verzeichnis selbst löschen
Der kritische Fehler liegt darin, wie Directory::generate_user_dirpath den Pfad konstruiert:
// Datei: App/Model/Directory.php
public static function generate_user_dirpath( $form_id, $do_create_directory = true ) {
$saved_token = Csrf::saved_token();
// ... (Regex-Prüfung für Token vorhanden, aber nicht für form_id) ...
$user_dir = path_join( static::get(), $saved_token );
// SCHWACHSTELLE: $form_id wird direkt angehängt.
// WordPress path_join() löst '../'-Sequenzen NICHT auf und bereinigt sie auch nicht.
$user_dir = path_join( $user_dir, (string) $form_id );
return $user_dir;
}
Die Variable $form_id wird in einen String umgewandelt, aber nie auf eine Ganzzahl validiert. Dadurch kann ein Angreifer Zeichen für Verzeichnis-Traversal (z. B. ../../../../) injizieren.
requests (pip install requests)python exploit.py -u <TARGET_URL> -f <TRAVERSAL_PAYLOAD>
