ぽかぽかコード日和

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

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

概要

メール送信機能を持つWebアプリケーションで出力処理に脆弱性があると、
攻撃者がメールのヘッダ情報に不正なデータを差し込むことで、不正な操作を実行する攻撃手法。

  • お問い合わせページやアンケートなどのサイトで特に注意が必要。


発生しうる脅威
  • 攻撃の踏み台として迷惑メールの送信に悪用される
  • メールの内容の改ざん
//脆弱性のあるコード
To: info@□□.□□
From: $email
Subject: お問い合わせ
Content-Type: text/plain: charset="ISO-2022-JP"

本文

//Fromの$emailに差し込む
support@△△.△△%0d%0aBcc%3a%20○○○○@○○.○○

↓
//生成されるメール
To:<info@□□.□□>
From:<support@△△.△△>
Bcc:<○○○○@○○.○○>
Subject: お問い合わせ

本文

☀︎BCCを追加されて、○○○○@○○.○○にも送信される。
「%0d%0a」は改行コード、「%3a」はコロン、「%20」は空白

  • メール文の終わりを示すヌル「%00」を使って、以降の文を削除もできる。

原因

メールヘッダ出力の実装

対策

根本的解決

1.メールヘッダを固定値にする

メールヘッダにユーザーからの入力された値をそのまま使わない実装をする。

2.メールヘッダーの出力用APIを使う

メールヘッダを固定値にできないときは、 実行環境や言語に用意されているメール送信用のAPIを使う。
(PHPMailer、SendGrid、Mailgunなど)

3.HTMLで宛先を指定しない(禁忌)

宛先のメールアドレスをHTMLのhiddenパラメータなどで指定しない。

保険的対策

4.ユーザー入力から改行コードを削除する

ユーザーが入力した値から改行コード(\r, \n など)や制御文字の削除や含まれていたら処理を中止させる。

全ての入力値から改行コードを削除してしまうとメール本文の改行からも削除され、
エラーの原因となるため用途に応じて適切な処理を行う。

Laravelでの実装例

1.Laravelの標準メール送信機能を使う

Mailファザード(Mail::to)または、Mailableクラス(extends Mailable)を使う。

Mail::to($request->input('email'))->send(new ContactFormMail($data));

☀︎メールヘッダの改行コードが自動的に除去される。

エスケープ処理

// メールアドレスのサニタイズ
$email = filter_var($request->input('email'), FILTER_SANITIZE_EMAIL);
// 件名の改行コードの除去
$subject = str_replace(["\r", "\n", "%0A", "%0D"], "", $request->input('subject')

☀︎PHP関数のfilter_var()やstr_replace()で改行コードを除去している。

バリデーション処理

To, Cc, Subject, Fromなどにユーザー入力を使うときは必ずバリデーションをする


参考にしたサイト