概要
メール送信機能を持つ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などにユーザー入力を使うときは必ずバリデーションをする