首页 > 解决方案 > 尝试 SQL 注入绕过登录

问题描述

我正在尝试 SQL 注入,然后再向它添加准备好的语句(我目前正在研究),我只是想测试一下。

登录自

<form action="login_auth.php" method="post">
                <div class="form-group first">
                  <label for="username">Username</label>
                  <input type="text" class="form-control" placeholder="Username" id="username" name="username">
                </div>

                <div class="form-group last mb-3">
                  <label for="password">Password</label>
                  <input type="password" class="form-control" placeholder="Your Password" id="password" name="password">
                </div>
                

                <input type="submit" value="Log In" class="btn btn-block btn-primary" name="login">

              </form>

login_auth.php

<?php
session_start();
$connection=mysqli_connect("localhost","root","","upang_hub");
if (isset($_POST['login'])) {
    $username=$_POST['username'];
    $password=$_POST['password'];

     $sql_query = "SELECT * FROM tbl_account WHERE username = '$username' AND password = '$password' ";
     $result = mysqli_query($connection,$sql_query);

    $row=mysqli_fetch_array($result);

    if ($row['username'] == $username && $row['password'] == $password) {
        $_SESSION['username'] = $username;
        echo "<script>alert('Login Success!');document.location='user.php'</script>";
        
    }
    else{
         print_r($sql_query);
    }
}

?>

我无法绕过这个,我尝试'OR'1' = '1在用户名和密码输入中使用。但它向我抛出了位于 login_auth.php 中 else 语句的 $sql_query SELECT * FROM tbl_account WHERE username = ''OR'1'='1' AND password = ''OR'1'='1'

那么它应该是正确的结果,因为它是 1=1

标签: phpsqlsql-injection

解决方案


SQL 注入有效,查询返回表中的所有行。

但随后 PHP 会根据获取的第一行检查用户名和密码:

if ($row['username'] == $username && $row['password'] == $password)

由于用户名和密码不匹配,因此您无法登录。

SQL 注入通常会绕过用户名和密码检查,因为代码假定如果查询返回某些内容,它必须与表单中输入的内容相匹配,因此它不会执行此额外检查。


推荐阅读