PHP郵件注入攻擊技術

1. 簡介php

 


如 今,互聯網的使用急劇上升,但絕大多數互聯網用戶沒有安全知識背景。大多數的人都會使用互聯網經過郵件Email的方式和他人進行通訊。出於這個緣由,大 多數網站容許他們的用戶聯繫他們,向網站提供建議,報告一個問題,或者要求反饋,用戶將會發送反饋給網站管理員的電子郵件。
    不 幸的是,大多數web開發人員對安全編碼Code-Security沒有足夠的認識,其中的一些程序猿使用現成的庫或框架,這些庫受到許多已知的漏洞。這 些漏洞是已經公佈,廠商並已經對其進行了修補,而且相應的攻擊源代碼poc都在互聯網上可下載的,但大多數開發人員都懶得升級到最新版本。html

   
今天咱們要談論電子郵件注射,攻擊者可使用你的郵件服務器來發送垃圾郵件。web

 

 

 

2. 郵件注入正則表達式

 


From Wikipedia:編程

電子郵件注入是一個安全漏洞,這種漏洞普遍存在於在互聯網電子郵件收發應用中。這是電子郵件注射和HTTP頭注射相似。和SQL注入攻擊相似,這種漏洞是一類常見的的漏洞,發生在當一個編程語言是嵌入到另外一個,例如MYSQL嵌入到PHP中。swift

   
當一個能夠提交數據到一個Web應用程序表單被添加到一個Web頁面,惡意用戶可能會利用MIME格式添加額外的信息到要發送的消息中 (POST/GET),好比一個新的收件人列表或一個徹底不一樣的消息體。由於MIME格式使用回車分隔在數據包中信息(HTTP數據包中的每一行之間都有 一個換行符,在POST和HTTP HEADER之間有兩個換行符),經過添加回車提交表單數據(使用FB的一些插件能夠很容易的作到),能夠容許一個簡單的留言板是用來發送成千上萬的消 息。一樣,一個垃圾郵件發送者可使用這種戰術的惡意發送大量的匿名消息。安全

   
電子郵件注入是針對PHP內置郵件功能的一種攻擊類型。它容許惡意攻擊者注入任何郵件頭字段,BCC、CC、主題等,它容許黑客經過注入手段從受害者的郵 件服務器發送垃圾郵件。因爲這個緣由,這種攻擊稱爲電子郵件注入,或者郵件形式濫發。這個漏洞是不限於PHP。它可能會影響任何從用戶UI接收消息併發送 電子郵件消息的應用程序。這種攻擊的主要緣由是不適當的用戶輸入驗證或應用程序根本沒有驗證和過濾機制。服務器

 

 

 

3. 郵件注入的攻擊原理併發

 


中國古話說得好: 知其然才能知其因此然。
爲了解釋郵件注入的工做原理,咱們必須先了解PHP Email函數的工做原理。下面是從PHP Manual中找到API解釋app

mail():

http://www.php.net/manual/en/function.mail.php

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

你能夠注意到,這須要三個必填參數(」目的地、主題和消息」)和其餘一些可選參數和函數返回一個布爾值。

   
那麼讓咱們來看看一個帶漏洞的代碼來演示這個漏洞:

<?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 !";
   }
 }
 ?>

前面的代碼將用於演示目的和解釋咱們的攻擊原理。咱們將前面的代碼分紅三個部分:

第一部分

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

這段代碼將檢查表單提交或不是。用戶點擊提交按鈕和普通訪問這個頁面腳本的響應將是不一樣的, 若是這段代碼返回True(if語句中的判斷最終結果爲true)這意味着表單沒有提交。表單將出現,等待用戶輸入。另外一方面,若是它返 回"False",這意味着表單已經提交,因此電子郵件將被髮送。

第二部分

  
<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>

第二部分是一個HTML表單標記,這要求用戶輸入。

第三部分

<?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 !";
   }}?>

在前面的代碼中咱們能夠特別注意這一行 mail($to,$_POST['subject'],$_POST['message'],」From: $fromn」), PHP的mail()函數須要subject, message, from 這些參數。若是函數執行成功,由PHP引擎發送郵件後,將打印出成功提示 "Your mail has been sent successfully"。若是出現錯誤,將提示相應信息 "An error has been occurred"

   
可是有朋友要問了,問題在哪裏?主要的問題對用戶的輸入沒有作必要的驗證和過濾,正如《白帽子講web安全》裏說到的,任何的安全問題能夠歸結爲信任的問 題,這裏存在的問題就是程序代碼對用戶的輸入無限制的信任。正如你所看到的在第三部分代碼,發送郵件功能代碼從用戶接收輸入(包括郵件主題、消息和來源 等),參數沒有過濾和驗證。所以,惡意攻擊者能夠任意控制這些參數的值,用戶發送inject攻擊。

 

 

 

 

4. 郵件注入示範

 


notice:
爲了使用PHP做爲郵件發送代理,咱們須要對PHP.INI進行簡單的配置:

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

出於演示目的,咱們將使用前面的帶漏洞的代碼。此外,咱們將提交下列值做爲發送郵件的參數:

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

表單發送的HTTP數據包:

從攻擊者的角度來看,有許多額外的字段,能夠被注入在郵件標題。更多信息見RFC 822。例如,CC(抄送)或者BCC(密送)容許攻擊者插入更多的消息。
    但要注意的是,咱們在添加一個新的參數以前,咱們必須增長一個換行符分隔每一個字段。換行符的16進制值爲"0x0A"。下面是一個demo code。

1) Cc/Bcc注入
在發送者字段(sender)後注入Cc和Bcc參數

From:sender@domain.com%0ACc:recipient@domain.com%0ABcc:recipient1@domain.com

因此如今,消息將被髮送到recipient和recipient1帳戶。

2) 參數注射

From:sender@domain.com%0ATo:attacker@domain.com

如今消息將被髮送到原來的收件人和攻擊者賬戶。注意,這裏的攻擊者的帳戶是咱們經過注入額外傳入的。

3) 郵件主題注入

From:sender@domain.com%0ASubject:This’s%20Fake%20Subject

攻擊者注入的假的主題subject將被添加到原來的主題中而且在某些狀況下將取代本來的主題subject。這取決於郵件服務行爲。即代碼編寫的容錯性,當參數中出現兩個subject的時候代碼是選擇丟棄仍是後者覆蓋。

4) 改變消息的主體body
要注意SMTP的Mail格式,消息主題和頭部Header之間有兩個換行符(和HTTP是同樣的)。

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

假消息將被添加到原始消息中。

 

 

 

 

5. 實戰演示

 


這裏提示一下,直接配置php.ini原生的email功能可能不太好用,配置起來也麻煩,建議採用一些第三方的Email系統(WP就挺不錯的)進行發送,這個模塊已經把相關的交互和HTTP數據包的構造封裝好了。

   
附帶上一些實驗截圖:

1) 正常發送

2) Cc/Bcc注入

   
在From字段添加Inject Payload

   
發送郵件後,增長了抄送的功能:

3) 郵件主題注入

   
咱們在from的參數加添加subject字段:

   
接收郵件後:

能夠看到,本來的subject被注入語句覆蓋了一部份內容,可是具體是覆蓋仍是附加和具體的PHP代碼編寫邏輯有關,由於如今CMS對Email發送的普通作法就是利用PHP進行HTTP/HTTPS數據包的構造,先在本地構造好數據包後,再想服務器發送。

   
因此不一樣的系統對email注入的效果會有所不一樣。

4) 改變消息的主體body

   
這裏要注意的的,SMTP區分消息頭部和消息主題是依據%0A%0A雙換行符決定的。

   
發送郵件後,咱們發現消息的消息體已經被修改了。

   
以上就是我在本地的PHP環境中模擬實驗的結果,由於環境和程序代碼處理邏輯的差別,可能在不一樣的環境下實驗會有差別,個人經驗是根據不一樣的PHP CMS系統的Email源代碼進行分析,理清發送Email數據包的代碼邏輯,有針對性的進行email 注入。

 

 

 

6. 解決方案

 


   
1. 永遠不要信任用戶的輸入字段。全部用戶輸入應該被認爲是不可信的和潛在的惡意。應用程序不受信任的輸入過程可能會變得容易受到諸如緩衝區溢出攻擊、SQL注入,OS指令注入、拒絕服務和電子郵件注入。
2. 使用正則表達式來過濾用用戶提交的數據。例如,咱們能夠在輸入字符串中搜索(r 或 n)。
3. 使用外部組件和庫,提供防範這個問題像 ZEND mail、PEAR mail和swift mailer。
4. ModSecurity能夠阻止服務器級別的電子郵件注入。利用ModSecurity,咱們能夠檢測經過POST或GET提交的CC, BCC或目的地址,而且拒絕任何包含這些字母請求。

 

 

 

7. 引用

 


1- http://www.securephpwiki.com/
2- http://projects.webappsec.org/
3- http://en.wikipedia.org/
4-http://www.damonkohler.com

 

 

PHP Email Injection 
Reference From: http://resources.infosecinstitute.com/email-injection/
Translated By: LittleHann
相關文章
相關標籤/搜索