Injection SQL
Une citation dans un champ de recherche réécrit la requête.
Qu'est-ce que Injection SQL?
Une chaîne fournie par l'utilisateur est concaténée dans une requête et cette chaîne peut modifier ce que demande la requête. Chaque requête ici s'exécute sur une véritable base de données intégrée, donc rien n'est falsifié. Vous allez casser un formulaire de recherche de compte avec un guillemet simple, renvoyer la table entière des membres avec ' OR '1'='1 , puis utiliser UNION SELECT et information_schema pour en extraire les e-mails de l'administrateur et les hachages de mots de passe. Le correctif lie la valeur en tant que paramètre afin que la grammaire SQL n'analyse jamais l'entrée sous forme de code. Pas de désinfection, pas de liste de blocage de pare-feu.
Ce que vous apprendrez dans Injection SQL
- Reconnaître la tautologie d'injection SQL du manuel ' OR '1'='1 et expliquer pourquoi une condition toujours vraie contourne un filtre WHERE
- Suivez comment un point de terminaison de recherche sur une seule ligne devient une lecture de table complète lorsque son paramètre est concaténé dans la chaîne SQL
- Utilisez UNION SELECT pour énumérer les tables de base de données via information_schema et extraire les lignes d'une table que le formulaire n'a jamais été censé exposer, comme admin_users
- Distinguer les requêtes paramétrées (la défense fiable) des défenses contre la manipulation de chaînes comme les listes de blocage, l'échappement et les règles WAF, et expliquer pourquoi seule l'approche paramétrée est valable
- Lisez suffisamment bien un gestionnaire de base de données vulnérable pour repérer le bogue de concaténation, puis confirmez le correctif paramétré en réexécutant la charge utile exacte sur le point de terminaison corrigé et en voyant zéro ligne.
Injection SQL — Étapes de la formation
-
Trouver le formulaire cible
Bob a Vantyr dans le collimateur, un service d'adhésion doté d'une page publique account-lookup . Pas de connexion, juste un champ e-mail qui renvoie la formule d'un membre. C'est là que commencent les attaques web : un formulaire ordinaire qui dialogue discrètement avec une base de données.
-
Soumettre une recherche normale
Voyez d'abord comment le formulaire se comporte normalement. Entrez l'e-mail d'un vrai membre et soumettez. Le panneau Réseau du navigateur s'ouvre et enregistre la requête, exactement ce qu'un développeur voit dans les DevTools.
-
Inspecter la demande
Voilà la requête. L'e-mail que vous avez saisi est transmis au serveur dans la charge utile de la requête, et la réponse renvoie le membre correspondant. Rien d'anormal pour l'instant. C'est ainsi que la fonctionnalité est censée marcher.
-
Lire le code du gestionnaire
Maintenant la partie intéressante : le code du serveur qui gère cette requête. Il construit la requête SQL en en collant votre e-mail directement dans la chaîne de requête . Cette seule déclaration est tout le problème.
-
Repérez la ligne vulnérable
Cette seule déclaration représente toute la vulnérabilité : votre entrée est collée dans la chaîne SQL et le commentaire affiche la requête exacte envoyée à la base de données, reconstruite en direct à partir de ce que vous tapez.
-
Brisez-le avec une citation
Le champ contient toujours morgan.lee@example.com lors de votre première recherche. Votre entrée atterrit à l’intérieur d’une chaîne entre guillemets, alors que se passe-t-il lorsque vous envoyez un devis ? Ajoutez un guillemet simple à la fin et soumettez, et regardez le commentaire executed query dans le code reconstruit pendant que vous tapez : votre devis atterrit inside sur la chaîne et la brise. You're no longer sending data. You're editing the query.
-
Lire l'erreur de base de données
Le serveur a renvoyé un 500 avec une véritable erreur de base de données. Cette apostrophe supplémentaire a fermé la chaîne trop tôt et a laissé la requête mal formée. La base de données a tenté de l'exécuter et a planté. Une erreur comme celle-ci est le feu vert d'un attaquant : l'entrée atteint le moteur SQL.
-
Contourner le filtre
Faites maintenant faire à la requête quelque chose d'utile pour vous. Fermez la chaîne vous-même, ajoutez une condition toujours vraie et le filtre WHERE cesse de filtrer. Le classique : ' OR '1'='1 .
-
Voir le dump complet
Le filtre est parti. Au lieu d'un membre, la réponse est la table des membres entire : chaque e-mail et plan dont dispose Vantyr. Vous avez demandé un compte et la base de données les a tous transmis.
-
Contrôle des connaissances
Couverture des référentiels de sécurité
OWASP Top 10
- A05:2025 Injection
- A03:2021 Injection
CWE
- CWE-89 Improper Neutralization of Special Elements used in an SQL Command
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security