3

私はグーグル全体を検索して、以下をバイパスする方法を確認しました(これは DVWA の高レベルのセキュリティによるものです)。

$id = $_GET['id']; 
    $id = stripslashes($id); 
    $id = mysql_real_escape_string($id); 

    if (is_numeric($id)){ 

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 
    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); 

    $num = mysql_numrows($result); 

    $i=0; 

    while ($i < $num) { 

        $first = mysql_result($result,$i,"first_name"); 
        $last = mysql_result($result,$i,"last_name"); 

        echo '<pre>'; 
        echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
        echo '</pre>'; 

        $i++; 
    } 
} 

それをクラックすることは可能ですか?

DVWA に慣れていない方のために、DVWA に関する YouTube ビデオをご覧ください: http://www.youtube.com/watch?v=oMV0JZVxvdQ

また、私の他の懸念は中レベルです。それは機能しますがmysql_real_escape_string()、低レベルから同じ SQL インジェクションを使用し、引用符を削除すると、保護がバイパスされます。何故ですか?なぜそんなに簡単にバイパスできたのmysql_real_escape stringですか?

Medium レベルのコード (簡潔なバージョン) は次のとおりです。

   $id = $_GET['id']; 
    $id = mysql_real_escape_string($id); 
    $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";

おそらくはるかに安全なので、PDOを使用したいと思います。それについてのあなたの考えを教えてください。

よろしくお願いします。

4

3 に答える 3

2

を追加してis_numericも、これが本格的なSQL攻撃になる可能性は低くなりますが、is_numeric正確ではありません。

is_numeric('0xdeadbeef') // true
is_numeric('10e3') // true

フィルタを使用することをお勧めします。

if (false !== ($id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT))) {
}
于 2012-05-30T04:05:34.273 に答える
0

中レベルでは、次を使用するだけです1 and 1=1 order by X

作成者のクエリはすべて低レベルですが、テーブルの名前を 16 進コードに置き換えることができ0x...ますwhere table_name=0x12345。文字列 char を使用すると、'許可されていないため、エラーが発生します。

于 2013-04-08T01:27:31.017 に答える
0

私はあなたと同じ問題を抱えています。打ち方もわかりません。

しかし、中レベルの問題に対する答えがあると思います。それはプログラマーのエラーだと思います。

$getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"

低レベルと高レベルでは、中ではなく $id に引用符があることに注意してください...それがポイントだと思います。あなたがこれを持っているなら:

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"

ミディアム レベルで mysql_real_escape 文字列をバイパスするのはそれほど簡単ではないと確信しています。

言い換えれば、High Level で引用符を持っていない場合は、インジェクションも実行できると確信しています。

于 2012-11-08T11:14:06.660 に答える