SQL Injection Wargame Tutorial :: Level 2


Détails du niveau

But : Exploiter le script du niveau 1 (ici (lien mort)) afin de lui faire afficher des informations contenues dans la table "newsuser" et appartenant à la même base de données. En l'occurence, on recherche l'identifiant et le mot de passe de l'admin.

Structure de table "newsuser" :

id - int, primary key
username - char
password - char
name - char

Version MySQL : MySQL 4.0.14 Stable

Les versions 4.x de MySQL supportant enfin le mot-clé "UNION" (très pratique pour le SQL-Injection), on peut supposer que cela nous sera utile pour ce niveau.

Exploitation basique


Exploitation avancée

La technique précente manque singulièrement d'élégance, car nous sommes contraints de "deviner" (dans le sens "trouver par recherche exhaustive") l'identifiant du compte "Admin". Or, même si les guillemets et les quotes sont filtrés, il est possible dans MySQL de passer une chaine de texte à l'interpréteur, via la fonction char().

Il nous suffit donc trouver les codes ASCII de la chaine qui nous intéresse.
A cet effet, voici un p'tit script Perl :
#!/usr/local/bin/perl
# Print a string useable in MySQL when quotes are filtered

print "Converting '$ARGV[0]' : ";

my @ascii = unpack("C*", $ARGV[0]);
my $string = "char(";

for (my $i=0; $i <= $#ascii; $i++) {
        $string .= $ascii[$i];
        $string .= "," if ($i ne $#ascii);
}

$string .= ")";
print "$string\n";
Exemple d'utilisation :
nicob@bobby:~/warsql/ > ./mysql_char.pl Admin
Converting 'Admin' : char(65,100,109,105,110)