3 votes

Comment injecter du SQL dans cet exemple

Ma question est assez spécifique, mais je pense qu'elle m'aidera à mieux comprendre la sécurité et l'injection SQL. J'exécute une page web locale avec un formulaire simple dans le but de voir comment fonctionne l'injection SQL, en l'appliquant à ma propre base de données et à ma page web. Je continue à changer la façon dont mon fichier php valide un utilisateur afin de pouvoir voir les différences. Je suis un débutant et le fichier php est très simple à dessein. Mon code php actuel est le suivant :

<?php
$username = $_POST['username'];
$password = $_POST['password'];
$conn = mysql_connect('localhost', 'root', 'password');
mysql_select_db(test1);
$query = "SELECT username, password FROM users WHERE username = '$username'";
$result = mysql_query($query) or die("Query failed: " . mysql_error());
$arr = mysql_fetch_array($result);
if($arr['username'] == $username && $arr['password'] == $password && strlen($username) > 0){
 header('Location:index.php');
}else{
 header('Location:login.html');
}
?>

Je ne sais pas si c'est une bonne ou une mauvaise façon de valider. Je veux juste connaître un exemple de la façon de l'injecter parce que je n'arrive pas à le comprendre. MySQL_query() ne permet qu'une seule instruction, je ne peux donc pas enchaîner les instructions, et je ne sais pas quoi faire d'autre. J'ai modifié le fichier pour pouvoir faire

ou 1=1 ; --

types d'injection, mais il est évident que celui-là ne fonctionnera pas ici. Donc juste par curiosité. Merci.

3voto

Justin Dearing Points 4305

La commande suivante passée à username retournerait toutes les lignes :

ou '1'='1

En général, il n'est tout simplement pas bon de transmettre des données non validées à une requête SQL.

2voto

a1ex07 Points 23965

Considérons la requête suivante :

SELECT username, password FROM users WHERE username = 'anything' AND 0 =1 
UNION ALL
SELECT '\'anything\' AND 0 =1 
UNION ALL
SELECT \'user\',\'password\'','password'

Si $_POST['password'] est égal au mot 'password', votre validation échouera et laissera un utilisateur non autorisé accéder à la page protégée.

1voto

Colin Points 1537

Vous n'effectuez aucune validation de vos paramètres de poste avant d'exécuter votre déclaration. C'est mauvais ! Et l'injection SQL est facilement possible.

Par exemple :

SELECT username, password FROM users WHERE username = '$username' AND (SELECT 1 FROM ([Almost any SQL statement you want...]))

I.E.

$username = "' AND (SELECT 1 FROM ([Almost any SQL statement you want...])); --"

Veillez à valider vos paramètres avant de les utiliser dans une instruction SQL.

1voto

technology Points 5501

Envoyez ceci comme nom d'utilisateur :

a' and(select 1 from(select count(*),concat((select concat_ws(0x3a,version(),database())),floor(rand(0)*2))x from information_schema.tables group by x)a) union select 1,'

Je ne suis pas sûr mais je pense qu'il n'est pas possible d'être redirigé vers index.php, mais l'exemple ci-dessus vous montrera quelque chose d'intéressant.

De telles failles de sécurité ne doivent jamais être laissées non aseptisées car un utilisateur malveillant peut obtenir le mot de passe de l'utilisateur racine de mysql si SELECT est autorisée à mysql et ainsi de suite.

Au fait, vous ne devez jamais afficher mysql_error() aux utilisateurs finaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X