自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PHP郵件注入攻擊技術(shù)

開發(fā) 后端
大多數(shù)的人都會(huì)使用互聯(lián)網(wǎng)通過(guò)郵件Email的方式和他人進(jìn)行通信。出于這個(gè)原因,大 多數(shù)網(wǎng)站允許他們的用戶聯(lián)系他們,向網(wǎng)站提供建議,報(bào)告一個(gè)問(wèn)題,或者要求反饋,用戶將會(huì)發(fā)送反饋給網(wǎng)站管理員的電子郵件。

1. 簡(jiǎn)介

如今,互聯(lián)網(wǎng)的使用急劇上升,但絕大多數(shù)互聯(lián)網(wǎng)用戶沒(méi)有安全知識(shí)背景。大多數(shù)的人都會(huì)使用互聯(lián)網(wǎng)通過(guò)郵件Email的方式和他人進(jìn)行通信。出于這個(gè)原因,大 多數(shù)網(wǎng)站允許他們的用戶聯(lián)系他們,向網(wǎng)站提供建議,報(bào)告一個(gè)問(wèn)題,或者要求反饋,用戶將會(huì)發(fā)送反饋給網(wǎng)站管理員的電子郵件。

不 幸的是,大多數(shù)web開發(fā)人員對(duì)安全編碼Code-Security沒(méi)有足夠的認(rèn)識(shí),其中的一些程序猿使用現(xiàn)成的庫(kù)或框架,這些庫(kù)受到許多已知的漏洞。這 些漏洞是已經(jīng)公布,廠商并已經(jīng)對(duì)其進(jìn)行了修補(bǔ),并且相應(yīng)的攻擊源代碼poc都在互聯(lián)網(wǎng)上可下載的,但大多數(shù)開發(fā)人員都懶得升級(jí)到最新版本。

今天我們要談?wù)撾娮余]件注射,攻擊者可以使用你的郵件服務(wù)器來(lái)發(fā)送垃圾郵件。

2. 郵件注入

From Wikipedia:

電子郵件注入是一個(gè)安全漏洞,這種漏洞廣泛存在于在互聯(lián)網(wǎng)電子郵件收發(fā)應(yīng)用中。這是電子郵件注射和HTTP頭注射類似。和SQL注入攻擊類似,這種漏洞是一類常見的的漏洞,發(fā)生在當(dāng)一個(gè)編程語(yǔ)言是嵌入到另一個(gè),例如MYSQL嵌入到PHP中。

當(dāng)一個(gè)可以提交數(shù)據(jù)到一個(gè)Web應(yīng)用程序表單被添加到一個(gè)Web頁(yè)面,惡意用戶可能會(huì)利用MIME格式添加額外的信息到要發(fā)送的消息中 (POST/GET),比如一個(gè)新的收件人列表或一個(gè)完全不同的消息體。因?yàn)镸IME格式使用回車分隔在數(shù)據(jù)包中信息(HTTP數(shù)據(jù)包中的每一行之間都有 一個(gè)換行符,在POST和HTTP HEADER之間有兩個(gè)換行符),通過(guò)添加回車提交表單數(shù)據(jù)(使用FB的一些插件可以很容易的做到),可以允許一個(gè)簡(jiǎn)單的留言板是用來(lái)發(fā)送成千上萬(wàn)的消 息。同樣,一個(gè)垃圾郵件發(fā)送者可以使用這種戰(zhàn)術(shù)的惡意發(fā)送大量的匿名消息。

電子郵件注入是針對(duì)PHP內(nèi)置郵件功能的一種攻擊類型。它允許惡意攻擊者注入任何郵件頭字段,BCC、CC、主題等,它允許黑客通過(guò)注入手段從受害者的郵 件服務(wù)器發(fā)送垃圾郵件。由于這個(gè)原因,這種攻擊稱為電子郵件注入,或者郵件形式濫發(fā)。這個(gè)漏洞是不限于PHP。它可能會(huì)影響任何從用戶UI接收消息并發(fā)送 電子郵件消息的應(yīng)用程序。這種攻擊的主要原因是不適當(dāng)?shù)挠脩糨斎腧?yàn)證或應(yīng)用程序根本沒(méi)有驗(yàn)證和過(guò)濾機(jī)制。

3. 郵件注入的攻擊原理

中國(guó)古話說(shuō)得好: 知其然才能知其所以然。

為了解釋郵件注入的工作原理,我們必須先了解PHP Email函數(shù)的工作原理。下面是從PHP Manual中找到API解釋

  1. mail(): 
  2.  
  3. http://www.php.net/manual/en/function.mail.php 
  4.  
  5. bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) 

 你可以注意到,這需要三個(gè)必填參數(shù)(”目的地、主題和消息”)和其他一些可選參數(shù)和函數(shù)返回一個(gè)布爾值。

   
那么讓我們來(lái)看看一個(gè)帶漏洞的代碼來(lái)演示這個(gè)漏洞:

 

  1. <?php 
  2.  $to="littlehann@foxmail.com"
  3.  if (!isset($_POST["send"])) 
  4.  { 
  5. ?> 
  6.    <form method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>"
  7.    From: <input type="text" name="sender"
  8.    Subject : <input type="text" name="subject"
  9.    Message : 
  10.    <textarea name="message" rows="10" cols="60" lines="20"></textarea> 
  11.    <input type="submit" name="send" value="Send"
  12.    </form> 
  13. <?php 
  14.  } 
  15.  else 
  16.  { 
  17.    // the form has been submitted 
  18.    $from=$_POST['sender']; 
  19.    // send mail : 
  20.    if (mail($to,$_POST['subject'],$_POST['message'],"From: $fromn")) 
  21.    { 
  22.      echo "Your mail has been sent successfully"
  23.    } 
  24.    else 
  25.    { 
  26.      echo "An error has been occured !"
  27.    } 
  28.  } 
  29.  ?> 

前面的代碼將用于演示目的和解釋我們的攻擊原理。我們將前面的代碼分成三個(gè)部分:

第一部分

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

這段代碼將檢查表單提交或不是。用戶點(diǎn)擊提交按鈕和普通訪問(wèn)這個(gè)頁(yè)面腳本的響應(yīng)將是不同的, 如果這段代碼返回True(if語(yǔ)句中的判斷最終結(jié)果為true)這意味著表單沒(méi)有提交。表單將出現(xiàn),等待用戶輸入。另一方面,如果它返 回"False",這意味著表單已經(jīng)提交,所以電子郵件將被發(fā)送。

第二部分

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

第二部分是一個(gè)HTML表單標(biāo)記,這要求用戶輸入。

第三部分

  1. <?php 
  2. else 
  3.    // the form has been submitted 
  4.    $from=$_POST['sender']; 
  5.    // send mail : 
  6.    if (mail($to,$_POST['subject'],$_POST['message'],"From: $fromn")) 
  7.    { 
  8.      echo "Your mail has been sent successfully"
  9.    } 
  10.    else 
  11.    { 
  12.      echo "An error has been occured !"
  13.    } 
  14. ?> 

在前面的代碼中我們可以特別注意這一行 mail($to,$_POST['subject'],$_POST['message'],”From: $fromn”), PHP的mail()函數(shù)需要subject, message, from 這些參數(shù)。如果函數(shù)執(zhí)行成功,由PHP引擎發(fā)送郵件后,將打印出成功提示 "Your mail has been sent successfully"。如果出現(xiàn)錯(cuò)誤,將提示相應(yīng)信息 "An error has been occurred

但是有朋友要問(wèn)了,問(wèn)題在哪里?主要的問(wèn)題對(duì)用戶的輸入沒(méi)有做必要的驗(yàn)證和過(guò)濾,正如《白帽子講web安全》里說(shuō)到的,任何的安全問(wèn)題可以歸結(jié)為信任的問(wèn) 題,這里存在的問(wèn)題就是程序代碼對(duì)用戶的輸入無(wú)限制的信任。正如你所看到的在第三部分代碼,發(fā)送郵件功能代碼從用戶接收輸入(包括郵件主題、消息和來(lái)源 等),參數(shù)沒(méi)有過(guò)濾和驗(yàn)證。因此,惡意攻擊者可以任意控制這些參數(shù)的值,用戶發(fā)送inject攻擊。

#p#

4. 郵件注入示范

notice:

為了使用PHP作為郵件發(fā)送代理,我們需要對(duì)PHP.INI進(jìn)行簡(jiǎn)單的配置:

  1. [mail function] 
  2. ; For Win32 only. 
  3. ; http://php.net/smtp 
  4. SMTP = smtp.qq.com 
  5. ; http://php.net/smtp-port 
  6. smtp_port = 25 

出于演示目的,我們將使用前面的帶漏洞的代碼。此外,我們將提交下列值作為發(fā)送郵件的參數(shù):

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

表單發(fā)送的HTTP數(shù)據(jù)包:

從攻擊者的角度來(lái)看,有許多額外的字段,可以被注入在郵件標(biāo)題。更多信息見RFC 822。例如,CC(抄送)或者BCC(密送)允許攻擊者插入更多的消息。

但要注意的是,我們?cè)谔砑右粋€(gè)新的參數(shù)之前,我們必須增加一個(gè)換行符分隔每個(gè)字段。換行符的16進(jìn)制值為"0x0A"。下面是一個(gè)demo code。

1) Cc/Bcc注入

在發(fā)送者字段(sender)后注入Cc和Bcc參數(shù)
From:sender@domain.com%0ACc:recipient@domain.com%0ABcc:recipient1@domain.com
所以現(xiàn)在,消息將被發(fā)送到recipient和recipient1賬戶。

2) 參數(shù)注射
From:sender@domain.com%0ATo:attacker@domain.com
現(xiàn)在消息將被發(fā)送到原來(lái)的收件人和攻擊者帳戶。注意,這里的攻擊者的賬戶是我們通過(guò)注入額外傳入的。

3) 郵件主題注入
From:sender@domain.com%0ASubject:This’s%20Fake%20Subject
攻擊者注入的假的主題subject將被添加到原來(lái)的主題中并且在某些情況下將取代原本的主題subject。這取決于郵件服務(wù)行為。即代碼編寫的容錯(cuò)性,當(dāng)參數(shù)中出現(xiàn)兩個(gè)subject的時(shí)候代碼是選擇丟棄還是后者覆蓋。

4) 改變消息的主體body
要注意SMTP的Mail格式,消息主題和頭部Header之間有兩個(gè)換行符(和HTTP是一樣的)。
From:sender@domain.com%0A%0AMy%20New%20%0Fake%20Message.
假消息將被添加到原始消息中。

5. 實(shí)戰(zhàn)演示

這里提示一下,直接配置php.ini原生的email功能可能不太好用,配置起來(lái)也麻煩,建議采用一些第三方的Email系統(tǒng)(WP就挺不錯(cuò)的)進(jìn)行發(fā)送,這個(gè)模塊已經(jīng)把相關(guān)的交互和HTTP數(shù)據(jù)包的構(gòu)造封裝好了。

附帶上一些實(shí)驗(yàn)截圖:

1) 正常發(fā)送

2) Cc/Bcc注入

在From字段添加Inject Payload

發(fā)送郵件后,增加了抄送的功能:

3) 郵件主題注入

我們?cè)趂rom的參數(shù)加添加subject字段:

接收郵件后:

可以看到,原本的subject被注入語(yǔ)句覆蓋了一部分內(nèi)容,但是具體是覆蓋還是附加和具體的PHP代碼編寫邏輯有關(guān),因?yàn)楝F(xiàn)在CMS對(duì)Email發(fā)送的普通做法就是利用PHP進(jìn)行HTTP/HTTPS數(shù)據(jù)包的構(gòu)造,先在本地構(gòu)造好數(shù)據(jù)包后,再想服務(wù)器發(fā)送。

所以不同的系統(tǒng)對(duì)email注入的效果會(huì)有所不同。

#p#

4) 改變消息的主體body

這里要注意的的,SMTP區(qū)分消息頭部和消息主題是依據(jù)%0A%0A雙換行符決定的。
發(fā)送郵件后,我們發(fā)現(xiàn)消息的消息體已經(jīng)被修改了。

以上就是我在本地的PHP環(huán)境中模擬實(shí)驗(yàn)的結(jié)果,因?yàn)榄h(huán)境和程序代碼處理邏輯的差異,可能在不同的環(huán)境下實(shí)驗(yàn)會(huì)有差異,我的經(jīng)驗(yàn)是根據(jù)不同的PHP CMS系統(tǒng)的Email源代碼進(jìn)行分析,理清發(fā)送Email數(shù)據(jù)包的代碼邏輯,有針對(duì)性的進(jìn)行email 注入。

6. 解決方案

1. 永遠(yuǎn)不要信任用戶的輸入字段。所有用戶輸入應(yīng)該被認(rèn)為是不可信的和潛在的惡意。應(yīng)用程序不受信任的輸入過(guò)程可能會(huì)變得容易受到諸如緩沖區(qū)溢出攻擊、SQL注入,OS指令注入、拒絕服務(wù)和電子郵件注入。

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

3. 使用外部組件和庫(kù),提供防范這個(gè)問(wèn)題像 ZEND mail、PEAR mail和swift mailer。

4. ModSecurity可以阻止服務(wù)器級(jí)別的電子郵件注入。利用ModSecurity,我們可以檢測(cè)通過(guò)POST或GET提交的CC, BCC或目的地址,并且拒絕任何包含這些字母請(qǐng)求。

7. 引用

 

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

  1. PHP Email Injection  
  2. Reference From: http://resources.infosecinstitute.com/email-injection/ 
  3. Translated By: LittleHann 

原文鏈接:http://www.freebuf.com/articles/web/14918.html

責(zé)任編輯:陳四芳 來(lái)源: freebuf.com
相關(guān)推薦

2013-12-09 09:57:37

2010-09-14 16:00:16

2012-04-12 13:36:59

2012-04-12 15:06:44

2013-04-26 11:26:00

2009-03-10 08:05:19

2012-12-19 10:36:06

2014-11-27 09:31:26

2010-09-09 08:41:34

2011-07-30 13:22:49

2014-05-12 10:37:41

2010-09-13 16:58:13

2011-10-19 10:47:56

2017-05-08 14:33:51

2013-07-27 22:35:03

2014-07-09 15:41:51

2009-02-04 16:51:48

2020-08-07 08:13:08

SQL攻擊模式

2014-11-04 13:43:10

2019-02-22 09:00:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)