PHP multi_query рендеринга страницы не удается - PullRequest
0 голосов
/ 30 июня 2018

Доброе утро,

У меня были некоторые проблемы вчера , и мне помогли, к сожалению, мое приложение все еще не выполняет 100% того, что я хочу, хотя отсутствует только маленькая деталь.

Учитывая сценарий, в котором я хочу сделать SQL-инъекцию для удаления базы данных, и когда это произойдет, отобразить страницу PHP. Все работает нормально, пока я не хочу, чтобы рендеринг происходил - даже если инъекция выполняется и БД сбрасывается, когда я проверяю это MySQL, по-прежнему нет рендеринга. Вероятно, проблема связана с неправильным использованием multi_query. Подробнее в комментариях в коде.

<?php
include("/../../connection.php");

if(isset($_POST["button_one"])){
    $username = $_POST['username'];
    $password = $_POST['password'];

    if($conn->multi_query("SELECT id FROM users WHERE username = '$username' OR password = '$password'")) // IF THE USER HAS A VALID USERNAME OR PASSWORD,
    {
        do {
            if ($result = $conn->store_result()) {
                while ($row = $result->fetch_row()) { // THEN ENABLE BUTTON TWO, WHICH HAS TO BE CLICKED TO DROP THE DATABASE
                    echo "
                    <script type=\"text/javascript\">
                        document.getElementById('button_two').disabled=false;
                    </script>
                    ";
                }
                $result->free();
            }
        } while ($conn->next_result());
    }
}

if(isset($_POST["button_two"])){
    $username = $_POST['username']; // SQL INJECTION TO DROP THE DB HAPPENS HERE
    $password = $_POST['password'];

    if($conn->multi_query("SELECT id FROM users WHERE username = '$username' OR password = '$password'")) // SQL INJECTION SUCCEEDED
    {
        do {
            if ($result = $conn->store_result()) {
                while ($row = $result->fetch_row()) {
                    if ($result = $conn->query("SHOW DATABASES LIKE 'mydatabase'")) { // NO MORE DATABASE LIKE THAT, IT HAS BEEN DROPPED DUE TO THE INJECTION
                        if($result->num_rows == 0) {
                            include("another.php"); // THE PROBLEM IS HERE. EVEN THOUGH THE DB IS DROPPED, THIS PAGE IS NOT RENDERING
                        }
                    }
                }
                $result->free();
            }
        } while ($conn->next_result());
    }
}
?>

Буду признателен за любую полезную идею!

1 Ответ

0 голосов
/ 01 июля 2018

Блок кода для включения another.php никогда не выполняется, потому что запрос SHOW DATABASES не выполняется.

Я проверил ваш код и добавил несколько сообщений об ошибках:

if ($result = $conn->query("SHOW DATABASES LIKE 'mydatabase'")) {
    if($result->num_rows == 0) {
        include("another.php");
    }
} else {
    echo "Error: {$conn->error}\n";
}

Я получил это:

Ошибка: команды не синхронизированы; Вы не можете запустить эту команду сейчас

Вы не можете запустить другой SQL-запрос, в то время как у того, который вы уже выполнили, все еще есть результаты для выборки. Даже если вы использовали store_result() для получения набора результатов, это только текущий набор результатов. Вы использовали mulit_query(), который производит несколько наборов результатов. Вам нужно обработать все наборы результатов до конца цикла next_result(), прежде чем вы сможете начать новый запрос.

Еще один урок заключается в том, что вы должны всегда проверять и сообщать об ошибках после попытки query() или multi_query() или prepare() или execute().


Вот пример: вам нужно подождать, пока последний результат не будет обработан, прежде чем вы сможете выполнить другой запрос. Это означает после цикла на $conn->next_result().

if(isset($_POST["button_two"])){
    $username = $_POST['username'];
    $password = $_POST['password'];

    if($conn->multi_query("SELECT id FROM users WHERE username = '$username' OR password = '$password'"))
    {
        do {
            if ($result = $conn->store_result()) {
                while ($row = $result->fetch_row()) {
                    // DISPLAY RESULTS FROM QUERY
                }
            }
            $result->free();
        } while ($conn->next_result());

        // CAN'T START ANOTHER QUERY UNTIL AFTER THE NEXT_RESULT LOOP IS DONE
        if ($result = $conn->query("SHOW DATABASES LIKE 'mydatabase'")) {
            if($result->num_rows == 0) {
            include("another.php");
        }
    }
}
...