
Technische Analyse und Proof-of-Concept-Exploit für CVE-2021-43408, eine SQL-Injection-Schwachstelle im WordPress Duplicate Post Plugin Version 1.1.9, mit Schritt-für-Schritt-Exploitationsanleitung und Abhilfeempfehlungen.
WordPress ist ein Open-Source-CMS (Content Management System), ein System zur Verwaltung von Inhalten. Anstatt HTML-Code zu verwenden, wird WP in der Programmiersprache PHP geschrieben und nutzt die MySQL-Datenbankplattform. WordPress wurde von den Entwicklern Matt Mullenweg und Mike Little gegründet. Derzeit gehört WordPress dem Unternehmen Automattic mit Sitz in San Francisco, Kalifornien, USA.
Das WordPress-Plugin Duplicate Post in den Versionen 1.1.9 und darunter weist eine SQL-Injection-Schwachstelle auf. Diese Art der Ausnutzung ermöglicht es einem Angreifer, SQL-Abfragen einzuschleusen, um Ressourcen in der Datenbank zu lesen, zu ändern oder sogar zu löschen.
Diese Schwachstelle kann von jedem authentifizierten Benutzer ausgenutzt werden, der die Funktion des Plugins Duplicate Post verwenden darf. Standardmäßig hat nur der Administrator diese Berechtigung, jedoch können die Berechtigungen so angepasst werden, dass auch Redakteure, Autoren, Mitwirkende und sogar Abonnenten dieses Plugin verwenden können.
CVE-2021-43408 wurde am 19.11.2021 entdeckt und nach dem CVSS-Bewertungsschema als (hoch) eingestuft.
HIGH
Die Hauptursache dieser Schwachstelle ist, dass die vom Benutzer übermittelten Daten aus der Anfrage nicht bereinigt werden, bevor sie in die SQL-Ausführung einfließen.
Genauer gesagt, in der Datei post/handler.php in der Funktion cdn_insert_post()
function cdp_insert_post($id, $data, $times, $areWePro, $isChild = false, $p_ids = null, $site) {
// Get Wordpress database
global $wpdb;
// Create empty array for new id(s) and error(s)
$results = array('ids' => array(), 'error' => 0, 'counter' => 0);
// Get Counter value
$prefix = (($site != -1) ? $wpdb->get_blog_prefix($site) : $wpdb->get_blog_prefix());
$newestId = $wpdb->get_results("SELECT post_id FROM {$prefix}postmeta WHERE meta_key = '_cdp_origin' AND meta_value = {$id} ORDER BY post_id DESC LIMIT 1", ARRAY_A);
$idwird vom Angreifer kontrolliert
Die Variable $id wird in die Funktion übergeben, die eine SQL-Abfrage enthält, ohne dass eine Bereinigung stattfindet. Diese Funktion wird über den WordPress-Ajax wp_ajax_cdp_action_handling aufgerufen.
Man sieht, dass der Parameter id durch die Funktion cdn_sanitize_array geht, wo die Datenfelder des Beitrags durch die Funktion sanitize_text_field geleitet werden, die alle Anführungszeichen ' in der Zeichenkette escapt.

Die Datenfelder werden mit
sanitize_text_fieldbereinigt
Allerdings weist der Code eine Schwachstelle auf, wenn die Daten des Integer-Feldes (Feld id) in die SQL-Abfrage eingefügt werden. Ein Angreifer kann dies ausnutzen und zusätzliche SQL-Anweisungen in den Wert dieses Feldes einfügen. Um die SQL-Abfrage kontrollieren zu können, muss der Angreifer lediglich die Verwendung des Zeichens ' vermeiden.
Schritt 1: Melden Sie sich als Administrator an und installieren Sie das Plugin Duplicate Post in Version 1.1.9. Dieses Plugin unterstützt Benutzer beim Kopieren vorhandener Beiträge.

Schritt 2: Gehen Sie zum Bereich Beiträge, wählen Sie einen Beitrag aus, wählen Sie die Aktion Kopieren und klicken Sie auf Anwenden.

Schritt 3: Wählen Sie Einstellung: Standard und klicken Sie auf Kopieren.

Schritt 4: Fangen Sie die HTTP-Anfrage ab. Das zu beachtende Datenfeld ist id; man sieht, dass die Daten dieses Feldes eine Integer-Zahl sind.

Schritt 5: Fügen Sie ein SQL-Injection-Payload ein, senden Sie die Anfrage und stellen Sie fest, dass der Server erst 9 Sekunden später eine Antwort sendet – SQL Injection erfolgreich.
Payload: 1 and (select*from(select(sleep(9)))a)--

