0

私はSQLインジェクションの分野の初心者です。助けていただければ幸いです。

シナリオ:脆弱なWebアプリケーション。

次のようなURLがあるとします。

http://www.site1.com/cms/login.php

また、サイトにアクセスするには、次の資格情報を提供する必要があるとします。

ユーザー名:foo、パスワード:bar

したがって、上記のURLは次のようになります。

http://www.site.com/cms/login.php?username=foo&password=bar

次にペイロードを注入すると、次の'OR'1'='1ように変更されます。

 http://www.site.com/cms/login.php?username=foo&password=bar'OR'1'='1

それは私には十分明らかですが、私の懸念は、対応するSQLクエリ(バックエンドRDBMSによって処理されて送信されるクエリ)は次のようになる必要があると言われたことです。

SELECT userid
FROM CMSUsers
WHERE user = 'foo'AND password = 'bar' OR'1'='1';

'1'='1'は常にTRUEであるため、クエリはトートロジーです。

しかし、ペイロードは'OR'1'='1そうであり、クエリの条件ステートメントは異なっているようですOR'1'='1';'ペイロードの最後の1の後にアクセントはありません)

私の疑いは理にかなっていますか?

どんな助けでも大歓迎です。

4

1 に答える 1

4

この種の攻撃に対して脆弱なアプリケーションには、SQLクエリを作成するための次のようなコードが含まれます。

var query = "SELECT userid
FROM CMSUsers
WHERE user = '" + usernameValue + "' AND password = '" + passwordValue + "'";

一重引用符の配置に注意してください。passwordValueユーザーが変数を介して渡すものはすべて、一重引用符内のその場所に挿入されます。

ここで、攻撃を実行するには、パスワードの一重引用符を早期に閉じて、常に真である部分を追加できるようにする必要があります。次のようなものを渡しますbar' OR '1' = '1。注意:最初または最後に一重引用符はありません。これらは、アプリケーションのハードコードされたクエリ文字列から取得されます。

上記の場所にこの値を挿入passwordValueすると、次のようになります。

... AND password = 'bar' OR '1' = '1'
<------- A --------><------- B ---->A
  • A:プログラムからのハードコードされたコンテンツ
  • BpasswordValue:変数を介して渡されるコンテンツ
于 2013-01-14T10:18:10.450 に答える