blog

PHPメールインジェクション攻撃テクニック

ほとんどの人は、インターネットを使って他の人と電子メールでコミュニケーションをとります。このため、ほとんどのウェブサイトでは、提案や問題の報告、フィードバックの要求などをユーザーが連絡できるようになっ...

Jul 24, 2013 · 8 min. read
シェア

1.はじめに

今日、インターネットの利用は劇的に増加していますが、インターネット・ユーザーの大半はセキュリティの知識を持っていません。ほとんどの人は、電子メールを通じて他の人とコミュニケーションをとるためにインターネットを利用しています。このため、ほとんどのウェブサイトでは、提案や問題の報告、フィードバックの要求などをユーザーが連絡できるようになっており、ユーザーはフィードバックとともにウェブマスターに電子メールを送信します。

今日は、攻撃者がメールサーバーを利用してスパムを送信する、メールインジェクションについてお話します。

ウィキペディアより

ウェブ・アプリケーションにデータを送信できるフォームがウェブ・ページに追加されると、悪意のあるユーザは MIME フォーマットを利用して、新しい受信者リストや全く異なるメッセージ本文など、送信するメッセージに追加情報を追加する可能性があります。MIMEフォーマットはキャリッジリターンを使ってパケット内の情報を区切るため、キャリッジリターンを追加してフォームデータを送信すると、単純なメッセージボードが何千ものメッセージを送信するために使われる可能性があります。同様に、スパマーはこの手口を使って悪意を持って大量の匿名メッセージを送信することができます。

日本の古いことわざにもあるように、知らないことを知るためには知っていることを知らなければなりません。

mail(): 
 
http://..net/manual/en/..php 
 
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) 

お気づきのように、この関数は3つの必須パラメータといくつかのオプションパラメータを取り、ブール値を返します。



それでは、脆弱性を示すコードを見てみましょう。

<?php 
 $to="littlehann@foxmail.com"; 
 if (!isset($_POST["send"])) 
 { 
?> 
   <form method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>"> 
   From: <input type="text" name="sender"> 
   Subject : <input type="text" name="subject"> 
   Message : 
   <textarea name="message" rows="10" cols="60" lines="20"></textarea> 
   <input type="submit" name="send" value="Send"> 
   </form> 
<?php 
 } 
 else 
 { 
   // the form has been submitted 
   $from=$_POST['sender']; 
   // send mail : 
   if (mail($to,$_POST['subject'],$_POST['message'],"From: $fromn")) 
   { 
     echo "Your mail has been sent successfully"; 
   } 
   else 
   { 
     echo "An error has been occured !"; 
   } 
 } 
 ?> 

先のコードは、デモンストレーションと攻撃の原理を説明するために使用します。先のコードを3つの部分に分割します。

前編

<?php 
 $to="littlehann@foxmail.com"; 
 if (!isset($_POST["send"])){ 
?> 

このコードはフォームが送信されたかどうかをチェックします。ユーザーが送信ボタンをクリックしたときのレスポンスは、このページスクリプトに普通にアクセスしたときのレスポンスとは異なります。このコードがTrueを返した場合(if文の判断の最終結果がTrue)、これはフォームが送信されなかったことを意味します。フォームは表示され、ユーザーの入力を待ちます。一方、「False」を返した場合は、フォームが送信されたことを意味し、電子メールが送信されます。

パートII

<form method="POST" action="<?echo $_SERVER['PHP_SELF'];?>"> 
 From: <input type="text" name="sender"> 
 Subject : <input type="text" name="subject"> 
 Message : 
 <textarea name="message" rows="10" cols="60" lines="20"></textarea> 
 <input type="submit" name="send" value="Send"> 
 </form> 

2番目の部分はHTMLのフォームタグで、ユーザーの入力が必要です。

パートIII

<?php 
} 
else 
{ 
   // the form has been submitted 
   $from=$_POST['sender']; 
   // send mail : 
   if (mail($to,$_POST['subject'],$_POST['message'],"From: $fromn")) 
   { 
     echo "Your mail has been sent successfully"; 
   } 
   else 
   { 
     echo "An error has been occured !"; 
   } 
} ?> 

PHP の mail() 関数は subject、message、from をパラメータとして受け取ります。関数が正常に実行され、PHP エンジンがメールを送信した場合は、 成功メッセージ "Your mail has been sent successfully" が出力されます。エラーが発生した場合は、対応するメッセージ "An error has been occurred" が出力されます。

しかし、一部の友人は、どこに問題があるのですか?主な問題は、"ホワイトハットWebセキュリティ "は、セキュリティ上の問題は、信頼性の問題に起因することができると述べたように、ユーザー入力は、必要な検証やフィルタリングを行わないということです。コードの3番目の部分にあるように、メール送信機能のコードは、フィルタリングやパラメータの検証を行うことなく、ユーザーからの入力を受け取ります。その結果、悪意のある攻撃者はこれらのパラメータの値を任意に制御することができ、ユーザはオブジェクト攻撃を送信することができます。

#p#

お知らせします。

PHP をメール配送エージェントとして使用するには、PHP.INI の簡単な設定が必要です:

[mail function] 
; For Win32 only. 
; http://.net/smtp 
SMTP = smtp.MSN.com 
; http://.net/smtp-port 
smtp_port = 25 

デモンストレーションのため、脆弱性を含む以前のコードを使用します。また、メール送信のパラメータとして以下の値を送信します:

mail("littlehann@foxmail.com", "Call me urgent", "Hi,nPlease call me ASAP.nBye", "From: littlehann@foxmail.comn") 

フォームから送信されたHTTPパケット:

ただし、新しいパラメータを追加する場合は、各フィールドを区切るために改行文字を追加する必要があることに注意してください。改行文字の16進数値は「0x0A」です。以下にデモコードを示します。

4) メッセージ本文の変更

SMTPメールのフォーマットでは、メッセージの件名とヘッダーHeaderの間に2つの改行があることに注意してください。

From:sender@domain.com%0A%0AMy%20New%20%0Fake%20Message。

偽のメッセージは元のメッセージに追加されます。

5.デモンストレーション

ここではヒントですが、直接php.iniのネイティブメール機能を設定することは非常に使用するのはよくないかもしれませんが、設定も面倒ですが、送信するいくつかのサードパーティの電子メールシステムを使用することをお勧めします、このモジュールは、相互作用とカプセル化されたHTTPパケットの構築に関連しています。

実験のスクリーンショットを添付します:

1) 通常伝送

FromフィールドにInject Payloadを追加

メール送信後、ccする機能が追加されました。

from 引数に subject フィールドを追加します:

メールを受け取ってから

#p#

4) メッセージ本文の変更

SMTP は %0A%0A の二重改行に基づいてメッセージ・ヘッダとメッセージ・サブジェクトを区別することに注意することが重要です。

メッセージを送信した後、メッセージ本文が変更されていることに気付きます。

6.ソリューション

2.正規表現を使用して、ユーザーから送信されたデータをフィルタリングします。例えば、入力文字列で検索することができます。

3.ZENDメール、PEARメール、swiftメーラーなど、この問題から保護する外部コンポーネントやライブラリを使用してください。

7.参考文献

PHP Email Injection  
Reference From: http://..com/email-injection/ 
Translated By: LittleHann 

Read next

"台風ハイヤン "はメールアドレス検索攻撃の新たなお気に入りだ

フィリピンのタクロバンに壊滅的な被害をもたらした超大型台風ハイヤンは、最近ネットワークの世界で頭痛の種となっています。11月20日、シマンテックはHaiyanという名前で大規模なメールアドレス検索攻撃を監視しました。

Jul 24, 2013 · 2 min read