首页 > 解决方案 > SQL注入认证绕过问题

问题描述

我会简短地说,直奔主题。

我正在测试我在下面制作的 PHP 代码上的 SQLI 登录绕过。

if(isset($_POST["login"]) && isset($_POST["password"])){


$sql="select * from users where login='{$_POST["login"]}' and password='{$_POST["password"]}'";


$result=mysqli_query($conn, $sql);


if(mysqli_num_rows($result) != 0)
    echo "<h1>Login Success!</h1>";


else
    echo "<h1>Invalid Login!</h1>";


} 

我使用admin' --作为登录字段,以便在不输入密码的情况下成功绕过登录。

但问题是它不起作用,但是当我尝试使用这个管理员' -'-时它却起作用了。

所以问题是那个特定的备忘单如何以及为什么会起作用,而不是第一个?

这个管理员'--'--有效,但不是这个管理员'--

这些是我输入这 2 个备忘单时的服务器端代码。

不工作的旁路。

$sql="select * from users where login='admin' --' and password='{$_POST["password"]}'"; 

有效的旁路。

$sql="select * from users where login='admin' -- ' --' and password='{$_POST["password"]}'"; 

只需要对第一张备忘单不起作用的方式和原因进行一些澄清或解释,而第二张备忘单起作用。谢谢!

标签: phpmysqlsqlcode-injection

解决方案


您的代码中有一些真正的语法错误:

第一:不要做这样的事情:$sql="select * from users where login='{$_POST["login"]}' and password='{$_POST["password"]}'";

正确的方法是创建一个等于登录名和密码值的变量。例子:

$login=$_POST['login'];
$password=$_POST['password'];

在此之后,您的查询应如下所示:

$sql="select * from users where login='$login' and password='$password'";

推荐阅读