Injection
Transformez un champ de recherche en une lecture de l’ensemble de la base de données.
Qu'est-ce que Injection?
L'entrée non fiable est concaténée dans une requête qu'un interprète analyse ensuite, de sorte que l'entrée cesse d'être une valeur et devient une partie de l'instruction. Vous allez faire remonter un point de terminaison de recherche de catalogue en trois mouvements : un guillemet simple génère une erreur SQL brute qui renvoie la requête, une condition toujours vraie supprime le filtre publié et UNION SELECT atteint une autre table pour les e-mails de compte, les hachages bcrypt et les rôles. Le correctif est un paramètre lié, donc la base de données compile d'abord l'instruction. Le renvoi d’une erreur SQL brute donne également la carte à un attaquant.
Ce que vous apprendrez dans Injection
- Reconnaître l'injection SQL : un paramètre de requête concaténé dans une requête que la base de données analyse ensuite, afin que l'entrée puisse réécrire la requête et atteindre les données que le point de terminaison n'a jamais eu l'intention de renvoyer
- Lisez l'escalade depuis une sonde à guillemet unique qui révèle une erreur SQL, jusqu'à une condition toujours vraie qui supprime un filtre, jusqu'à un UNION SELECT qui vide entièrement une table différente.
- Comprenez que l’injection ne dépend pas d’informations d’identification volées ou d’une authentification manquante ; un compte ordinaire, entièrement authentifié, peut injecter via n'importe quelle entrée que le serveur traite comme du code
- Appliquez le correctif : utilisez des requêtes paramétrées ou des instructions préparées pour que la valeur soit liée séparément et traitée comme des données, plutôt que des échappements écrits à la main ou des listes de blocage de caractères dangereux.
- Évitez de divulguer des erreurs SQL brutes aux clients et auditez chaque point de terminaison qui crée une requête, une commande ou un modèle à partir d'une entrée pour le même modèle de concaténation.
Injection — Étapes de la formation
-
Un siège d’acheteur ordinaire
Wexlar gère un marché de gros et distribue des comptes d'acheteur en libre-service à toute personne qui s'inscrit. Bob en a pris un, avec une identité jetable. Son siège est celui d'un simple acheteur : parcourir le catalogue, passer des commandes, rien de privilégié. Il ouvre la console développeur pour voir ce qu'est le compte et ce que propose l'API.
-
Un champ de recherche
Rien dans le compte de Bob n'est privilégié, il n'y a donc aucune fonction d'administrateur à atteindre. La seule entrée qui l'intéresse est la recherche dans le catalogue : elle prend tout ce qu'il tape et exécute une correspondance de nom avec la base de données de produits.
-
Une recherche normale
Bob commence par une recherche ordinaire pour voir le point final fonctionner et connaître sa forme. La recherche prend un paramètre de requête q et renvoie les produits dont le nom correspond.
-
Travailler comme prévu
La recherche se comporte exactement comme prévu. Trois ordinateurs portables publiés, uniquement les champs qu'un acheteur devrait voir.
-
Ajouter une seule citation
La sonde d'injection la plus ancienne qui soit : Bob ajoute un guillemet simple à son terme de recherche. Si le terme est recherché en tant que valeur, une recherche d'un nom contenant une citation ne renvoie tout simplement rien. S'il est concaténé en SQL, le guillemet parasite interrompra la requête.
-
La requête, ouverte
Un personnage supplémentaire a fait planter le point de terminaison et l'erreur a donné à Bob la confirmation qu'il souhaitait.
-
Réécrire le filtre
Maintenant que Bob sait que le terme fait partie de la requête, il arrête de le casser et commence à le piloter. Il crée un terme qui ferme la chaîne, ajoute une condition qui est toujours vraie et commente le reste de la requête d'origine.
-
Le tableau entier
Le filtre qui limitait la recherche aux produits publiés a disparu, et la réponse le prouve.
-
Atteindre une autre table
Lire chaque produit est mauvais ; lire des tables que la recherche n’a jamais été censée toucher est pire. Bob utilise un UNION pour ajouter des lignes d'une table différente aux résultats, en sélectionnant le même nombre de colonnes renvoyées par la requête de produit.
-
Le magasin d'informations d'identification, dans un résultat de recherche
Les lignes qui reviennent ne sont pas du tout des produits.
Couverture des référentiels de sécurité
OWASP API Top 10
- API8:2019 Injection
CWE
- CWE-74 Improper Neutralization of Special Elements in Output ('Injection')
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