Unauthentifizierte SQL-Injection-Schwachstelle im WordPress-Statistik-Plugin gepatcht

4. März 2022

Am 7. Februar 2022 meldete uns der Sicherheitsforscher Cyku Hong von DEVCORE eine Sicherheitslücke, die er in WP Statistics, einem WordPress-Plugin, das auf über 600.000 Websites installiert ist, entdeckt hat. Diese Schwachstelle ermöglichte es nicht authentifizierten Angreifern, beliebige SQL-Abfragen auszuführen, indem sie sie an eine bestehende SQL-Abfrage anfügten. Auf diese Weise konnten sensible Informationen wie Passwort-Hashes und geheime Schlüssel aus der Datenbank ausgelesen werden. Auf Anfrage haben wir ihnen die Kennung der Sicherheitslücke zugewiesen: CVE-2022-0513.

Alle Wordfence-Benutzer, einschließlich Kostenlos, Premium, Pflegeund Antwortsind dank des integrierten SQL-Injection-Schutzes der Wordfence Firewall vor Exploits geschützt, die auf diese Sicherheitslücke abzielen.

Auch wenn Wordfence Schutz vor dieser Sicherheitslücke bietet, empfehlen wir dringend, sicherzustellen, dass deine Website auf die neueste gepatchte Version von "WP Statistics" aktualisiert wurde, die zum Zeitpunkt dieser Veröffentlichung Version 13.1.5 ist.


WP Statistics ist ein WordPress-Plugin, das als zentraler Knotenpunkt für alle Statistiken einer WordPress-Website dient, z. B. für Besucherdaten, und das diese Daten lokal auf der WordPress-Website speichert, um die Privatsphäre der Nutzer zu schützen. Daher ist es naheliegend, dass das Plugin viele Funktionen zum Speichern und Abrufen von Informationen aus der Datenbank mithilfe von SQL-Abfragen implementiert. Leider war die Implementierung einer dieser Abfragen unsicher und führte zu einer SQL-Injection-Schwachstelle.

Als die Funktion "Datensatzausschlüsse" aktiviert wurde, konnte diese Sicherheitslücke ausgenutzt werden. Die Funktion "Ausschlüsse aufzeichnen" wurde entwickelt, um aufzuzeichnen, wenn ein Besuch oder ein "Treffer" von der Website-Statistik ausgeschlossen wird, z. B. Besuche von Nutzern mit bestimmten Rollen, der Zugriff auf die Anmeldeseite und alles andere, was der Website-Besitzer explizit ausschließen möchte. Diese Daten werden in einer separaten Datenbanktabelle gespeichert, um die wichtigsten statistischen Daten, die das Plugin sammelt, nicht zu beeinträchtigen.

Um diese Zugriffe aufzuzeichnen, wenn ein Caching Plugin aktiviert war, hat das Plugin eine REST-Route registriert /wp-json/wp-statistics/v2/hit registriert, die die hit_callback() Funktion aufruft. Diese Funktion würde dann die record() Funktion der Klasse "Hits" auf, die prüft, ob die Anfrage ausgeschlossen werden sollte, und bestimmt, zu welchem Ausschluss die Anfrage gehört, bevor sie die nächste geeignete Funktion aufruft. record() Funktion aufruft.

    public static function record()
    {

        # Check Exclusion This Hits
        $exclusion = Exclusion::check();

        # Record Hits Exclusion
        if ($exclusion['exclusion_match'] === true) {
            Exclusion::record($exclusion);
        }

        # Record User Visits
        if (Visit::active() and $exclusion['exclusion_match'] === false) {
            Visit::record();
        }

        # Record Visitor Detail
        if (Visitor::active()) {
            $visitor_id = Visitor::record($exclusion);
        }

Wenn die exclusion_match Parameter in einer Anfrage auf true gesetzt wird, werden die Daten dann an den record() Funktion der Klasse "Ausschluss" weitergeleitet, wo das Plugin versucht, die Anzahl der Ausschlussgründe für den Tag zu aktualisieren, wenn sie in der Datenbank vorhanden sind. Wenn der Ausschlussgrund für das aktuelle Datum nicht in der Datenbank vorhanden ist, gibt die erste Abfrage false zurück und löst die nächste Abfrage aus, um der Tabelle für den Grund eine neue Datensatzanzahl hinzuzufügen.

    public static function record($exclusion = array())
    {
        global $wpdb;

        // If we're not storing exclusions, just return.
        if (self::record_active() != true) {
            return;
        }

        // Check Exist this Exclusion in this day
        $result = $wpdb->query("UPDATE " . DB::table('exclusions') . " SET `count` = `count` + 1 WHERE `date` = '" . TimeZone::getCurrentDate('Y-m-d') . "' AND `reason` = '{$exclusion['exclusion_reason']}'");
        if (!$result) {
            $insert = $wpdb->insert(
                DB::table('exclusions'),
                array(
                    'date'   => TimeZone::getCurrentDate('Y-m-d'),
                    'reason' => $exclusion['exclusion_reason'],
                    'count'  => 1,
                )
            );
            if (!$insert) {
                if (!empty($wpdb->last_error)) {
                    \WP_Statistics::log($wpdb->last_error);
                }
            }

Die $wpdb->query() Funktion wurde für die erste UPDATE-Abfrage verwendet und verwendete die vom Benutzer angegebene 'exclusion_reasonWert als Teil der Abfrage. Da der vom Benutzer eingegebene Wert nicht escaped wurde und die Abfrage nicht parametrisiert wurde, konnten Angreifer leicht zusätzliche SQL-Abfragen an die bestehende Abfrage anhängen, indem sie die 'exclusion_reason' anhängen und sensible Informationen aus der Datenbank extrahieren.

Da in der Antwort keine Daten aus der SQL-Abfrage zurückgegeben wurden und die Antwort keine boolesche Antwort enthielt, müsste ein Angreifer einen zeitbasierten blinden Ansatz verwenden, um Informationen aus der Datenbank zu extrahieren. Das heißt, er müsste SQL CASE-Anweisungen zusammen mit der SLEEP() Befehl verwenden und dabei die Antwortzeiten der einzelnen Anfragen beobachten, um Informationen aus der Datenbank zu stehlen. Dies ist eine komplizierte, aber häufig erfolgreiche Methode, um Informationen aus einer Datenbank zu erhalten, wenn man SQL Injection-Schwachstellen ausnutzt.

Bei einer weiteren Analyse stellten wir fest, dass ein Benutzer auch einfach die exclusion_match Parameter mit dem Wert "yes" gleichsetzen kann, die exclusion_reason Parameter auf den SQLi-Payload gesetzt, und der wp_statistics_hit_rest Parameter auf true gesetzt, zusammen mit der Übergabe des Strings wp-json/ in der Anfrage-URI, um das gleiche auszulösen record() Funktion der Klasse "Ausschlüsse" zu verwenden. Bei dieser Methode musste kein Caching-Plugin aktiviert werden, um eine gültige Nonce zu erhalten und den REST-Endpunkt auszulösen. Dies ist auf die is_rest_request() Funktion true zurückgibt, wenn die $_SERVER['REQUEST_URI'] das REST-Präfix enthält, wp-json/enthält, auch wenn es sich nicht um eine echte REST-Anfrage handelt. Dies löst letztendlich den gesamten Aufzeichnungsprozess aus.

Fazit

In unserem heutigen Beitrag haben wir eine Schwachstelle im Plugin "WP Statistics" beschrieben, die es nicht authentifizierten Angreifern ermöglicht, beliebige SQL-Abfragen einzuschleusen, um sensible Informationen aus einer Datenbank zu stehlen. Diese Schwachstelle wurde in Version 13.1.5 vollständig gepatcht.

Wir empfehlen den Betreibern von WordPress-Websites, sofort zu überprüfen, ob ihre Website auf die neueste gepatchte Version aktualisiert wurde, die zum Zeitpunkt dieser Veröffentlichung Version 13.1.5 ist.

Alle Wordfence-Benutzer, einschließlich Kostenlos, Premium, Pflegeund Antwortsind dank des integrierten SQL-Injection-Schutzes der Wordfence Firewall vor Exploits geschützt, die auf diese Sicherheitslücke abzielen.

Wenn du glaubst, dass deine Website durch diese oder eine andere Sicherheitslücke kompromittiert wurde, bieten wir Incident Response Services über Wordfence Care. Wenn du deine Seite sofort reinigen lassen willst, Wordfence Antwort bietet den gleichen Service mit 24/7/365 Verfügbarkeit und einer Reaktionszeit von 1 Stunde. Beide Produkte beinhalten praktischen Support, falls du weitere Hilfe benötigst.

Wenn du einen Freund oder Kollegen kennst, der dieses Plugin auf seiner Website verwendet, empfehlen wir dir dringend, diesen Hinweis an ihn weiterzuleiten, um seine Website zu schützen, da es sich um eine schwerwiegende Sicherheitslücke handelt, die zu einer vollständigen Übernahme der Website führen kann.

Herzlichen Glückwunsch an Cyku Hong von DEVCORE für die Entdeckung dieser Schwachstelle und die verantwortungsvolle Weitergabe an die Entwickler des Plugins. Zur Erinnerung: Wordfence ist eine CVE Numbering Authority (CNA) und wir können deinen Entdeckungen von Sicherheitslücken in WordPress Plugins, Themes und Core CVE IDs zuweisen. Wenn du eine CVE für einen deiner WordPress-Funde benötigst, fülle bitte unser Formular hier aus. Deine Entdeckung der Schwachstelle kann mit deiner Erlaubnis in unserem Blog veröffentlicht werden!

Quelle


Dieser Artikel ist im Original von www.wordfence.com und wurde übersetzt
https://www.wordfence.com/blog/2022/02/unauthenticated-sql-injection-vulnerability-patched-in-wordpress-statistics-plugin/

Abonniere den RSS-Feed von unseren WP News und verpasse keine Meldung: https://die-mainagentur.de/feed/?post_type=wp-news

Alternativ kannst du unseren WP-Newsletter abonnieren

Mit dem Eintrag in den WP-Newsletter bekommst du per Mail über neue Artikel zugesendet. Du kannst den Newsletter jederzeit abbestellen.
Mehr dazu in der Datenschutzerklärung