2016-07-27 89 views
-1

我想通過繞過我自己的登錄頁面實踐sql注入,但我不知道如何使它容易sqli,你能告訴我該怎麼辦? 這是PHP代碼:Sql注入登錄繞過

<?php 
    @ob_start(); 
    session_start();require('db.php'); 
    if (isset($_POST['username'])) { 
     $username = $_POST['username']; 
     $password = $_POST['password']; 
     $query = "SELECT * FROM `users` WHERE username='$username' and password='$password'"; 
     $result = mysql_query($query) or die(mysql_error()); 
     $rows = mysql_num_rows($result); 
     if(!empty ($rows)) { 
      $_SESSION['username'] = $username; 
      header("Location: index.php"); // Redirect user to index.php 
     } else { 
      echo "<div class='form'><h3>Username/password is incorrect.</h3><br/>Click here to <a href='login.php'>Login</a></div>"; 
     } 
+0

在此先感謝.. –

+3

那麼,你是幸運的。它已經很容易受到sql-i的攻擊。 – Danielius

+2

糟糕的使用'!empty'那裏... [PHP的權威指南isset和空](http://kunststube.net/isset/) – deceze

回答

0

我希望這可以給你一個線索。

這是您的查詢:

$query = "SELECT * FROM `users` WHERE username='$username' and password='$password'"; 

通過輸入1 = 1,不會繞過它。只需拿一張紙和一支鉛筆,想象你的查詢將如何。在你的情況下將輸出:

SELECT * FROM users WHERE username = '1 = 1' AND password = '1 = 1' 

查詢是正確的,雖然沒有用戶名叫做「1 = 1」密碼「1 = 1」。

現漏洞:

您需要將用戶和密碼參數,可以欺騙查詢字符串。

例如:

x' OR '1' = '1 

什麼會產生這種輸入?

SELECT * FROM users WHERE username = 'x' OR '1' = '1' AND password = 'x' OR '1' = '1' 

如何防止這種注射?

選項#1:從OWASP

主要防禦採取利用預準備語句(參數化查詢)

選項#2:使用存儲過程

選項#3:擺脫所有用戶提供的輸入

附加防禦:

還強制:最小特權

也履行:白名單輸入驗證