【Security】HTTPヘッダ・インジェクション+Laravel実装
概要
ユーザーからの入力値の処理に脆弱性があると、
攻撃者がHTTPリクエストに罠を仕掛けてレスポンスを生成し、
ユーザーに偽のURLをクリックさせ、スクリプトを実行させたり情報を盗み取る攻撃。
改行コードが原因となることから「CRLFインジェクション」とも呼ぶ。
複数のレスポンスを作り出す攻撃を
「HTTPレスポンス分割(HTTP Response Splitting) 攻撃」と呼ぶ。
発生しうる脅威
原因
入力値のバリデーション不足
対策
ユーザーから入力される値から、空白コードや改行コードを削除する。
根本的解決
1.ヘッダーの出力用APIを使う
HTTPレスポンスヘッダーをプログラムで直接出力せず、
実行環境や言語に用意されているヘッダ出力用のAPIを使う。
HTTPヘッダの構造は複雑なため、実行環境によっては修正パッチや追加の対策も検討する。
2.改行をできないように処理する
APIを使えないときは、
- 改行の後に空白を入れることで継続行として処理する方法
- 改行コード以降の文字を削除する方法
- 改行が含まれていたらWebページ生成の処理を中止する方法
保険的対策
3.ユーザー入力から改行コードを削除する
ユーザーが入力した全ての値から改行コード(\r, \n など)や制御文字を削除する。
しかし、テキストエリアの入力データなど改行を含むかもしれない文字列からも、改行が削除されてしまう。
Laravelでの実装例
1. Laravelの標準レスポンスを使う
HTTPヘッダの改行コードを自動で除去してくれる。
return response()->redirectTo($url);
☀︎response()は、改行文字(\r, \n)を自動的に削除する。
☀︎redirectTo()は、リダイレクト先を動的に設定できる。
2.外部パラメータは必ずバリデーション処理
どうしてもLocationヘッダに外部パラメータやユーザー入力を使用する場合は、
URL形式やスキームなどを必ずチェックする。
3.TrustHostsミドルウェアを使う
LaravelのTrustHostsミドルウェアを使って許可するホスト名(ドメイン)を指定しておき、
それ以外のHostヘッダーのリクエストを拒否する。