Ziel dieser Challenge (charsheet) ist es, an den Charakter-Namen des Administrators einer Webseite zu gelangen. Der Aufgabenstellung zur Folge spielt dieser mit dem Auftraggeber zusammen in einer Dungeons & Dragons (D&D) – Kampange.
Zuerst sehen wir uns die angegebene Webseite im Browser etwas genauer an. Dabei finden wir ein System vor, mit dem Charakterbögen von Charakteren aus Pen-and-Paper Rollenspielen verwaltet und gepflegt werden können.
Neben der Möglichkeit sich auf der Seite zu registrieren und – nach Login – neue Charaktere anzulegen, kann auch nach bereits hinterlegten Charakteren und Kampagnen gesucht werden. Ohne zu zögern testen wir die Suchfelder direkt auf die Möglichkeit von SQL-Injections, indem ein Hochkomma ‘ übergeben wird.
Tatsächlich führt diese Anfrage direkt zu einem serverseitigen Fehler und wir erhalten folgende Ausgabe:
Darin teilt uns der Server direkt die SQL-Abfrage mit, die im PHP-Skript gestellt wurde, nämlich: “SELECT c.id, c.name, DATE_FORMAT(c.lastedited, ‘%d %M %Y @ %H:%i’) as lastedited, c.owner, st.name as tname, ca.name as caname FROM sheet_templates st, characters c LEFT JOIN campaign ca on ca.id = c.campaign WHERE c.public = ‘y’ AND c.template_id = st.id AND UPPER(c.name) LIKE (‘%’) ORDER BY UPPER(c.name), UPPER(c.name) LIMIT 15“.
Dabei wird der von uns eingegebene Such-String vor den SQL-Wildcard % in der LIKE-Funktion gesetzt. Unser Hochkomma finden wir in der Fehlerausgabe daher exakt and dieser Stelle wieder.
Um nun nicht gezielt nach Charakter-Namen suchen zu müssen (oder durch das LIMIT 15 gar in der Ausgabe begrenzt zu werden), wollen wir eine Ausgabe aller Charaktere erzeugen, die in der Datenbank hinterlegt sind.
Dazu müssen wir ein “OR 1=1” als Suchbegriff übergeben um so die gesamten AND-Bedingungen auszuhebeln. Um dem Syntax der vordefinierten Anfrage zu entsprechen, muss die Klammer noch abgeschlossen und der Rest auskommentiert werden. Die finale Anfrage lautet daher: “‘) OR 1=1 — “.
Nach Absenden dieses “Suchbegriffes”, erhalten wir folgende Ausgabe:
Es handelt sich um die komplette Auflistung aller hinterlegten Charaktere. Direkt zu Beginn der Ausgabe erhalten wir auch den gesuchten Chrakternamen des Administrators, der als Lösung zur Challenge dient.
Die Antwort lautet somit “r3al50ftwar3ftw“.