如果不使用 mysqli_multi_query,SQL 注入将无法工作

Posted

技术标签:

【中文标题】如果不使用 mysqli_multi_query,SQL 注入将无法工作【英文标题】:SQL injection won't work without using mysqli_multi_query 【发布时间】:2018-10-31 06:13:25 【问题描述】:

我正在尝试创建一个 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");

进入注入时:'; DROP TABLE testTable --

这是输出: 错误:SELECT * FROM users WHERE name = '';删除表测试表--' 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“DROP TABLE testTable --”附近使用正确的语法

我一直在学习教程,他们使用 MySQLi_query,它工作正常,但我必须将其更改为 Mysqli_multi_query 才能通过注入。

谢谢

【问题讨论】:

mysqli_query 仅允许一个 SQL 查询,正是出于这个原因。 SQL 注入仍然是可能的,但这种特殊的尝试方式是不可能的。 【参考方案1】:

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

但是 SQL 注入会导致除 DROP TABLE 之外的其他类型的恶作剧。

我可以使用其他参数访问您的 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 注入的修复方法众所周知且简单:使用参数化查询。

查看the manual for mysqli_prepare() 中的完整示例或How can I prevent SQL injection in PHP? 等流行的 Stack Overflow 问题

【讨论】:

以上是关于如果不使用 mysqli_multi_query,SQL 注入将无法工作的主要内容,如果未能解决你的问题,请参考以下文章

我收到一个错误“命令不同步;当我使用mysqli_multi_query时,你现在无法运行此命令

SQL——注入攻击——mysqli_multi_query()的使用

sql无法通过mysqli_multi_query执行

严格标准:mysqli_multi_query 出现 mysqli_next_result() 错误

mysqli_multi_query数组问题

PHP mysqli_multi_query 在while循环中的事务