dimanche 20 juin 2010

tutoriel injection SQL - solution CTF public nuit du hack 2010 WebApp #1

Ce tutoriel propose une solution à l'épreuve Web App #1 du capture the flag (CTF) public de la nuit du hack 2010.

outils

- module firefox live http headers

l'épreuve

L'épreuve consiste à s'identifier sur un questionnaire.

étude


astuce n°1 un javascript supprime des caractères interdits

jetons un oeil au code source de la page
< head>
    < title>...< /title>
    < script type="text/javascript">
        function check()
        {
            var escape = Array('\'', '"', '\\', ';', '-');
            for( i=0; i
            {
                document.forms[0].login.value = document.forms[0].login.value.replace(escape[i], '');
                document.forms[0].password.value = document.forms[0].password.value.replace(escape[i], '');
            }
        }
    < /script>
    < style>
        body {
            background-color: white;
            text-align: center;
            font-family: Verdana;
            font-size: small;
            font-weight: bold;
        }
      
        #page {
            width: 800px;
            margin:auto;
        }
      
        img {
            width: 500px;
        }
      
        #texte {
            position: relative;
            top: -220px;
            width: 250px;
            margin: auto;
            text-align:center;
        }
      
        input {
            text-align: center;
        }
      
    < /style>
< /head>

< body>
< div id="page">

    < p>
        < img src="secure.png" />
        < div id="texte">

        < form method="post" action="" onsubmit="javascript:check();">
            - Login -

            < input type="text" name="login" />


            - Password -


            < input type="password" name="password" />


            < input type="submit" value="Go" />
        < /form>
                < /div>
    < /p>
< /div>
< /body>
< /html>

La page appelle la fonction javascript check() lorsqu'on clique sur le bouton GO.
< form method="post" action="" onsubmit="javascript:check();">

Cette fonction supprime des caractères interdits.

function check()
{
    var escape = Array('\'', '"', '\\', ';', '-');
    for( i=0; i
    {
        document.forms[0].login.value = document.forms[0].login.value.replace(escape[i], '');
        document.forms[0].password.value = document.forms[0].password.value.replace(escape[i], '');
    }
}

astuce n°2 la page contient une faille SQL


Utilisons l'extension firefox http live headers

Capturons l'envoi de nos données puis "rejouons" l'envoi:
Nous modifions la requête en écrivant:
login=' #&password=

Nous obtenons que la base est en sqlite, et qu'il y a un souci avec le caractère #.



Astuce n°3 La base est en sqlite (et non en MySQL)

le commentaire en sqlite commence par --

solution

injectons via http live headers la requête
login=' or 1=1 -- & password=' or 1=1 --

3 commentaires:

  1. ma variante:
    j'ai écrasé la fonction check en tapant:
    javascript:function check(){}
    puis tapé
    ' or 1=1 --
    en guise de login, qui ne sera plus nettoyé, et ça passe également.

    RépondreSupprimer
  2. Bonjour,

    je n'ai pas compris la signification de la dernière injection effectuée, que veux dire la syntaxe
    "login=' or 1=1 -- & password=' or 1=1 --"

    RépondreSupprimer
  3. lors de la comparaison login et password au niveau sql ces donnees sont mises dans la requete

    RépondreSupprimer