~# Injections SQL #~ Définition Le nom parle de lui-même - TopicsExpress



          

~# Injections SQL #~ Définition Le nom parle de lui-même : cette faille apparaît quand il est possible dinjecter du code SQL dans les requêtes SQL qui sont faites dans une page web. Cest actuellement la meilleure vulnérabilité Web en rapport fréquence/surface dexploitation. Les conséquences dune faille SQL peuvent être multiples, du contournement de formulaires dauthentification au dump complet de la base de données en passant par lexécution arbitraire de code. Dans ce premier article, nous allons essayer de nous familiariser avec des injections simples (appellées aussi injections du premier ordre). Une requête SQL classique pour la vérification de mots de passe est SELECT * from admins WHERE login=$login AND password=$password, en français Sélectionner les lignes de la base de données qui appartiennent à la table admins et dont les champs pseudo et password sont respectivement égaux aux variables $pseudo et $password. Ainsi, il y a deux manières de passer lidentification sans avoir le mot de passe, voir même le pseudo : Imaginons que le programmeur vérifie quil existe des lignes qui répondent correctement à la requête SQL, autrement dit il vérifie que le nombre de lignes renvoyées nest pas égal à 0. Imaginons que nous envoyons comme pseudo OR 1=1#, le # étant le caractère de commentaire supprime tout ce qui le suit dans la requête (selon les serveurs, on trouve aussi -- ou les commentaires style C /* */). Ainsi, la requête devient SELECT * from admins WHERE login= OR 1=1, ce qui se lit Sélectionner les lignes de la base de données qui appartiennent à la table admins et qui on soit un pseudo nul, soit telles que 1=1. Vous lavez compris, 1=1 est une expression toujours vraie, par conséquent cette requête renverra toutes les lignes de la base de données. Ainsi, le nombre de lignes est différent de 0 et lutilisateur aura bypass cette requête. La deuxième manière est beaucoup plus sûre, elle permet de sidentifier en tant quun pseudo connu à lavance. Ainsi, vous remplissez le champ pseudo convenablement (il est souvent assez aisé de connaître certains pseudos réels) et injectez du code SQL comme précédemment dans le champ mot de passe. Ainsi, la requête devient vraie uniquement pour la ligne contenant le pseudo de la victime et vous devenez identifié en tant que la personne ciblée. Ainsi, même si le programmeur a vérifié quil nexistait quune ligne correspondant au couple (pseudo,mot de passe), vous passerez lidentification. Ce type de faille est en général facile à reconnaître, puisque si lon injecte un simple guillemet dans le formulaire, une erreur du type suivant interviendra : Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource (pour peu que les rapports derreurs soient activés, ce qui est le cas par défaut ; sinon il est tou de même possible en général dobserver des différences de comportement comme lapparition dune page vide). Voici une liste non-exhaustive dinstructions toujours vraies qui peuvent être utilisées (certains sites se défendent en dressant une liste de ce type dinstructions, ce qui est stupide puisque il y en a une infinité). Attention, tous ne marchent pas dans tous les cas, réfléchissez à chacune dentre elles pour être bien sûr davoir compris ! = OR 1=1 OR a=a OR OR= OR= OR= OR = OR = OR = OR = OR = OR = On peut agrémenter ces requêtes comme bon nous semble en utilisant dautres fonctionnalités du langage SQL : UNION SELECT pseudo,password FROM admins UNION SELECT pseudo,password FROM admins WHERE pseudo=OR 1=1# AND password=OR = UNION SELECT pseudo,password FROM admins WHERE pseudo=OR = AND password=OR = Nous lavons dit, ce type dinjections reste basique. Le langage SQL est très riche, bien quil nait pas la puissance de Turing (capacité à stocker des variables notamment). En complexifiant les requêtes, il est déjà possible de causer des dégâts significatifs, comme la divulgation de la base de données. Ceci dit, les injections SQL deviennent plus graves lorsquil est possible de doubler les requêtes, cest-à-dire rajouter un symbole de fin de requête ;) puis une instruction comme INSERT INTO ou UPDATE SET qui permettraient de porter atteinte à lintégrité des données. Des exemples dinjections avancées (Blind injection, Timing Attack, UNION) vous seront exposées dans la section sur les injections SQL avancées. Un petit exemple Comme dhabitude, nous allons prouver nos dires par un petit exemple. Notre exemple est composé de 3 pages : index.php, la page de login du site, auth.php, la page de vérification de lauthentification, et enfin la page qui est protégée, admin.php (qui nest pas réellement protégée, mais volontairement bloquée par referrer, ce qui nous permettra dilluster le HTTP headers spoofing). Nous nous sommes placés dans le cas où lutilisateur connait le pseudo dun des admins (ce qui est pratiquement toujours le cas), SeriousHack. Il est à remarquer que dans énormément de sites, root, admin, administrator ou webmaster sont aussi des logins très courants. Bases Hacking Administration Zone Faille de type SQL Injection Login Pass
Posted on: Wed, 30 Oct 2013 08:10:56 +0000

Trending Topics



Recently Viewed Topics




© 2015