Php SQL注入用户名和密码
我一直在和几个朋友做一个项目。我们的任务是找到用户名和密码凭据以登录到一个伪造的数据库 以下是源代码:Php SQL注入用户名和密码,php,mysql,sql,sql-injection,Php,Mysql,Sql,Sql Injection,我一直在和几个朋友做一个项目。我们的任务是找到用户名和密码凭据以登录到一个伪造的数据库 以下是源代码: <?php include "config.php"; $con = mysqli_connect("localhost", "sql1", "sql1", "sql1"); $username = $_POST["username"]; $password = $_POST["password"]; $debug = $_POST["debug"]; $query = "SELECT
<?php
include "config.php";
$con = mysqli_connect("localhost", "sql1", "sql1", "sql1");
$username = $_POST["username"];
$password = $_POST["password"];
$debug = $_POST["debug"];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($con, $query);
if (intval($debug)) {
echo "<pre>";
echo "username: ", htmlspecialchars($username), "\n";
echo "password: ", htmlspecialchars($password), "\n";
echo "SQL query: ", htmlspecialchars($query), "\n";
if (mysqli_errno($con) !== 0) {
echo "SQL error: ", htmlspecialchars(mysqli_error($con)), "\n";
}
echo "</pre>";
}
if (mysqli_num_rows($result) !== 1) {
echo "<h1>Login failed.</h1>";
} else {
echo "<h1>Logged in!</h1>";
echo "<p>Your flag is: $FLAG</p>";
}
?>
您的问题位于select语句中:
SELECT * FROM users WHERE username='' OR 1=1 LIMIT 1 -- ' AND password='$password'
假设一个用户提供名称”或1=1 LIMIT 1--
(注意--
后面的空格),它总是准确地返回一个结果行-因此登录是有效的,因为执行的查询是:
SELECT * FROM users WHERE username='' OR 1=1 LIMIT 1
mysql将忽略注释,因此查询为:
$username = mysqli_real_escape_string($link, $_POST["username"]);
在使用这些值之前,应先转义这些值:
以这把小提琴为例:(一个resultrow->你的逻辑会说:“登录!”-甚至不知道任何用户名和/或密码。)发生了什么?您可能需要添加LIMIT 1
,因为您只检查是否有恰好一行被检索。首先,您应该验证您获得的内容,确保您获得了有效的用户名和哈希密码!!然后你可以使用像addslashes()这样的“转义函数”,但是有更好的方法取决于lib(这里是mysqli),那么你建议我如何根据你想要实现的内容来验证内容。祝你好运。将限制1添加到什么?你应该使用准备好的语句重写此内容,并且应该讨论密码哈希,否则这不是一个坏答案。这些凭据仍然无效。你建议我怎么做?@tylerutherford第一步是:只需回显查询,而不是执行查询,并检查是否存在任何格式错误的内容。然后,您可以对所需的注入进行反向工程。但由于我不知道,如果您尝试注入自己的系统或其他东西,我将不会为您执行此任务:)
$username = mysqli_real_escape_string($link, $_POST["username"]);