Maison  >  Questions et réponses  >  le corps du texte

L'utilisation de mysqli_multi_query est essentielle pour une injection SQL réussie

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粉925239921P粉925239921283 Il y a quelques jours429

répondre à tous(1)je répondrai

  • P粉795311321

    P粉7953113212023-12-16 00:48:03

    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 ?

    répondre
    0
  • Annulerrépondre