5

これは、自分のコードを保護するためのMySQLインジェクションをよりよく理解するための、自分のデータベースに対する教育の試みであることに最初に注意したいと思います。

次のコードに対してMySQLインジェクションを構築する方法の例をいくつか考え出す必要があります。これは基本的なユーザーログインシステムであり、エスケープせずにユーザー名とパスワードを受け入れます

$user = (!empty($_POST['user'])) ? $_POST['user'] : '';
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : '';

次に、MySQLクエリは、次のように、usersという名前のテーブルに入力されたユーザー名とパスワードを見つけようとします。

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'");

これはエスケープされていない入力であり、次の目的でMySQLインジェクションを考え出そうとしています。

  1. 正当なユーザーのユーザー名を知っているパスワードをバイパスし(私のユーザーテーブルの1人のユーザーはテスターです)、
  2. ユーザーテーブル全体を削除するインジェクション。

ウィキペディアのMySQLインジェクションの例をいくつか試しましたが{}、クエリ内でインジェクションが妨げられていると思われるので、これに自信のある方の助けをいただければ幸いです。ありがとうございました。

4

6 に答える 6

5

このようなことをする必要があります:

  1. ユーザー「foo」としてログインするには、ユーザー名を「foo」に設定します-「

これにより、クエリは次のようになります

$res = mysql_query("SELECT * from users where user='foo' -- ' AND pass=''");

「-」は、行の残りの部分がコメント化されていることを意味します

  1. これが機能するかどうかはわかりませんが、ユーザー名を「foo」または(DROP TABLEユーザー)-」に設定してみてください

これにより、クエリは次のようになります。

$res = mysql_query("SELECT * from users where user='foo' OR (DROP TABLE users) -- ' AND pass=''");

しかし、それを受け入れないかもしれません-サブクエリはSELECTしかできないと思います。

mysql_query関数は1つのクエリのみを実行します-他の関数はこれを実行させます:

$res = mysql_query("SELECT * from users where user='foo'; DROP TABLE users -- ' AND pass=''"); 
于 2009-10-02T09:12:34.280 に答える
3

を使用すると複数のクエリを送信できないDROPため、テーブルにアクセスできなくなります。mysql_query

于 2009-10-02T09:16:31.807 に答える
1

これが長いリストです。

http://ha.ckers.org/sqlinjection/

コードは完全に保護されていないため、ほとんどすべてのテストに失敗することは明らかです。

于 2009-10-02T09:10:53.813 に答える
1
$user = (!empty($_POST['user'])) ? $_POST['user'] : '';
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : '';

$user = mysql_real_escape_string($user);
$pass = msyql_real_escape_string($pass);

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'");

それはあなたのためにコードを保護します。誰もテーブルに行くことができなくなりDROPます。

于 2011-04-09T04:58:25.727 に答える
0

これを試して、テーブル全体がダンプされるかどうかを確認してください。

For both username and password, I enter:

' OR 1=1 AND '}' '= 

もちろん、これは、データ値をラップするために中括弧を使用していることを私が知っていることを前提としています。

MySQLがそのような混合ロジックをどのように処理するかは、括弧で囲まれていないため、よくわかりません。機能するかどうかをお知らせください。

于 2009-10-02T09:21:39.067 に答える
0

{}は理由ではありません。phpのMagicQuotes(現在は非推奨)が、かなり単純な攻撃からユーザーを保護している可能性があります。

ただし、それらをオフにしてから再度テストすることはできます。

于 2009-10-02T09:11:37.417 に答える