スパムメール踏み台攻撃

※動作テストは自己責任で必ず自分の環境で確認すること。

スパムメールとは

何らかの方法で入手したメールアドレスに対して無差別に、本人に許諾を得ずに一方的に営利目的の広告メールを配信すること。

メールヘッダ生成部にカンマを含めることで、任意の宛先にメールを送る攻撃。

■攻撃先

関数:mail()、mb_send_mail()

■被害

スパムメール送信のためにサーバリソースが消費される。
利用中のメールサーバがスパム送信メールサーバとしてブラックリスト登録される。

Case 1

<?php
if(!empty($_POST['dosend']))
{
  mb_send_mail($_POST['to'], $_POST['subject'], $_POST['body'], "From: ".$_POST['from']);
  header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']);
  exit;
}

header("Content-Type: text/html; charset=EUC-JP");
?>

<html>
  <body>
    <form action="" method="post">
      Mailaddress:<input type="text" name="from" /><br />
      Subject:<input type="text" name="subject" /><br />
      Body:<input type="text" name="body" /><br />
      <input type="hidden" name="to" value="example@example.jp" />
      <input type="submit" name="dosend" value="send">
    </form>
  </body>
</html>
80番ポートに任意の宛先を指定したPOSTデータをリクエストすれば、hiddenの宛先を無視して、任意の宛先に送りつけることが可能。 

Case 2

<?php
mb_send_mail(固定メールアドレス, $_POST['subject'], $_POST['body'], 'From: '.$_POST['from']);
?>
メールヘッダに改行を含んだものを送りつける事によって、任意の宛先に送りつける事が可能 

対策方法

・第1引数の固定化

mail()関数の第1引数(to)は固定とする。 hiddenタグは改竄される恐れがあるので使用しない。 

・第1引数のホワイトリスト化

メールの宛先が複数の場合、それが少数であればメールアドレス一覧表を作っておき、一覧に乗っている宛先のみmail()関数を実行する。

・同一IPアドレスの利用回数制限

データベースかデータファイルに、IPごとのフォームメールの利用回数を記録し、指定回数以上を超えるようならmail()関数を実行しない。

・データ整合性チェック

mail()関数の第4引数にリクエスト変数を含める場合は、そのメールヘッダ項目に応じた厳密なチェックを実施する。

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/10/3 19:55時点)

Comments are closed.