本記事は、メールヘッダ・インジェクションとオープンリダイレクトの脆弱性についてまとめています。なお、私はセキュリティに関してはずぶの素人で本記事にも誤りが含まれているかもしれません。その際はコメントでご指摘いただけると幸いです。
メールヘッダ・インジェクション
どんな攻撃か?
外部からの入力値に改行コードを入れるなどして、メールヘッダを改ざんする攻撃です。
詳しい説明
メールヘッダ・インジェクションを知るためには、まずメールヘッダについて知る必要があります。メールヘッダとは、送信元や送信先、送信日時などの情報が含まれた制御用のデータです。メーラーがメールの送信をするときなどに使います。メールヘッダについては、こちらのサイトが分かりやすかったです。
このメールヘッダを図1のように書き換えることで、本来送る予定がなかった人などにメールを送り付けることができます。このような攻撃をメールヘッダ・インジェクションといいます。
どのように攻撃するのか?
mb_send_mail()というメールを送信する機能を持つPHPの関数があります。この関数の第4引数がメールヘッダを作成するための引数になっています。この第4引数が、例えば下記のようになっているとします。
<php? $from = $_GET["from"] mb_send_mail( hoge, fuga, piyo, "From:" . $from )
このとき、外部からfromに
aaa@example.com%0D%0ABCC%3Abbb@example.com
と入れられると、メールヘッダは図2のようになりBccでbbb@example.comにもメールを送ることができます。
どんな影響があるの?
AppGoatによれば、下記の影響があります。
- 意図しない宛先へのメール送信
- メール内容の改ざん
- メールの第三者中継
対策例
aaa@example.com%0D%0ABCC%3Abbb@example.com
のように改行が含まれる入力が行われた場合に、処理を中断してしまうことでメールヘッダ・インジェクションを防ぐことができます。具体的には、下記のようなコードを書くことで攻撃を防ぐことができます。
<php? $from = $_GET["from"] // 追加するコード(改行が含まれる入力が行われた場合に、処理を中断する) if(preg_match('/\r|\n/', $from)){ die('Bad From Input') } mb_send_mail( hoge, fuga, piyo, "From:" . $from )
オープンリダイレクトの脆弱性
どんな攻撃か?
正規サイトから偽サイトにリダイレクトさせ、不正に情報を取得する攻撃です。
詳しい説明
攻撃者は2種類の罠サイトを作成します。1つ目は、不正に情報を取得するサイト、2つ目は1つ目で作成したサイトに被害者を誘導させるためのサイトです。
被害者は2つ目のサイト(誘導用サイト)に来訪し、その後1つ目のサイト(不正に情報を取得する用のサイト)にリダイレクトさせられ、そこでログイン情報を入れるなどをすることで、攻撃者から不正に情報を取得されてしまいます(図3)。
どんな影響があるの?
AppGoatによれば、下記の影響があります。
- フィッシングサイトやマルウェアを配布するサイトに誘導される
対策例
リダイレクト先が正規サイトと同一ドメインであることを確認する処理を入れます。この処理を入れることによって、リダイレクト先に外部ドメインを設定することができなくなり、オープンリダイレクトの脆弱性をなくすことができます(図4)。
例えば、ドメインがexample.jpの場合下記のような処理を入れます。
<php? $redirect = $_GET["redirect"] if(preg_match('/^https?:\/\/example.jp\//', $redirect)){ die('Bad Redirect') }
これにより、先頭にhttps://example.jpもしくはhttp://example.jpを含まないURLをリダイレクト先に指定できなくなります。これによって外部ドメインにリダイレクトすることを防ぎます。
まとめ
今回は、メールヘッダ・インジェクションとオープンリダイレクトの脆弱性についてまとめました。 メールヘッダ・インジェクションは、メールヘッダを改ざんすることで、メールの内容や宛先を変更する攻撃でした。また、オープンリダイレクトの脆弱性は、リダイレクト先に偽のサイトを設定することでユーザの情報を窃取する攻撃でした。