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
确实
mysqli_query()
不允许多重查询。为此,您需要 mysqli_multi_query(),并且如果您避免使用使用该函数,您可以免受依赖于运行多个查询的 SQL 注入攻击,例如 DROP TABLE 示例。但是,除了 DROP TABLE 之外,SQL 注入还可能导致其他类型的危害。
我可以使用其他参数访问您的 PHP 页面的 URL,这些参数允许我控制您的 SQL 查询的逻辑:
读取表中的所有行:
读取另一个表:
执行拒绝服务攻击,用万亿行临时表杀死您的数据库服务器:
SQL 注入不一定是恶意攻击。这可能是对合法字符串的无意使用,从而导致意外的 SQL 语法:
SQL 注入的修复众所周知且简单:使用参数化查询。
查看mysqli_prepare()手册或流行的完整示例Stack Overflow 问题,例如 如何防止 PHP 中的 SQL 注入?