SQL-инъекция не будет работать без использования mysqli_multi_query - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь создать пример внедрения 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 = '';DROP TABLE testTable - у вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'DROP TABLE testTable -' 'в строке 1

Я продолжаю изучать учебники, и они используют MySQLi_query, и он работает нормально, но у меня естьизменить его на Mysqli_multi_query, чтобы инъекция прошла.

Спасибо

1 Ответ

0 голосов
/ 21 мая 2018

Это правда, что mysqli_query() не разрешает мультизапрос.Для этого вам понадобится mysqli_multi_query () , и если вы воздержитесь от использования этой функции, вы будете защищены от атак с использованием SQL-инъекций, которые основаны на выполнении нескольких запросов, как в примере с DROP TABLE.

Но SQL-инъекция может привести к другим видам вреда, кроме DROP TABLE.

Я мог бы получить доступ к URL-адресу вашей PHP-страницы с другими параметрами, которые позволяют мне контролировать логику вашего 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_prepare () или в популярных вопросах переполнения стека, таких как Как я могу предотвратить внедрение SQL в PHP?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...