2017-11-12 8 views
-2

私はセキュリティツールを監査しています。自分自身の「安全でない領域」(ランダムに生成された偽のデータを使用)を作成するのがよい方法だと判断しました。 SQLインジェクションに敏感です。しかし、私は実際にそれを注入するように見えることはできません。私はそれに悪いクエリを与えると、 "ここにアカウントが見つかりました"が印刷されないが、エラーメッセージも印刷されないことに気付きます。意図的にスクリプトをSQLインジェクション可能にする

私が間違っていることを誰かに教えてもらえますか?

<?php 

$resultHTML; 
if (isset($_POST['email']) || isset($_GET['email'])) { 

    $conn = mysqli_connect($servername,$username,$password); 

    if ($conn) { 

     //this part is insecure (intentionally for testing) 
     if (isset($_GET['email'])) { 
      $query = "SELECT * from badSQL.Two WHERE email = '$_GET[email]'"; 
     } else { 
      $query = "SELECT * from badSQL.Two WHERE email = '$_POST[email]'"; 
     } 

     //echo $query; 
     $result = $conn->query($query); 

     if ($result) { 
      $resultHTML = "Here are the accounts found: "; 

      $hasAccount = false; 
      while ($row = mysqli_fetch_assoc($result)) { 
       $hasAccount = true; 
       $resultHTML .= "<br>".print_r($row); 
      } 

      if ($hasAccount === false) { 
       $resultHTML = "No accounts found."; 
      } 
     } 

    } else { 
     $resultHTML = "DB Connection could not be established: ".$conn->connect_error; 
    } 

} 

?> 

<html> 
<head> 

    <title>Two BadSQL Test</title> 

</head> 
<body> 

    <h1>Two Website!</h1> 
    <br> 
    <h3>Forgot Password</h3> 
    <p>Enter your email below, and click submit:</p> 
    <form id="forgotForm" method="get"> 
     <input type="text" name="email" /> 
     <input type="submit" value="submit" /> 
    </form> 

    <br> 
    <div id="results"><?php echo $resultHTML; ?></div> 
</body> 
</html> 
+0

使用している注入ベクターとは何ですか?そして、あなたはそのテーブルからどのデータを抽出したいのですか? – h3ct0r

+0

あなたはどんなエラーメッセージを言っていますか? 'ここにアカウントが見つかりました 'が表示されず、接続エラーがない場合は、印刷するエラーメッセージは表示されません。 – Zeke

+0

「1」または「1」=「1」を試してください。上記のスクリプトには有効なSQLiでなければなりません。カプセル化された偽のデータの脆弱性を作成すると、正当な攻撃のベクタとして機能する可能性があるため、自分のサイトを脆弱なものにしたいと思う理由がわかりません。 –

答えて

1

1' OR '1'='1それが評価されるように、あなたの上記のスクリプトのための有効なSQLIする必要があります:それはANを使用すると電子メールアドレスは常に間違っているだろうということは重要ではありません

"SELECT * from badSQL.Two WHERE email = '1' OR '1'='1'" 

OR句。 1、常にはとすると、全体としての表現は常にtrueになります。したがって、上記のスクリプトはすべての電子メールチェックをスキップして、'1' = '1'の条件を満たす最初のユーザーを見つけようとします。これは、テーブルの最初のユーザー(IDは1になるため、通常は管理者)と相関し、さらに悪用されます。

これを防ぐには、stored procedures or parameterised queriesを使用し、各テーブルの最初のユーザーにできるだけ少ない権限を持たせることをおすすめします。私はまた、OWASP SQLi Prevention Cheat Sheetをチェックアウトすることをお勧めします。

同等の非脆弱PHPは、クエリのようなものになりますパラメータ化:また

$stmt = $dbConnection->prepare('SELECT * FROM badSQL.TwoWHERE name = ?'); 
$stmt->bind_param('s', $name); 

$stmt->execute(); 

$result = $stmt->get_result(); 
while ($row = $result->fetch_assoc()) { 
    // Do something with $row 
} 

をカプセル化された偽のデータのための脆弱性を作成することとなり得るとして、私は、意図的に自分のサイトがより脆弱作りに対してお勧めします正当な攻撃のためのベクトル。

希望するもの:

関連する問題