sql注入将无法工作

yk9xbfzb  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(354)

我试图创建一个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,以便注入通过。
谢谢

mspsb9vt

mspsb9vt1#

这是真的 mysqli_query() 不允许多重查询。为此,您需要mysqli\u multi\u query(),如果您不使用该函数,您就不会受到依赖于运行多个查询的sql注入攻击,例如drop table示例。
但是sql注入会导致除drop表之外的其他类型的破坏。
我可以使用其他参数访问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\u prepare()手册中的完整示例或常见的堆栈溢出问题,如如何防止php中的sql注入?

相关问题