Académique Documents
Professionnel Documents
Culture Documents
Contenu
1. Les failles d’injection dans les applications web������������������������������������������������������������������������������������� 1
2. Les injections SQL������������������������������������������������������������������������������������������������������������������������������������� 1
3. Les injections NoSQL�������������������������������������������������������������������������������������������������������������������������������� 4
4. Détection et protection������������������������������������������������������������������������������������������������������������������������������ 6
5. En synthèse������������������������������������������������������������������������������������������������������������������������������������������������ 8
6. Références complémentaires������������������������������������������������������������������������������������������������������������������� 8
Dans le cas d’une attaque par injection SQL, par exemple au lieu de mettre un nom d'utilisateur et un
mot de passe sur une page de connexion, un utilisateur malveillant entrera des données directement
interprétées par le moteur SQL, ce qui lui permettra de modifier le comportement de votre application.
Exemple de saisie avec et sans injection et traitement sur les serveurs Apache puis MySQL.
Dans l’image ci-dessus, lors de la saisie de l’identifiant et du mot de passe associé, le serveur Apache
exécute une requête après du serveur MySQL en substituant directement aux variables $_GET[‘login’]
et $_GET[‘password’] le contenu des champs textes saisis par l’utilisateur.
Dans le cas d’une saisie non malveillante comme à gauche de l’image, la requête envoyée au serveur est :
SELECT id, login FROM users WHERE login = ‘admin’ AND password = ‘secret’
Si le serveur MySQL trouve un utilisateur existant avec ces 2 informations, elle va renvoyer au serveur
Apache son id et son login. Sinon, elle ne renverra rien.
SELECT id, login FROM users WHERE login = ‘X’ OR ‘1’=’1’ AND password = ‘X’ OR
‘1’=’1’
Dans cette requête, le serveur MySQL, au lieu de renvoyer l’utilisateur qui répond à la condition (bon
login et bon mot de passe), va renvoyer tous les utilisateurs de la table users puisque les conditions
‘1’=’1’ renverront toujours vrai.
2A. Risques
À travers une injection SQL il est possible de :
— récupérer des données (comptes utilisateurs, cartes bancaires, etc.). On parle alors souvent de vols
de données dans l'actualité. C'est l'utilisation la plus courante ;
— contourner une authentification : on s'authentifie sur une application sans avoir des identifiants
valides ;
— ajouter et/ou modifier des données : par exemple pour ajouter un compte administrateur, ou
modification d'un compte existant pour ajouter des privilèges ;
— supprimer des informations, ou vider la base de données : si une personne a une dent contre une
entreprise, ou juste pour embêter son monde. C'est l'utilisation la moins courante ;
— exécuter des commandes systèmes : ça permet d'avoir plus d'informations sur la machine, lancer
des attaques à distance, installer des programmes, etc. ;
— escalader les privilèges pour augmenter le niveau d'accès d'un utilisateur à la machine, et finalement
avoir l'accès total : administrateur ou root ;
— réaliser un déni de service (DoS) : en saturant le serveur ce qui rend le site très lent et donc
inaccessible ;
— lire un fichier : et donc voir le code source d'une application.
SELECT * FROM ARTICLES WHERE published = 1 AND category = 'Sécurité' UNION SELECT
1,username,password,4,5 FROM USERS
Avec cette requête, l'utilisateur aura la liste d'article de la catégorie « Sécurité » mais aussi la liste des
comptes utilisateurs et leur mot de passe.
Les attaques « Error based » se basent sur le fait que les erreurs SQL sont affichées sur la page et en
partie interprétées. Il est donc possible de faire afficher les informations souhaitées dans les erreurs.
Dans le cas du script d’exemple, si au lieu des données du formulaire, on envoie en POST la chaine de
valeurs suivante :
usr_name[$ne]=h4cker&usr_password[$ne]=h4xor
4. Détection et protection
4A. Détection et audit
Il est possible de trouver des points d'injection SQL un peu partout (URL, formulaires, cookies, Ajax, etc.)
et il est nécessaire de faire de nombreux tests pour savoir s'il s'agit d'un point d'injection viable ou non.
Les tests courants consistent à tester manuellement l’ajout de caractères spéciaux dans un champ
input :
— ' ou %27 : le single quote ou sa forme en URL encode ;
— " ou %22 : le double quote ou sa forme en URL encode ;
— 1' or '1'='1 : une seconde condition toujours vraie (test très utilisé dans les formulaires
d’authentification) ;
— admin'-- ou admin' # ou admin' /* suivi d’une nouvelle requête ;
— 1+1 pour voir si le résultat et interprété…
Les vulnérabilités NoSQL sont détectables de la même façon en injectant des éléments susceptibles de
modifier la requête exécutée dans les champs input ou dans les données GET et POST transmises (via la
barre d’adresse ou via un forgeage de requêtes GET et POST).
6. Références complémentaires
Article intéressant de l'OWASP :
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
Comment se protéger des injections SQL d'après php.net :
http://php.net/manual/fr/security.database.sql-injection.php
Les requêtes préparées et les procédures stockées par php.net :
http://php.net/manual/fr/pdo.prepared-statements.php
Article intéressant concernant les avantages des procédures stockées :
http://www.dbnewz.com/2010/12/08/pour-ou-contre-les-procedures-fonctions-stockees/
Une liste tenue à jour des attaques par injection SQL :
http://codecurmudgeon.com/wp/sql-injection-hall-of-shame/
Article très sympa à lire décrivant de nombreux scenarii analysés :
http://christianelagace.com/wordpress/comment-les-hackers-reussissent-les-injections-sql/
Documentation des opérateurs MongoDB :
https://www.mongodb.com/docs/manual/reference/operator/query/
NoSql Injection Cheatsheet :
https://nullsweep.com/nosql-injection-cheatsheet/