Share
Beitragsbild zu Sicherheitswarnung: Über 10.000 WordPress-Websites durch Schwachstellen im Plugin „HT Contact Form“ gefährdet

Sicherheitswarnung: Über 10.000 WordPress-Websites durch Schwachstellen im Plugin „HT Contact Form“ gefährdet

26. Juli 2025

Laut einem aktuellen Bericht des Sicherheitsanbieters Wordfence sind mehr als 10.000 WordPress-Websites von schwerwiegenden Sicherheitslücken im Plugin „HT Contact Form“ betroffen.

Die erste Schwachstelle wurde am 24. Juni 2025 gemeldet. Sie erlaubt es nicht authentifizierten Angreifern, beliebige Dateien auf betroffenen Websites hochzuladen oder zu löschen – darunter auch kritische Konfigurationsdateien wie „wp-config.php“. Eine erfolgreiche Ausnutzung kann zur vollständigen Kompromittierung einer Website führen.

Am 4. Juli 2025 wurde eine weitere Sicherheitslücke bekannt: Diese ermöglicht das Verschieben beliebiger Dateien – ebenfalls ohne Authentifizierung. Auch hier könnten Angreifer zentrale Dateien manipulieren, um sich unbefugten Zugriff zu verschaffen oder die Seite funktionsunfähig zu machen.

Nach der Kontaktaufnahme durch Wordfence am 8. Juli hat sich das verantwortliche Entwicklerteam von HasTech IT am Folgetag beim Wordfence Vulnerability Management Portal registriert. Bereits am 13. Juli 2025 wurde ein Sicherheitspatch veröffentlicht.

Wordfence rät allen Nutzern des Plugins dringend, auf die aktuellste Version 2.2.2 zu aktualisieren, um ihre Websites vor potenziellen Angriffen zu schützen.

HT-Kontaktformular-Widget für Elementor Page Builder, Gutenberg-Blöcke und Formular-Builder. <= 2.2.1 – Unauthentifizierter Upload beliebiger Dateien.

CVSS-Bewertung: 9.8 (kritisch)

CVE-ID

CVE-2025-7340

Betroffene Versionen

<= 2.2.1

Gepatchte Version

2.2.2

Betroffene Software

HT Kontaktformular-Widget für Elementor Page Builder & Gutenberg Blocks & Form Builder.

Betroffene Software-Slug

ht-contactform

Das HT Contact Form Widget For Elementor Page Builder & Gutenberg Blocks & Form Builder-Plugin für WordPress ist aufgrund einer fehlenden Dateitypüberprüfung in der Funktion temp_file_upload() in allen Versionen bis einschließlich 2.2.1 anfällig für das Hochladen beliebiger Dateien. Dadurch können nicht authentifizierte Angreifer beliebige Dateien auf den Server der betroffenen Website hochladen, was die Ausführung von Remote-Code ermöglichen kann.

HT-Kontaktformular-Widget für Elementor Page Builder, Gutenberg-Blöcke und Formular-Builder. <= 2.2.1 – Unauthentifizierte Löschung beliebiger Dateien.

CVSS-Bewertung: 9.1 (kritisch)

CVE-ID

CVE-2025-7341

Betroffene Versionen

<= 2.2.1

Gepatchte Version

2.2.2

Betroffene Software

HT Kontaktformular-Widget für Elementor Page Builder & Gutenberg Blocks & Form Builder.

Betroffene Software-Slug

ht-contactform

Das HT Contact Form Widget For Elementor Page Builder & Gutenberg Blocks & Form Builder-Plugin für WordPress ist aufgrund einer unzureichenden Dateipfadvalidierung in der Funktion temp_file_delete() in allen Versionen bis einschließlich 2.2.1 anfällig für das Löschen beliebiger Dateien. Dadurch können nicht authentifizierte Angreifer beliebige Dateien auf dem Server löschen, was leicht zur Ausführung von Remote-Code führen kann, wenn die richtige Datei gelöscht wird (z. B. wp-config.php).

HT-Kontaktformular-Widget für Elementor Page Builder, Gutenberg-Blöcke und Formular-Builder. <= 2.2.1 – Verzeichnisdurchquerung zum Verschieben beliebiger Dateien.

CVSS-Bewertung: 9.1 (kritisch)

CVE-ID

CVE-2025-7360

Betroffene Versionen

<= 2.2.1

Gepatchte Version

2.2.2

Betroffene Software

HT Kontaktformular-Widget für Elementor Page Builder & Gutenberg Blocks & Form Builder.

Betroffene Software-Slug

ht-contactform

Das HT Contact Form Widget für Elementor Page Builder & Gutenberg Blocks & Form Builder-Plugin für WordPress ist aufgrund einer unzureichenden Dateipfadvalidierung in der Funktion handle_files_upload() in allen Versionen bis einschließlich 2.2.1 anfällig für das Verschieben beliebiger Dateien. Dadurch können nicht authentifizierte Angreifer beliebige Dateien auf dem Server verschieben, was leicht zur Ausführung von Remote-Code führen kann, wenn die richtige Datei verschoben wird (z. B. wp-config.php).

Technische Analyse Nr. 1: Beliebiger Datei-Upload

Eine Untersuchung des Codes zeigt, dass das Plugin die Funktion temp_file_upload() in der Klasse Ajax verwendet, um temporäre Datei-Uploads über AJAX zu verarbeiten.

59
60
61
62
63
64
65
66
67
68
69
public function temp_file_upload() {
    check_ajax_referer('ht_form_ajax_nonce', '_wpnonce');
    $file = $_FILES['ht_form_file'];
    // Check if file is present
    if (!isset($file)) {
        wp_send_json_error('No file uploaded.');
    }
    return $this->file_manager->temp_file_upload($file);
}

Diese Funktion ruft die Funktion temp_file_upload() in der Klasse FileManager auf, die die Datei mit der Funktion move_uploaded_file() in den temporären Ordner hochlädt.

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
public function temp_file_upload($file) {
    $destination = "{$this->dir}/temp";
    $this->maybe_create_directories($destination);
    // Validate file
    $validation = $this->validate($file);
    if (!$validation['valid']) {
        wp_send_json_error($validation['message']);
        return;
    }
    // Process the file
    $filename = $this->process_filename($file['name']);
    $file_path = "{$destination}/$filename";
    // Check if directory is writable
    if (!is_writable($destination)) {
        wp_send_json_error("Directory is not writable: {$destination}");
        return;
    }
    // Move file to temporary directory
    if (move_uploaded_file($file['tmp_name'], $file_path)) {
        wp_send_json_success([
            'file_id' => $filename,
            'file_name' => $file['name'],
            'file_size' => $file['size']
        ]);
        return;
    } else {
        $upload_error = error_get_last();
        wp_send_json_error('Failed to save uploaded file. Error: ' . ($upload_error ? $upload_error['message'] : 'Unknown error'));
        return;
    }
}

Darüber hinaus umfasst die Funktion in der anfälligen Version keine Überprüfung des Dateityps oder der Dateiendung. Das bedeutet, dass nicht nur sichere Dateitypen hochgeladen werden können, sondern auch .php-Dateien. Die Datei wird in den WordPress-Upload-Ordner hochgeladen, auf den standardmäßig öffentlich zugegriffen werden kann. Dadurch können nicht authentifizierte Angreifer beliebigen bösartigen PHP-Code hochladen und anschließend auf die Datei zugreifen, um eine Remote-Code-Ausführung auf dem Server auszulösen.

Wie bei allen Schwachstellen, die das Hochladen beliebiger Dateien ermöglichen, kann dies durch die Verwendung von Webshells und anderen Techniken zur vollständigen Kompromittierung der Website führen.

Der Patch

Der Hersteller hat dieses Problem behoben, indem er eine Dateityp-Prüfung mit der Funktion wp_check_filetype() in der Funktion temp_file_upload() hinzugefügt hat. Dadurch wird sichergestellt, dass nur sichere Dateitypen hochgeladen werden können.

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
public function temp_file_upload($file) {
    $destination = "{$this->dir}/temp";
    $this->maybe_create_directories($destination);
    // Validate file
    $validation = $this->validate($file);
    if (!$validation['valid']) {
        wp_send_json_error($validation['message']);
        return;
    }
    // Process the file
    $filename = $this->process_filename($file['name']);
    $file_path = "{$destination}/$filename";
    // File type validation check
    $validate = wp_check_filetype( $filename );
    if ($validate['type'] === false) {
        wp_send_json_error('Invalid file type.');
        return;
    }
    // Check if directory is writable
    if (!is_writable($destination)) {
        wp_send_json_error("Directory is not writable: {$destination}");
        return;
    }
    // Move file to temporary directory
    if (move_uploaded_file($file['tmp_name'], $file_path)) {
Technische Analyse Nr. 2: Willkürliche Dateilöschung

Eine Untersuchung des Codes zeigt, dass das Plugin die Funktion temp_file_delete() in der Klasse Ajax verwendet, um temporäre Dateien über AJAX zu löschen.

74
75
76
77
78
79
80
81
82
83
84
85
86
public function temp_file_delete() {
    check_ajax_referer('ht_form_ajax_nonce', '_wpnonce');
    $file_id = isset($_POST['ht_form_file_id']) ? sanitize_text_field(wp_unslash($_POST['ht_form_file_id'])) : '';
    if (!$file_id) {
        wp_send_json_error('No file ID provided');
    }
    if ($this->file_manager->temp_file_delete($file_id)) {
        wp_send_json_success();
    } else {
        wp_send_json_error('Failed to delete file');
    }
}

Diese Funktion ruft die Funktion temp_file_delete() in der Klasse FileManager auf, die temporäre Dateien aus dem temporären Ordner löscht.

104
105
106
107
108
109
110
111
public function temp_file_delete($file_id) {
    $file = "{$this->dir}/temp/$file_id";
    if (file_exists($file) && is_writable($file)) {
        @unlink($file);
        return true;
    }
    return false;
}

Leider wird der Parameter file_id nicht ordnungsgemäß validiert, sodass beliebige Pfade angegeben werden können.

Dadurch können nicht authentifizierte Angreifer beliebige Dateien auf dem Server löschen, einschließlich der Datei wp-config.php der Website. Durch das Löschen der Datei „wp-config.php“ wird die Website in einen Einrichtungszustand versetzt, sodass ein Angreifer die Kontrolle übernehmen kann, indem er sie auf eine Datenbank umleitet, die unter seiner Kontrolle steht. Dadurch erhält er Zugriff auf den Server der Website, wo weitere Infektionen stattfinden können.

Der Patch

Der Anbieter hat dieses Problem behoben, indem er die Funktion „sanitize_file_name()“ auf den Parameter „ht_form_file_id“ in der Funktion „temp_file_delete()“ angewendet hat.

74
75
76
77
78
79
80
81
82
83
84
85
86
public function temp_file_delete() {
    check_ajax_referer('ht_form_ajax_nonce', '_wpnonce');
    $file_id = isset($_POST['ht_form_file_id']) ? sanitize_file_name(wp_unslash($_POST['ht_form_file_id'])) : '';
    if (!$file_id) {
        wp_send_json_error('No file ID provided');
    }
    if ($this->file_manager->temp_file_delete($file_id)) {
        wp_send_json_success();
    } else {
        wp_send_json_error('Failed to delete file');
    }
}
Technische Analyse Nr. 3: Willkürliche Dateiverschiebung

Eine Untersuchung des Codes zeigt, dass das Plugin die Funktion upload_file() in der Klasse Submission verwendet, um Datei-Uploads für Formularübermittlungen zu verarbeiten.

443
444
445
446
447
448
449
450
451
452
453
454
455
456
public function handle_files_upload($form_data, $form) {
    foreach ($form['fields'] as $field) {
        if ($field['type'] === 'file_upload') {
            $destination = $field['settings']['upload_location'] ?? 'ht_form_default';
            $files = $form_data[$field['settings']['name_attribute']];
            if (!empty($files)) {
                foreach ($files as $key => $file) {
                    $form_data[$field['settings']['name_attribute']][$key] = $this->upload_file($file, $destination);
                }
            }
        }
    }
    return $form_data;
}
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
public function upload_file($file_name, $destination) {
    $upload_dir = wp_upload_dir();
    $temp_file = $upload_dir['basedir'] . '/ht_form/temp/' . $file_name;
    if($destination === 'media_library') {
        // === ATTACH TO MEDIA LIBRARY ===
        require_once ABSPATH . 'wp-admin/includes/file.php';
        require_once ABSPATH . 'wp-admin/includes/media.php';
        require_once ABSPATH . 'wp-admin/includes/image.php';
        $file = [
            'name' => basename($file_name),
            'tmp_name' => $temp_file,
            'type' => mime_content_type($temp_file),
            'error' => 0,
            'size' => filesize($temp_file),
        ];
        $attachment_id = media_handle_sideload($file, 0);
        if(is_wp_error($attachment_id)) {
            return $attachment_id->get_error_message();
        } else {
            @unlink($temp_file);
            return wp_get_attachment_url($attachment_id);
        }
    } elseif($destination === 'ht_form_default') {
        $destination = $upload_dir['basedir'] . '/ht_form';
        if (!file_exists($destination)) {
            wp_mkdir_p($destination);
        }
        $file_name = wp_unique_filename($destination, $file_name);
        $file_path = "$destination/$file_name";
        if (rename($temp_file, $file_path)) {

Leider wird der Dateiname-Parameter nicht ordnungsgemäß validiert, sodass beliebige Pfade angegeben werden können. Diese Dateidaten werden dann an die Funktion rename() weitergeleitet, die die Quelldatei in das Verzeichnis „uploads“ verschiebt.

Das bedeutet, dass Angreifer jede beliebige Datei auf dem Server zum Verschieben angeben können, was effektiv zu deren Löschung führt. Dadurch können nicht authentifizierte Angreifer beliebige Dateien auf dem Server verschieben, einschließlich der Datei wp-config.php der Website. Durch das Verschieben von „wp-config.php“ wird die Website in einen Einrichtungszustand versetzt, sodass ein Angreifer eine Website-Übernahme initiieren kann, indem er sie mit einer Datenbank unter seiner Kontrolle verbindet.

Der Patch

Der Anbieter hat dieses Problem behoben, indem er die Funktion „sanitize_file_name()“ auf die Variable „file“ in der Funktion „handle_files_upload()“ angewendet hat.

443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
public function handle_files_upload($form_data, $form) {
    foreach ($form['fields'] as $field) {
        if ($field['type'] === 'file_upload') {
            $destination = $field['settings']['upload_location'] ?? 'ht_form_default';
            $files = $form_data[$field['settings']['name_attribute']];
            if (!empty($files)) {
                foreach ($files as $key => $file) {
                    $file = sanitize_file_name($file);
                    $form_data[$field['settings']['name_attribute']][$key] = $this->upload_file($file, $destination);
                }
            }
        }
    }
    return $form_data;
}

Alle Wordfence-Benutzer, einschließlich derjenigen, die Wordfence Premium, Wordfence Care und Wordfence Response verwenden, sowie Websites, auf denen die kostenlose Version von Wordfence läuft, sind durch die in die Wordfence-Firewall integrierten Schutzfunktionen gegen das Hochladen bösartiger Dateien und das Durchlaufen von Verzeichnissen vollständig vor diesen Sicherheitslücken geschützt.

Quelle: Wordfence

Das könnte Sie ebenfalls interessieren


Bild/Quelle: https://depositphotos.com/de/home.html

Folgen Sie uns auf X

Folgen Sie uns auf Bluesky