Die Verwendung von mysqli_multi_query ist für eine erfolgreiche SQL-Injection von entscheidender Bedeutung
P粉925239921
P粉925239921 2023-12-15 08:46:18
0
1
479

Ich versuche, ein SQL-Injection-Beispiel zu erstellen, aber MySQL lehnt die zweite Abfrage jedes Mal ab, es sei denn, ich ändere sie in 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);
            }

        }
    ?>

Dieses Formular macht eigentlich nichts, ich möchte nur demonstrieren, dass Daten mithilfe von SQL-Injection bearbeitet werden können. Ich möchte die Injektion dort durchführen, wo „DROP TABLE testTable“ eingegeben ist. Mein MySQL sieht so aus:

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");

Bei Eingabe der Injektion: ';Tabelle Testtabelle löschen --

Die Ausgabe ist wie folgt: Fehler: SELECT * FROM users WHERE name = ''; Tabelle testtabelle löschen --' Es liegt ein Fehler in Ihrer SQL-Syntax vor. Überprüfen Sie im Handbuch Ihrer MySQL-Serverversion die korrekte Syntax für die Verwendung in der Nähe von Zeile 1 „DROP TABLE testTable --“

Ich habe Tutorials besucht und sie haben MySQLi_query verwendet und es hat gut funktioniert, aber ich musste es in Mysqli_multi_query ändern, um die Injektion abzuschließen.

Danke

P粉925239921
P粉925239921

Antworte allen(1)
P粉795311321

确实mysqli_query()不允许多重查询。为此,您需要 mysqli_multi_query(),并且如果您避免使用使用该函数,您可以免受依赖于运行多个查询的 SQL 注入攻击,例如 DROP TABLE 示例。

但是,除了 DROP TABLE 之外,SQL 注入还可能导致其他类型的危害。

我可以使用其他参数访问您的 PHP 页面的 URL,这些参数允许我控制您的 SQL 查询的逻辑:

读取表中的所有行:

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

读取另一个表:

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

执行拒绝服务攻击,用万亿行临时表杀死您的数据库服务器:

?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

SQL 注入不一定是恶意攻击。这可能是对合法字符串的无意使用,从而导致意外的 SQL 语法:

?name=O'Reilly

SQL 注入的修复众所周知且简单:使用参数化查询。

查看mysqli_prepare()手册或流行的完整示例Stack Overflow 问题,例如 如何防止 PHP 中的 SQL 注入?

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage