やられアプリ BadTodo - 12 メールヘッダ・インジェクション

前回:やられアプリ BadTodo - 11 HTTP ヘッダ・インジェクション - demandosigno

ウェブアプリケーションの中には、利用者が入力した商品申し込みやアンケート等の内容を、特定のメールアドレスに送信する機能を持つものがあります。一般に、このメールアドレスは固定で、ウェブアプリケーションの管理者以外の人は変更できませんが、実装によっては、外部の利用者がこのメールアドレスを自由に指定できてしまう場合があります。このような問題を引き起こす脆弱性を「メールヘッダ・インジェクション」と呼び、それを悪用した攻撃を、「メールヘッダ・インジェクション攻撃」と呼びます。
安全なウェブサイトの作り方 p.38
■発生しうる脅威
迷惑メールの送信に悪用される

通常の送信内容。

MailCatcherは簡単なSMTPサーバで、ブラウザでメールを確認できます。実際にメールを送信することはありませんので、個人用のメールアドレスにテスト送信したりしても届きません。

確認方法

HTTPヘッダ・インジェクションの場合と同じく改行コード”%0d%0a”を利用します。

Subject、From、To 欄に「%0d%0aTo:XXX@example.jp」(XXXは数値 2~3 桁)を入力することで、新たなあて先を指定できるか。改行文字の後に追加した To アドレス(XXX@example.jp のアドレス)にメールが届く場合に、新たなあて先を指定できたと判定します。
ウェブ健康診断仕様 p.13

1.件名に %0d%0aTo:wasbook2@example.jp を追記して送信。

Eメール欄に入力した正しいメールアドレスの方にしか届いておらず、ソース上も改行されていません。

2.Eメールに %0d%0aTo:wasbook2@example.jp を追記して送信。

送信エラーになりました。

common.php を見ると "RFC準拠のメールアドレス検証" が行われていました。

// RFC準拠のメールアドレス検証
function validEmailAddress($email) {
  return preg_match(
    '/\A(?!(?>(?1)~(中略)~}))\])(?1)\z/isD',
    $email
  );
}

試しに正規表現部分をどのような文字列でも通すように '/(.*)/', に変更し、再度改行挿入を行いました。

To: wasbook@example.jp%0d%0aCc: wasbook2@example.jp と改行はされておらず、宛先(To:)は wasbook2 のみの表示です。
%0d%0a での改行操作はうまくいかないようです。

3.件名部分のタグを<textarea>に変えて試してみる。
件名は入力があるかないかのみがチェックされていたため、ブラウザの開発ツールを使い当該部分の<input>タグを<textarea>タグに書き換えることで複数行での入力を可能にします。
そこに改行を入れて Cc: wasbook2@example.jp を追記し、送信。

Cc: wasbook2@example.jp がヘッダに挿入されています。(実際には Bcc: の方を使うことで管理者の受信メールでは別アドレスにも送信されたことが分からないようにします)

この Cc: ヘッダは実際に有効なのでしょうか?しかしMailCatcherはSMTPサーバで、送信されたことは分かりますが受信されるのかは分かりません。外部にメールは飛びませんので個人用のメールなどで確認することもできません。
To: 列以外に Cc: 列 が見られれば良いのにと思ったのですが、作者さんによると『To/Cc/Bccは実際には関係なく、受信者(ウェブインターフェースの "To")はSMTP経由でターゲットにされたすべての受信者のリストです。』とのことでした。(この例では To: 欄には一つしか表示されていませんが、次のEメール欄での入力時には Cc: Bcc: も確かに To: 欄に表示されました)
Support for CC, BCC · Issue #17 · sj26/mailcatcher · GitHub

そこでEメール欄でも同様に複数行入力を試してみたところ、Cc: が挿入され To: 欄には両方のアドレスが表示されました。

これらのことから 3.の方法を使い「件名欄」においてメールヘッダインジェクションが可能であると考えて良いのではないかと思います。

本文内容を改ざんできるか

Subject、From、To 欄に「%0d%0a%0d%0akensa」を入力することで、本文内容を改ざんできるか。XXX@example.jp のアドレスに届いたメールの本文部分に「kensa」という文字列が含まれている場合、本文内容を改ざんできたと判定します。
ウェブ健康診断仕様 p.13

4.件名に %0d%0a%0d%0akensa を追記して送信。

メールの本文部分に「kensa」という文字列は出てきません。

5.Eメールに %0d%0a%0d%0akensa を追記して送信。

エラーになりました。

6.改行コードは使えませんでしたので3.と同じく %0d%0a%0d%0 の代わりに<textarea>を使って入力欄を広げ改行を2つ挟んで文章を入力します。

送信後に確認すると本来1行目に表示される「毎々お引き立て頂きありがとうございます。」の前に「100万円が当たりました! http://trap.example.org/」が挿入されました。

ソースを見ると下記となっていますが、メールの形式としてヘッダに続き1行開けて本文が続くという形になっているため、ヘッダに改行を加えることでそれ以降は本文であると認識してしまったことになります。

このままですと本文の体裁がおかしいのですぐに疑問を持たれますが、改行をたくさん入れることでぱっと見で問題ないように見せることもできます。

次回:やられアプリ BadTodo - 13 クリックジャッキング - demandosigno

/* -----codeの行番号----- */