J'essaie de créer un exemple d'injection SQL, mais MySQL rejette la deuxième requête à chaque fois, sauf si je la change en mysqli_multi_query.
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" name="dummyDorm"> <label>Name: </label> <input type="text" name="name"><br> <input type="submit" value="Submit"> </form> <?php if($_SERVER["REQUEST_METHOD"] == "POST") { $name = $_POST['name']; $conn = mysqli_connect("localhost", "root", "", "testDB"); if (mysqli_connect_errno()){ echo "failed to connect" . mysqli_connect_error(); die(); } else { $sql = "SELECT * FROM users WHERE name = '{$name}'"; var_dump($sql); if (mysqli_query($conn, $sql)) { echo "Success"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); } } ?>
Ce formulaire ne fait rien en réalité, je veux juste démontrer que les données peuvent être modifiées par injection SQL. Je souhaite effectuer l'injection où "DROP TABLE testTable" est entré. Mon MySQL ressemble à ceci :
DROP DATABASE IF EXISTS testDB; CREATE DATABASE testDB; USE testDB; CREATE TABLE users ( userID INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) )engine=innodb; CREATE TABLE testTable ( test VARCHAR(10) )engine=innodb; INSERT INTO users VALUES(null, "user01");
Lors de la saisie de l'injection : ';Supprimer le tableau de test --
Le résultat est le suivant : Erreur : SELECT * FROM utilisateurs WHERE nom = '' ; Supprimer la table de test --' Il y a une erreur dans votre syntaxe SQL ; consultez le manuel de la version de votre serveur MySQL pour connaître la syntaxe correcte à utiliser près de la ligne 1 "DROP TABLE testTable --"
J'ai suivi des tutoriels et ils ont utilisé MySQLi_query et cela fonctionnait bien, mais j'ai dû le changer en Mysqli_multi_query pour terminer l'injection.
Merci
En effet
mysqli_query()
Les requêtes multiples ne sont pas autorisées. Pour ce faire, vous avez besoin de mysqli_multi_query(), et si vous évitez d'utiliser cette fonction, vous êtes protégé contre les attaques par injection SQL qui reposent sur l'exécution de plusieurs requêtes, comme l'exemple DROP TABLE.Cependant, l'injection SQL peut causer d'autres types de dommages que DROP TABLE.
Je peux accéder à l'URL de votre page PHP en utilisant des paramètres supplémentaires qui me permettent de contrôler la logique de votre requête SQL :
Lisez toutes les lignes du tableau :
Lire un autre tableau :
Effectuez une attaque par déni de service pour tuer votre serveur de base de données avec une table temporaire d'un billion de lignes :
L'injection SQL n'est pas nécessairement une attaque malveillante. Il peut s'agir d'une utilisation involontaire d'une chaîne légale, entraînant une syntaxe SQL inattendue :
Le correctif pour l'injection SQL est bien connu et simple : Utilisez des requêtes paramétrées.
Consultez le manuel mysqli_prepare() ou des exemples complets populaires de questions de débordement de pile comme Comment empêcher l'injection SQL en PHP ?