我目前正在研究一个挑战性问题,该问题要求您提交一个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注入?
感谢任何可以帮助我的人!
答案 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)
从表答案中获取值数组,并且我需要从数组中比较值