Aus Linux-Magazin 04/2023

Gefährliche SQL-Injection-Schwachstelle in Wordpress entdeckt

© Narubas Bangpasert / 123RF.com

Ungeprüfte Eingaben stellen ein hohes Sicherheitsrisiko dar. In einem aktuellen Fall öffnet ein populäres WordPress-Plugin damit ungewollt eine Hintertür.

Das freie Content-Management-System WordPress kommt schätzungsweise auf über 40 Prozent aller Websites zum Einsatz. Mit mehr als 55 000 Plugins lässt es sich um verschiedenste Funktionen erweitern. Dazu gehört auch Learnpress, mit dem man Webseiten für Online-Kurse mit einem einfach zu bedienenden Benutzer-Interface aufsetzen kann. Es stellt nicht nur Kursmaterialien bereit, sondern besitzt auch eine Quiz-Funktion. Mit rund 100 000 Installationen zählt es zu den meistverbreiteten WordPress-Plugins. Gerade in Zeiten vermehrter Online-Lernangebote greifen immer mehr Anwender darauf zurück. Sicherheitslücken an dieser Stelle betreffen damit zahlreiche Systeme.

Forscher von Patchstack haben Ende 2022 insgesamt drei kritische Sicherheitslecks in Learnpress entdeckt [1]. Bei zwei davon handelt es sich um klassische SQL-Injection-Attacken, wobei eine der beiden eine Contributor-Rolle im CMS seitens des Angreifers erfordert. Die andere Schwachstelle kann ein Angreifer ohne jegliche Authentifizierung ausnutzen, sie ist demnach deutlich kritischer. Eine SQL-Injection entsteht durch einen Programmierfehler im Programmcode, der auf die SQL-Datenbank zugreift. Ein lokaler oder entfernter Angreifer kann dadurch SQL-Befehle ausführen. Je nach Applikation und Datenbankkonfiguration kann er so die Datenbank auslesen, Daten modifizieren oder Einträge aus der Datenbank löschen. Die konkrete SQL-Injection-Attacke im Learnpress-Plugin hat zur Folge, dass ein entfernter Angreifer beispielsweise neue Konten anlegen kann. Unter anderem kann er so auch einen Administrator-Zugang erstellen und damit weitreichende Kontrolle über das CMS erlangen.

Der für die Schwachstelle verantwortliche Programmierfehler befindet sich in der »execute«-Funktion der Datei »inc/databases/class-lp-db.php«. Diese Funktion verarbeitet die Variable »$filter«, die verschiedene SQL-Filteranweisungen wie »order by« oder »group by« enthalten kann. Die Variable ist ein Objekt der Klasse »LP_Filter«, die unter anderem die Strings »order_by« und »order« enthält. Ein Angreifer kann den Wert dieser Variablen modifizieren.

Die »execute«-Funktion verwendet diese Strings zum Zusammenbauen der Zeichenkette »$ORDER_BY« für den auszuführenden SQL-Query. »$ORDER_BY« wird dabei direkt eingefügt, ohne den String zuvor genau auf problematische Zeichen zu überprüfen. Der Angreifer kann so die SQL-Query modifizieren und eine SQL-Injection-Attacke vornehmen.

Die Lösung des Problems besteht darin, »$ORDER_BY« zu filtern und vor der Weiterverarbeitung kritische Zeichen zu entfernen. Das übernimmt die Funktion »sanitize_sql_orderby«, die sicherstellt, dass das Argument der Funktion eine korrekte Anweisung des Typs »order by« ist (Listing 1). Die PHP-Funktion »preg_match« überprüft hier, ob der übergebene Text einem dem Muster entspricht, das per regulärem Ausdruck definiert ist. Durch diesen Patch wird die SQL-Injection-Attacke vereitelt.

Listing 1

sanitize_sql_orderby

function sanitize_sql_orderby( $orderby ) {
  if ( preg_match( '/^\s*(([a-z0-9_]+|`[a-z0-9_]+`)(\s+(ASC|DESC))?\s*(,\s*(?=[a-z0-9_`])|$))+$/i', $orderby ) || preg_match( '/^\s*RAND\(\s*\)\s*$/i', $orderby ) ) {
    return $orderby;
  }
  return false;
}
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 1 HeftseitePreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben