Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL注入用户名和密码_Php_Mysql_Sql_Sql Injection - Fatal编程技术网

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"]);