如何通过SQL查询获取PHP变量的值?

时间:2018-10-09 03:03:51

标签: php sql sql-server sql-injection

我目前正在研究一个挑战性问题,该问题要求您提交一个SQL查询以获得答案。但是,这不是简单的SQL注入,因为PHP源代码有一点保障,只能在给出特定输入时才输出答案。这是下面的代码:

<?php
     include "config.php";
     ini_set('error_reporting', E_ALL);
     ini_set('display_errors', 'On');

     $answer = $_POST["answer"];
     $debug = $_POST["debug"];
     $query = "SELECT * FROM answers WHERE answer='$answer'";
     echo "<pre>";
     echo "SQL query: ", htmlspecialchars($query), "\n";
     echo "</pre>";
 ?>

这只是输出我输入的SQL查询。下面是保护措施:

 <?php
    $con = new SQLite3($database_file);
    $result = $con->query($query);

    $row = $result->fetchArray();
    if($answer == $CANARY)  {
      echo "<h1>Perfect!</h1>";
      echo "<p>Your flag is: $FLAG</p>";
    }
    elseif ($row) {
      echo "<h1>You are so close.</h1>";
    } else {
      echo "<h1>Wrong.</h1>";
    }
  ?>

我的理论是,可以通过SQL查询显示$ CANARY的值,并在行中显示echo "SQL query: ", htmlspecialchars($query), "\n";。但是,我却不知道如何这样做。

我知道对此挑战也有类似的问题,但是我认为这并没有真正要求如何将PHP部分放入SQL中,而只是要求如何执行SQL注入。我对PHP的了解是有限的,因为从今天开始我开始学习此问题时,我基本上就开始学习它。可能这是PHP注入?

感谢任何可以帮助我的人!

1 个答案:

答案 0 :(得分:0)

是的。 SQL注入即可。 例如,如果设置

~/tmp$ find . -maxdepth 1 -type d -print0 | sort -z | \
> while IFS= read -r -d '' i ; do \
> echo -n "$i: " ; (find "$i" -type f | wc -l) ; done
.: 89
./1000: 5
./10000: 5
./10001: 4
./10005: 4
./10006: 5
./10009: 5
./1001: 4
./10011: 5
./10015: 4
./10016: 5
./10017: 4
./10018: 4
./10019: 5
./1002: 5
./10021: 5
./10025: 6
./10028: 4
./10029: 5
./1003: 5

您的代码删除答案表

您需要使用

$answer = "'; DELETE FROM answers WHERE ''='"; 

建设

SQLite3::escapeString($answer)

从表答案中获取值数组,并且我需要从数组中比较值