郵件頭注入


原理

郵件的結構,分為信封(MAIL FROM、RCPT TO)、頭部(From,To,Subject、CC、BCC等)、主體(message)。

所謂的郵件頭注入,其實就是針對頭部的部分。對於郵件頭部的字段其實就是換行符0x0A或者0x0D0x0A分割 ,在絕大部分系統里面不是\n 就是\r\n,所以就可以注入了。例如在一段沒有過濾的FROM字段里面輸入,就可以添加一個收件人。

 

郵件格式

  • return-path:郵件的回復地址。
  • from:發件人地址。
  • to:收件人地址。
  • subject:郵件主題,即郵件名。
  • body:郵件內容。
  • date:郵件發送日期。
  • cc:抄送。
  • bcc:密送。

分類

一般我們可以控制3個部分,一是發件人,二是主題,三是內容,因此可以按照這三類進行。發件人處的注入危害比較大,姿勢也比較多。主要有以下5類:

1、看郵件服務器針對多個from是如何實現的,是取第一個,還是取最后一個,還是兩個都取?

from=admin%40domain.com%0Afrom:eval%40domain.com

  

2、CC(抄送)注入、BBC(密送)注入

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

from:sender%40domain.com%0ACc%3Arecipient%40domain.com%0ABcc%3Arecipient1@domain.com

  

3、參數注射

消息將被發送到原來的收件人和攻擊者帳戶。

 

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

  

4、郵件主題注入

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

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

  

5、改變消息的主體body

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

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

  

PHP函數

當mail()函數中的參數可控的時候,且沒有任何過濾的時候,漏洞就可能存在。

mail():

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

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

  

修復建議

1. 永遠不要信任用戶的輸入字段。所有用戶輸入應該被認為是不可信的和潛在的惡意。應用程序不受信任的輸入過程可能會變得容易受到諸如緩沖區溢出攻擊、SQL注入,OS指令注入、拒絕服務和電子郵件注入。

2. 使用正則表達式來過濾用用戶提交的數據。例如,我們可以在輸入字符串中搜索(r 或 n)。

3. 使用外部組件和庫,提供防范這個問題像 ZEND mail、PEAR mail和swift mailer。

4. ModSecurity可以阻止服務器級別的電子郵件注入。利用ModSecurity,我們可以檢測通過POST或GET提交的CC, BCC或目的地址,並且拒絕任何包含這些字母請求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM