L'utilisation de mysqli_multi_query est essentielle pour une injection SQL réussie
P粉925239921
P粉925239921 2023-12-15 08:46:18
0
1
423

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

P粉925239921
P粉925239921

répondre à tous(1)
P粉795311321

En effetmysqli_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 :

?name=x' OR 'x'='x

Lire un autre tableau :

?name=x' UNION ALL SELECT ... FROM othertable WHERE 'x'='x

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 :

?name IN (SELECT 1 FROM othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable) AND 'x'='x

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 :

?name=O'Reilly

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 ?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!