ぽかぽかコード日和

とっても暑い夏の日にプログラミングはじめました☀️

【Security】HTTPヘッダ・インジェクション+Laravel実装

概要

ユーザーからの入力値の処理に脆弱性があると、
攻撃者がHTTPリクエストに罠を仕掛けてレスポンスを生成し、
ユーザーに偽のURLをクリックさせ、スクリプトを実行させたり情報を盗み取る攻撃。

改行コードが原因となることから「CRLFインジェクション」とも呼ぶ。

複数のレスポンスを作り出す攻撃を
「HTTPレスポンス分割(HTTP Response Splitting) 攻撃」と呼ぶ。


発生しうる脅威
  • XSS攻撃と同じ

    • 重要情報の漏洩
    • Cookie情報の漏洩
    • ブラウザに任意のCookieを保存させられる
    • 偽情報の流布による混乱
  • キャッシュサーバのキャッシュ汚染
    HTTPレスポンス分割攻撃で、
    悪意あるレスポンスをキャッシュサーバに保存されると、 他のユーザーも偽ページや不正スクリプトを閲覧し続けてしまう。

原因

入力値のバリデーション不足

対策

ユーザーから入力される値から、空白コードや改行コードを削除する。

根本的解決

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ヘッダーのリクエストを拒否する。


参考にしたサイト