web-dev-qa-db-ja.com

ブールベースのSQLインジェクションについて

ブールベースのブラインドSQLインジェクションの概念を理解しようとしています。私はそれを理解するために OWASP Guide To SQLi を経験しました。しかし、私はそれがどのように正確に機能するのか混乱しています。以下は、上記のリンクの記事から私が理解していることです。私の理解が正しいか、何かを誤解している場合はお知らせください。

したがって、上記のリンクのように、脆弱なパラメーターが 'id'であるサンプルURLを次のように想定します。

_http://www.example.com/index.php?id=1'
_

したがって、サーバーで実行される対応するクエリは次のようになります。

_SELECT field1, field2, field3 FROM Users WHERE Id='$Id' 
_

ここで、UsersUsernameという名前のフィールドが含まれていると想定して、Usernameフィールドの値を_id=1_で抽出します。したがって、次のようにして、文字ごとにこの値を推測しようとします。

_$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1 
_

この記事では、評価が偽であることが判明した場合は常に、ASCIIの値を97から1ずつ1ずつ増やしていきます。

ここでの問題は、上記のクエリから返される結果がTRUEであるかFALSEであるかを見つける方法です。

したがって、この問題を解決するために、この記事では、上記を試す前に次のことを実行しようとしています。

_$Id=1' AND '1' = '2_したがって、これはクエリ_SELECT field1, field2, field3 FROM Users WHERE Id='1' AND '1' = '2'_を生成します。

上記のクエリの実行後、サーバーは特定のステータス(ページ、リダイレクトなど)を返します。これで、_1=2_は常にFALSEに評価されるため、クエリから返されたFALSE結果のイベントで何が起こるかを知ることができます。

これで、この結果を$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1の実行によって得られる結果と照合し、97(または特定のASCII値)に対するテストがTRUEに評価されるかどうかを判断できます。 FALSE

  1. 上記の私の理解は正しいですか?
  2. はいの場合、クエリ$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1で、ANDの後ろの部分が必要なのはなぜですか?つまり、クエリの太字のパットがないと、(上記の分析で確認されたように)結果を確認できないのでしょうか。クエリの太字部分が本当に必要なのはなぜですか?
  3. この手法でも、基本的にはエラーページを確認して成功ページと区別しようとしているため、ブールベースと呼ぶのではなく、エラーベースのSQLiと見なすべきではありませんか?
9
qre0ct

上記の私の理解は正しいですか?

はい、あなたの理解は正しいです。

はいの場合、クエリでは$ Id = 1 'AND ASCII(SUBSTRING(username、1,1))= 97 AND' 1 '=' 1、太字部分の必要性は何ですか上?つまり、(上記の分析で確認されたように)クエリの太字のパットなしで結果を確認できないのでしょうか。クエリの太字部分が本当に必要なのはなぜですか?

SQLインジェクションをうまく活用するには、結果のSQLが有効である必要があります。末尾の_AND '1'='1_は、挿入されたコードを既存のステートメントに適合させるためのものです。最初に_1'_を使用して文字列リテラルからエスケープしたので、最後に新しい文字列リテラルを導入する必要があります。ただし、MySQLは文字列を整数値と比較できるため、AND ASCII(SUBSTRING(username,1,1))='97を使用することもできます。

この手法でも、基本的にはエラーページを確認して成功ページと区別しようとしているため、ブールベースと呼ぶのではなく、エラーベースのSQLiと見なすべきではありませんか?

エラーベースのSQLインジェクションは、サーバーが次のような実際の技術的なエラーメッセージで応答する場合です。

#1064-SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、1行目付近の '' 'を使用するための正しい構文を確認してください。

ここで、結果のSQLのどの部分が失敗したかを確認でき、インジェクションで修正する方法を推論できます。

ブールベースのSQLインジェクションでは、表示されるのは、異なる入力に対する異なる動作のみです。このさまざまな動作には、エラーメッセージの応答が含まれる場合がありますが、技術的な詳細がを通知するものでない限り失敗した場合、それ以上は役に立ちませんその他のブール動作。

9
Gumbo