SQL 不使用 mysqli_multi_query 注入将无法工作
SQL injection won't work without using mysqli_multi_query
我正在尝试创建一个 SQL 注入示例,但 MySQL 每次都拒绝第二个查询,除非我将其更改为 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);
}
}
?>
该表单实际上并没有做任何事情我只是想证明使用 SQL 注入你可以编辑数据。我想在您输入 "DROP TABLE testTable" 的位置执行注射。我的 MySQL 看起来像这样:
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");
输入注入时:';删除 TABLE 测试表 --
这是输出:
错误:SELECT * FROM users WHERE name = '';删除 TABLE 测试表 --'
您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1
行 'DROP TABLE testTable --'' 附近使用的正确语法
我一直在学习教程,他们使用 MySQLi_query 并且效果很好,但我必须将其更改为 Mysqli_multi_query 才能完成注射。
谢谢
确实mysqli_query()
不允许多查询。为此,您需要 mysqli_multi_query(),并且如果您不使用该功能,则可以免受依赖于 运行 多个查询的 SQL 注入攻击,例如您的 DROP TABLE例如。
但是 SQL 除了 DROP TABLE 之外,注入还会导致其他类型的恶作剧。
我可以使用其他参数访问您的 PHP 页面的 URL,这些参数允许我控制您的 SQL 查询的逻辑:
读取 table 中的所有行:
?name=x' OR 'x'='x
阅读另一个 table:
?name=x' UNION ALL SELECT ... FROM othertable WHERE 'x'='x
执行拒绝服务攻击,用万亿行的温度杀死你的数据库服务器table:
?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 注入的修复是众所周知且简单的:使用参数化查询。
请参阅 the manual for mysqli_prepare() or in popular Stack Overflow questions like How can I prevent SQL injection in PHP?
中的完整示例
我正在尝试创建一个 SQL 注入示例,但 MySQL 每次都拒绝第二个查询,除非我将其更改为 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);
}
}
?>
该表单实际上并没有做任何事情我只是想证明使用 SQL 注入你可以编辑数据。我想在您输入 "DROP TABLE testTable" 的位置执行注射。我的 MySQL 看起来像这样:
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");
输入注入时:';删除 TABLE 测试表 --
这是输出: 错误:SELECT * FROM users WHERE name = '';删除 TABLE 测试表 --' 您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1
行 'DROP TABLE testTable --'' 附近使用的正确语法我一直在学习教程,他们使用 MySQLi_query 并且效果很好,但我必须将其更改为 Mysqli_multi_query 才能完成注射。
谢谢
确实mysqli_query()
不允许多查询。为此,您需要 mysqli_multi_query(),并且如果您不使用该功能,则可以免受依赖于 运行 多个查询的 SQL 注入攻击,例如您的 DROP TABLE例如。
但是 SQL 除了 DROP TABLE 之外,注入还会导致其他类型的恶作剧。
我可以使用其他参数访问您的 PHP 页面的 URL,这些参数允许我控制您的 SQL 查询的逻辑:
读取 table 中的所有行:
?name=x' OR 'x'='x
阅读另一个 table:
?name=x' UNION ALL SELECT ... FROM othertable WHERE 'x'='x
执行拒绝服务攻击,用万亿行的温度杀死你的数据库服务器table:
?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 注入的修复是众所周知且简单的:使用参数化查询。
请参阅 the manual for mysqli_prepare() or in popular Stack Overflow questions like How can I prevent SQL injection in PHP?
中的完整示例