【问题标题】:PHP multi_query page render failsPHP multi_query 页面渲染失败
【发布时间】:2018-12-09 07:32:39
【问题描述】:

早上好,

had some problems yesterday 得到了帮助,但不幸的是,我的应用仍然没有 100% 完成我想要它做的事情,尽管只是缺少一个小细节。

假设我想要执行 SQL 注入来删除数据库,并在发生这种情况时呈现 PHP 页面。一切正常,直到我希望渲染发生 - 即使注入执行并且在我检查 MySQL 时删除了数据库,仍然没有渲染。问题可能是由于 multi_query 的使用不正确。更多细节在代码中的 cmets 中。

<?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());
    }
}
?>

任何有用的想法将不胜感激!

【问题讨论】:

  • 真的没人吗?想知道问题本身是不是太容易让所有人都懒得回答,还是没有人有任何线索

标签: php mysql mysqli sql-injection mysql-error-1064


【解决方案1】:

包含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 查询仍有结果要获取时,您不能运行另一个 SQL 查询。即使您使用store_result() 来获取结果集,也只会获取当前结果集。您使用了mulit_query(),它产生了多个结果集。您必须处理所有结果集,直到 next_result() 循环结束,然后才能开始新查询。

这里的另一个教训是,在尝试query()multi_query()prepare()execute() 之后,您应该始终检查并报告错误


这是一个示例:您必须等到处理完最后一个结果之后才能运行另一个查询。这意味着 $conn-&gt;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");
        }
    }
}

【讨论】:

  • 嗨,比尔,感谢您的回答。我确实运行了多个查询来演示 SQL 注入,这是故意的。此外,DROP DATABASE 实际上正在运行,它发生了。缺少的是 "include("another.php");"部分。
  • 是的,我明白了。我在答案的开头添加了一个粗体句子,以明确为什么不发生包含。
  • 啊,好吧,抱歉,现在对我来说还为时过早。不确定我是否遵循了你的逻辑(这可能更像是我的错而不是你的错)。您建议将此部分放在“while ($row = $result->fetch_row()) { if ($result = $conn->query("SHOW DATABASES LIKE 'mydatabase'")) {" 之后 $result->free (); ?不确定我们是否在同一页面上...
  • 你应该好好睡一觉,吃一顿健康的早餐,然后再想想我的答案。
  • 好吧,尝试使用“$result->free();”正如我得出的结论,这与“释放”结果集有关,以便它可以继续下一个,但我没有运气:(
猜你喜欢
  • 2018-12-07
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2019-02-06
  • 2020-09-07
  • 1970-01-01
相关资源
最近更新 更多