如何使我的登录页面容易受到SQL注入的攻击?

时间:2019-03-21 14:36:04

标签: php sql sql-injection

你好,我在一个项目上工作,我需要使这个php登录页面易受攻击的sqli ..我已尽我所能删除可转义特殊字符的功能 但是当我尝试注入

' or '1' = '1' 

什么都没有发生... login.php:

 include ("config.php"); 

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

  $sql = "SELECT id FROM users WHERE username = '$username' and password = '$password'"; 
  $result = mysqli_query($db,$sql);
 $count = mysqli_num_rows($result);

  // If result matched $username and $password, table row must be 1 row

  if($count == 1) {  
     session_register("username");
     $_SESSION['login_user'] = $username;

     header("location: welcome.php"); //set a http header
  }else {
      header("location: failed.php");
  }

3 个答案:

答案 0 :(得分:2)

  

但是当我尝试注入' or '1' = '1'

尝试一下

 $_POST['username'] = "' OR 1 LIMIT 1 --";

您甚至可以使用/添加OFFSET(按行)选择所需的用户。

SELECT id FROM users WHERE username = '' OR 1 LIMIT 1 --' and password = '$password'

然后(由于LIMIT 1)

 if($count == 1) {

是真的。 --是SQL中内联注释的开始,因此其余查询将被忽略。由于我们可以缩短或简化查询,因此具有明显的好处。条件越少越好,我们希望访问查询末尾的“限制和偏移”。

这也说明了搜索密码的愚蠢行为。如果已在代码中将其选中,则不会登录。但是由于未进行登录,因此可能会定时攻击以及其他问题。

答案 1 :(得分:1)

可能不起作用,因为如果您有许多用户记录,$count会多于1,但是您只在检查一条记录。退出:

if ($count == 1) {

可以尝试将条件更改为以下内容:

if ($count != 0) {

那么上述条件只会过滤掉不存在的用户,而不会检查仅返回一个用户。

答案 2 :(得分:1)

如果要在密码字段中插入此类SQL,则查询将失败。

使用' or '1' = '1'

您的查询将变为:

SELECT id FROM users WHERE username = '$username' and password = '' or '1' = '1''
--     Syntax error a single quote is in excess --------------------------------^

您可以删除注射的最后一个单引号:' or '1' = '1