フォーム スプーフィングより高度かつ洗練された攻撃は、HTTP リクエスト スプーフィングです。これにより、攻撃者に完全な制御と柔軟性が与えられ、ユーザーが送信したデータは盲目的に信頼できないことがさらに証明されます。
これがどのように機能するかを示すには、//m.sbmmt.com/ にある以下のフォームを参照してください。 「選択」ボタンをクリックすると、ブラウザーは次の HTTP リクエストを発行します:
CODE:
<form action="process.php" method="POST"> <p>Please select a color: <select name="color"> <option value="red">Red</option> <option value="green">Green</option> <option value="blue">Blue</option> </select><br /> <input type="submit" value="Select" /></p> </form>
.
ほとんどのブラウザにはオリジン URL 値が含まれているため、なりすましを防ぐために $_SERVER['HTTP_REFERER'] 変数を使用したくなるかもしれません。確かに、これは標準ブラウザを使用した攻撃に対して使用できますが、攻撃者はこのちょっとした煩わしさでは阻止されません。攻撃者は、HTTP リクエストの生の情報を編集することで、HTTP ヘッダーの値、GET データと POST データ、および HTTP リクエスト内のすべてのコンテンツを完全に制御できます。
攻撃者はどのようにして元の HTTP リクエストを変更するのでしょうか?プロセスは非常に簡単です。ほとんどのシステム プラットフォームで提供されている Telnet ユーティリティを介して、Web サーバーのリスニング ポート (通常はポート 80) に接続することで、Web サーバーと直接通信できます。以下は、この手法を使用して //m.sbmmt.com/ ページをリクエストする例です。例は HTTP です。ヘッダー情報にホスト情報が必要なため、/1.1 仕様の最も単純なリクエストです。リクエストの終わりを示す 2 つの連続した改行を入力すると、HTML レスポンス全体が画面に表示されます。
Telnet ユーティリティは Web サーバーと直接通信する唯一の方法ではありませんが、多くの場合、これが最も便利です。ただし、同じリクエストを PHP でエンコードすると、自動化できます。前のリクエストは次の PHP コードで実現できます:
CODE:
POST /process.php HTTP/1.1 Host: example.org User-Agent: Mozilla/5.0 (X11; U; Linux i686) Referer: //m.sbmmt.com/ Content-Type: application/x-www-form-urlencoded Content-Length: 9 color=red
もちろん、上記の目的を達成するには多くの方法がありますが、重要な点は次のとおりです。 HTTP はよく知られた標準プロトコルであり、経験豊富な攻撃者はよく知っており、一般的なセキュリティ脆弱性の攻撃方法にも精通しています。
フォームのなりすましに比べて、HTTP リクエストをなりすます方法はそれほど多くないため、注意を払う必要はありません。これらの手法について説明する理由は、攻撃者がアプリケーションに悪意のある情報を入力することがいかに簡単であるかをよりよく示すためです。これは、入力のフィルタリングの重要性と、HTTP リクエストによって提供される情報は信頼できないという事実を再度強調しています。