我试图创建一个sql注入的示例,但是mysql每次都拒绝第二个查询,除非我将其更改为mysqli\u multi\u 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注入可以编辑数据。我想执行一个注入,输入“droptabletesttable”。我的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");
进入注射时:';删除表testtable--
输出:错误:从name=''的用户中选择*;drop table testtable--'您的sql语法有错误;在第1行的“drop table testtable--”附近,检查与您的mysql服务器版本对应的手册,以获得正确的语法
我一直在看教程,他们使用mysqli\u query,它工作得很好,但我必须将它改为mysqli\u multi\u query,以便注入通过。
谢谢
1条答案
按热度按时间mspsb9vt1#
这是真的
mysqli_query()
不允许多重查询。为此,您需要mysqli\u multi\u query(),如果您不使用该函数,您就不会受到依赖于运行多个查询的sql注入攻击,例如drop table示例。但是sql注入会导致除drop表之外的其他类型的破坏。
我可以使用其他参数访问php页面的url,这些参数允许我控制sql查询的逻辑:
读取表中的所有行:
阅读其他表格:
执行拒绝服务攻击,使用兆行临时表杀死数据库服务器:
sql注入不一定是恶意攻击。这可能是对合法字符串的无害使用,导致意外的sql语法:
sql注入的解决方案是众所周知的,而且很简单:使用参数化查询。
请参阅mysqli\u prepare()手册中的完整示例或常见的堆栈溢出问题,如如何防止php中的sql注入?