-2

次のようなクエリがあります。

select * from tablename where username='value1' and password='value2';

次のフィールドに設定した場合:

username ='admin' and password ='admin'; 

次に、管理者として Web サイトにサインインします。

ここで、クエリを SQL に挿入する場合は、ユーザー名フィールドに value を入力します
'or 1=1。その後、クエリは次のように実行されます。

select * from tablename where username ='' or 1=1

この後のすべてを想定すると、クエリは正常に実行されます。

私の質問は上記の例に基づいています。どのユーザーとしてログインしますか?

As:
   1. 管理者
   2. またはテーブルの最初の行?
   3. または他のユーザーとその方法は?

4

2 に答える 2

3

これは単なる SQL クエリであり、ログインしたり、他のアプリケーション機能を実行したりしません。取得したデータで何が行われるかは、特定のアプリケーションに完全に依存します。

コードは、結果のレコードセットの最初の行を喜んで消費し、それがログインするユーザーであると想定します。たとえば、クエリが LINQ で実行され、使用されている場合、例外をスローすることもあります.SingleOrDefault()。アプリケーション コードを見なければ、それを知る方法はありません。

于 2012-09-11T18:35:05.903 に答える
2

テーブル内のすべての行は、tablenameこのクエリを実行しているものに返されます。これらの行が返される順序は明確に定義されていません (また、テーブルには順序がないため、「最初の行」の推測はさまざまな理由で間違っています)。

次に、何が起こるかを知るために、消費するコードを確認する必要があります。指定された最初の行を取得する場合と、指定された最後の行を取得する場合があります (このクエリを実行すると、最初と最後の行が異なる可能性があります。 、順序が明確に定義されていません)。結果のすべての行を (何らかの方法で) マージしようとする場合があります。

コードが SQL インジェクションの対象になった場合に何が起こるかを考えるべきではありません。適切な防御策 (たとえば、パラメーター化されたクエリ) を適用するだけでよいので、再度考える必要はありません。


たとえば、議論のために、このクエリは常に特定の順序で行を返し (月が満月である限り)、最も低いUserID(または類似の) 行が最初の行であり、消費する行がコードは最初に返された行を使用し、他の行を無視します。UserIDそのため、何も実行できず、攻撃を警告する 0のダミー ユーザーを「狡猾に」作成することにします。

攻撃者が行う必要があるのはORDER BY CASE WHEN UserName='Admin' THEN 0 ELSE 1 END、クエリに を挿入することだけです。ビンゴ、返される最初の行は、管理者ユーザーであることが保証されます。

于 2012-09-11T18:40:13.030 に答える