问题描述
我正在尝试 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
。
但它向我抛出了 $sql_query,它位于 login_auth.PHP 中的 else 语句中
SELECT * FROM tbl_account WHERE username = ''OR'1'='1' AND password = ''OR'1'='1'
那么结果应该是正确的,因为它是 1=1
解决方法
SQL 注入有效,查询返回表中的所有行。
但是 PHP 会根据获取的第一行检查用户名和密码:
if ($row['username'] == $username && $row['password'] == $password)
由于用户名和密码不匹配,您无法登录。
SQL 注入通常会绕过用户名和密码检查,因为代码假设如果查询返回某些内容,它必须与表单中输入的内容匹配,因此它不会进行额外的检查。