php - 尝试 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
解决方案
SQL 注入有效,查询返回表中的所有行。
但随后 PHP 会根据获取的第一行检查用户名和密码:
if ($row['username'] == $username && $row['password'] == $password)
由于用户名和密码不匹配,因此您无法登录。
SQL 注入通常会绕过用户名和密码检查,因为代码假定如果查询返回某些内容,它必须与表单中输入的内容相匹配,因此它不会执行此额外检查。
推荐阅读
- javascript - 如何将 8 位整数转换为十六进制颜色值?
- python - 如何在python中将字符串转换为json列表?
- amazon-web-services - 具有 ec2 完全访问权限的 IAM 策略不允许创建 EC2 实例
- swift - 调用我的包时,由于“内部”保护级别,无法访问“CircularProgressView”初始化程序
- linux - 关于此错误的问题:未在此范围内声明“bdget”
- c++ - 使用读写器方法的 C++ 中的多线程数据库半途而废
- flutter - 在 Flutter 中使用 ListView Builder 加载不同的 PDF 文档
- c# - 我希望我的玩家(角色)找到他站立的节点
- sql - 如何从nodejs express将对象数组发送到存储过程?
- python - 检查是否有一种方法可以在任意范围 F 内从 S 点到达 G 点