CSAW CTF Qualifiers 2012 –
Web 200

Die diesjährige CSAW Web 200 – Challenge führt uns zunächst auf einen Webserver, bei dem das Indexing aktiviert ist. Demnach können wir alle Dateien, die sich im Pfad befinden, sehen und erhalten folgende Ansicht:

CSAW CTF 2012 - Web 200 - directory listing

Im Verzeichnis befinden sich vier PHP-Dateien sowie ein PHP-Quellcode-Datei (.phps). Bevor wir uns mit Quellcodes und ähnlichem befassen, sehen wir erst einmal, mit was für einer Art System bzw. Web-Anwendung wir es hier zu tun haben. Dazu rufe ich kurz die Seiten auf, um einen Überblick über deren Funktion zu bekommen.

CSAW CTF 2012 - Web 200 - login form

CSAW CTF 2012 - Web 200 - registration form

Dem ersten Anschein nach handelt es sich also um ein simples System zum Einloggen, Registrieren und Zurücksetzen von Benutzeraccounts. Das Erstellen eines eigenen Kontos funktioniert und ermöglicht den Login, jedoch ohne weitere Informationen von der Seite zu erhalten.

Es wird also Zeit, sich mit dem vorhandenen PHP-Quellcode, der Datei login.phps zu beschäftigen. Folgende PHP-Anweisungen werden ausgeführt:

<?php
  $good = true;
  include('mysql.php');
  $key = 'key{...}';
  $auth = false;
  $admin = false;
  if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $mysql->real_query('SELECT * FROM `csaw`.`users` WHERE `user` LIKE "' . $mysql->real_escape_string($_POST['user']) . '";');
    if ($mysql->errno != 0) {
      echo('Error.');
    } else {
      $result = $mysql->store_result();
      while ($row = $result->fetch_assoc()) {
        if ( $_POST['pass'] == $row['pass'] ) {
          $auth = true;
        }
        if ( $row['user'] == 'Administrator' ) {
          $admin = true;
        }
      }
    }
    if ( $auth && $admin ) {
      echo( $key );
    }
  }
?>

Zunächst sehen wir in Zeile 4 die Definition des Schlüssels sowie in Zeile 23 die Ausgabe dessen. DAS ist unser Ziel und der Wert, den wir zum Lösen der Challenge benötigen! Um zur Ausgabe zu gelangen, müssen die Variablen $auth und $admin (Zeile 22) beide WAHR sein.

$auth wird WAHR, wenn wir das korrekte Passwort des angegebenen Benutzers kennen (Zeile 14). Und $admin wir WAHR, wenn wir den Benutzernamen “Administrator” verwenden (Zeile 17). Doch wie stellen wir das an?

Die Abfrage an den SQL-Server sieht (vereinfacht) so aus (Zeile 8):

SELECT * FROM `csaw`.`users` WHERE `user` LIKE "' . $_POST['user'] . '";

Hier wird jedoch nicht überprüft, ob der übergebene Benutzername mit einem in der Datenbank genau übereinstimmt. Vielmehr wird eine “ungefähr”-Abfrage (LIKE) durchgeführt, die der SQL-Server im Falle von Platzhaltern wie “%” und “_” selbstständig ergänzen würde!

Wirklich ausnutzen lässt sich diese Schachstelle jedoch erst mit Zeile 8:

while ($row = $result->fetch_assoc()) {

Hierbei wird nicht nur eine Rückgabe des SQL-Servers ausgewertet, sondern alle. Das heißt, wenn mehrere Benutzernamen (z.B. durch Platzhalter) zurückgeliefert werden würden, wird jeder einzeln in der Schleife überprüft.

Falls wir es also schaffen, einen Benutzernamen, von dem wir das Passwort kennen sowie den Benutzer “Administrator” in das gleichzeitig Rückgabe-Array des SQL-Servers zu bekommen, sollten $auth als auch $admin nacheinander auf WAHR gesetzt werden.

Die Kombination dieser beiden Schwächen im PHP-Skript führt dazu, dass zum Beispiel der Benutzername “Admin%“, das von uns gewünsche Ergebnis, nämlich den $key, liefern sollte. Der SQL-Server würde die Benutzer “Admin%” und “Administrator” zurückliefern. Bei der Auswertung des Benutzers “Admin%” würde, sofern wir das Passwort kennen, die Variable $auth auf WAHR gesetzt werden. Bei der Auswertung des Benutzers “Administrator” würde die Variable $admin auf WAHR gesetzt werden.

Alles hängt also davon ab, einen neuen Benutzer mit geeignetem Benutzernamen im System anlegen zu können. Wir erinnern uns, dass diese Möglichkeit durch die Webseite “register.php” auch zur Verfügung gestellt wird. Demnach legen wir nun, den Benutzernamen “Admin%” mit einem von uns frei wählbaren Passwort an.

CSAW CTF 2012 - Web 200 - SQL wildcard injection

Anschließend melden wir uns mit diesem Benutzernamen sowie dem (von uns festgelegten) Passwort an. Das Ergebnis sieht folgendermaßen aus:

CSAW CTF 2012 - Web 200 - solution

Die Schwächen im Skript konnten erfolgreich ausgenutzt werden und der Schlüssel zur Challenge wurde uns offenbart!

Das Ergebnis lautet “6e6a5f85aa6880aa3d4bd1f0477b149d“.

Leave a Reply

Your email address will not be published. Required fields are marked *