SQLI Techniques - Pentesting Web
Injection SQL basée sur des erreurs
L'injection SQL basée sur des 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 supplémentaires sur le système.
Le fichier PHP d'un site web vulnérable à l'injection basée sur des erreurs aura une structure similaire à celle-ci :
<?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 :
Pour déterminer le nombre de colonnes, utilisez order by jusqu'à ce que vous n'obteniez plus d'erreurs identiques :

Une fois le nombre de colonnes connu, utilisez union select pour vérifier la vulnérabilité :
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 :
Pour lister toutes les bases de données existantes :

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

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

Pour lister les colonnes (user et password) :

Pour voir le tout ensemble :

SQL avec sanitisation "mysqli_real_escape_string"
Dans de nombreux cas, les codes PHP effectuent une petite sanitisation avec mysqli_real_escape_string. Cependant, cela peut être contourné si les guillemets sont mal placés dans l'ID.
Dans ce cas, vous pouvez effectuer la même opération sans avoir besoin des guillemets simples :
SQL basée sur les méthodes de boolean ou de temps :
L'injection SQL basée sur le temps utilise une requête qui prend beaucoup de temps pour 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 :
Exemple visuel du code d'état 404 Not Found et 200 OK avec curl si une requête est incorrecte ou correcte :

Ainsi, en cas d'attaque en aveugle, deux techniques peuvent être utilisées : les conditions ou le temps.
Injection SQL basée sur les booléens
Envoyez une requête disant d'essayer avec un ID qui n'existe pas ou si 1 = 1 :

Avec le script Python suivant, 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 du lien, du nom des tables, colonnes, bases de données, etc., comme vu précédemment en modifiant la variable sqli_url).

Injection SQL basée sur le temps
Envoyez une requête disant d'essayer avec un ID qui n'existe pas ou sleep (0.35) :
Avec le script Python suivant, 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 du lien, du nom des tables, colonnes, bases de données, etc., comme vu précédemment en modifiant la variable sqli_url).

Mis à jour
Ce contenu vous a-t-il été utile ?