QID 150022 の再現方法

Web アプリケーションスキャンの QID 150022 Verbose エラーメッセージを再現する方法について、レポート詳細に示される情報を使用して説明します。ここでは、クエリ文字列とフォーム入力という 2 つのインジェクションポイントに注目します。

脆弱性レポートを調べてみると、レポートされた URL について“ Form Entry Point ”が存在する場合と存在しない場合とがあることに気付きます。フォームエントリポイントが存在する場合、これは当社のサービスがテストを行ったフォームのことであり、このフォームがフォームエントリポイントとしてレポートされた URL にあることを意味しています。

フォームエントリポイントが存在していない場合、これは URL を介してペイロードをリプレイ可能で、レポートされた URL にはレポートをトリガするために使用されたペイロードの 1 つが既に含まれている可能性が高いことを意味しています。

URL インジェクションの例:

http://www.example.com/index.php?id=%3CIMG%20SRC%3Djavascript%3Aqss%3D7%3E

Payload: id=%3CIMG%20SRC%3Djavascript%3Aqss%3D7%3E

Results:...

Payload: id=%22%3E%3Cqss%3E

Results:...

上の例では、フォームエントリポイントが存在していないため、これは URL を介してリプレイ可能であることがわかります。レポートされたペイロードの 1 つが“ id=%3CIMG%20SRC%3Djavascript%3Aqss%3D7%3E ”であるため、インジェクションポイントはクエリ文字列パラメータの“ id ”であり、インジェクション値が“ %3CIMG%20SRC%3Djavascript%3Aqss%3D7%3E ”であることがわかります。この例では、次のリンクへのアクセスに認証が必要である場合を除いて、このリンクへリクエストを行うだけで問題を再現することが可能です。

http://www.example.com/index.php?id=%3CIMG%20SRC%3Djavascript%3Aqss%3D7%3E

フォームインジェクションの例:

http://www.example.com/j_security_check

Form Entry Point: http://www.example.com/

Params: username

Payload: username=%22%3E%3Cqss%3E&password=password&action=Login

Result:...

フォームエントリポイントが存在していることから、当社のサービスがテストしたのはフォームであることがわかります。このフォームは、フォームエントリポイントにあります。インジェクションポイントは“ username ”フィールドであり、ペイロードを調べると、“ username ”フィールドに使用されているペイロードが“ %22%3E%3Cqss%3E ”であることがわかります。

フォームエントリポイントのページに移動すると、ページ内には少なくとも 1 つのフォームがあるはずです。ほとんどの場合は、どのフィールドがペイロードのインジェクションを行なっているのかを判断するのは簡単なプロセスなのですが、判断に迷う場合は、ソースを表示して、どの <input> にレポートの“ Params ”と同じ名前が使用されているのかを特定します。

この時点で、フォームのフィールドにレポートされたペイロードをインジェクションし、試しに送信してみることができます。テストしているフォームに複数のフォームフィールドが含まれる場合は、テスト中のフィールド以外は、すべて適切に設定しておくことをお勧めします。

サーバに実際にデータを送信する前に、クライアント側で JavaScript による検証が行われる場合もあります。この場合、ここでの目的は回避することが容易なクライアント側の検証をテストすることではなく、このようなペイロードに対してサーバがどのように反応するのかをテストすることであるため、ブラウザの JavaScript の実行を無効にしておく必要があります。