ブールベースのブラインドSQLインジェクションの概念を理解しようとしています。私はそれを理解するために OWASP Guide To SQLi を経験しました。しかし、私はそれがどのように正確に機能するのか混乱しています。以下は、上記のリンクの記事から私が理解していることです。私の理解が正しいか、何かを誤解している場合はお知らせください。
したがって、上記のリンクのように、脆弱なパラメーターが 'id'であるサンプルURLを次のように想定します。
_http://www.example.com/index.php?id=1'
_
したがって、サーバーで実行される対応するクエリは次のようになります。
_SELECT field1, field2, field3 FROM Users WHERE Id='$Id'
_
ここで、Users
にUsername
という名前のフィールドが含まれていると想定して、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
。
$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1
で、AND
の後ろの部分が必要なのはなぜですか?つまり、クエリの太字のパットがないと、(上記の分析で確認されたように)結果を確認できないのでしょうか。クエリの太字部分が本当に必要なのはなぜですか?上記の私の理解は正しいですか?
はい、あなたの理解は正しいです。
はいの場合、クエリでは$ 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インジェクションでは、表示されるのは、異なる入力に対する異なる動作のみです。このさまざまな動作には、エラーメッセージの応答が含まれる場合がありますが、技術的な詳細がを通知するものでない限り失敗した場合、それ以上は役に立ちませんその他のブール動作。