PHP郵件注入實戰(zhàn)演練

一、簡介
如今,互聯(lián)網(wǎng)的使用急劇上升,但絕大多數(shù)互聯(lián)網(wǎng)用戶沒有安全知識背景。大多數(shù)的人都會使用互聯(lián)網(wǎng)通過郵件Email的方式和他人進行通信。出于這個原因,大多數(shù)網(wǎng)站允許他們的用戶聯(lián)系他們,向網(wǎng)站提供建議,報告一個問題,或者要求反饋,用戶將會發(fā)送反饋給網(wǎng)站管理員的電子郵件。
不幸的是,大多數(shù)web開發(fā)人員對安全編碼Code-Security沒有足夠的認識,其中的一些程序猿使用現(xiàn)成的庫或框架,這些庫受到許多已知的漏洞。這些漏洞是已經(jīng)公布,廠商并已經(jīng)對其進行了修補,并且相應的攻擊源代碼poc都在互聯(lián)網(wǎng)上可下載的,但大多數(shù)開發(fā)人員都懶得升級到最新版本。
今天我們要談論電子郵件注射,攻擊者可以使用你的郵件服務器來發(fā)送垃圾郵件。
二、郵件注入
電子郵件注入是一個安全漏洞,這種漏洞廣泛存在于在互聯(lián)網(wǎng)電子郵件收發(fā)應用中。這是電子郵件注射和HTTP頭注射類似。和SQL注入攻擊類似,這種漏洞是一類常見的的漏洞,發(fā)生在當一個編程語言是嵌入到另一個,例如MYSQL嵌入到PHP中。
當一個可以提交數(shù)據(jù)到一個Web應用程序表單被添加到一個Web頁面,惡意用戶可能會利用MIME格式添加額外的信息到要發(fā)送的消息中(POST/GET),比如一個新的收件人列表或一個完全不同的消息體。因為MIME格式使用回車分隔在數(shù)據(jù)包中信息(HTTP數(shù)據(jù)包中的每一行之間都有一個換行符,在POST和HTTP HEADER之間有兩個換行符),通過添加回車提交表單數(shù)據(jù)(使用FB的一些插件可以很容易的做到),可以允許一個簡單的留言板是用來發(fā)送成千上萬的消息。同樣,一個垃圾郵件發(fā)送者可以使用這種戰(zhàn)術的惡意發(fā)送大量的匿名消息。
電子郵件注入是針對PHP內(nèi)置郵件功能的一種攻擊類型。它允許惡意攻擊者注入任何郵件頭字段,BCC、CC、主題等,它允許黑客通過注入手段從受害者的郵件服務器發(fā)送垃圾郵件。由于這個原因,這種攻擊稱為電子郵件注入,或者郵件形式濫發(fā)。這個漏洞是不限于PHP。它可能會影響任何從用戶UI接收消息并發(fā)送電子郵件消息的應用程序。這種攻擊的主要原因是不適當?shù)挠脩糨斎腧炞C或應用程序根本沒有驗證和過濾機制。
三、郵件注入的攻擊原理
中國古話說得好: 知其然才能知其所以然。
為了解釋郵件注入的工作原理,我們必須先了解PHP Email函數(shù)的工作原理。下面是從PHP Manual中找到API解釋
mail():
http://www.php.net/manual/en/function.mail.php
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
你可以注意到,這需要三個必填參數(shù)(”目的地、主題和消息”)和其他一些可選參數(shù)和函數(shù)返回一個布爾值。
那么讓我們來看看一個帶漏洞的代碼來演示這個漏洞:
<?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語句中的判斷最終結(jié)果為true)這意味著表單沒有提交。表單將出現(xiàn),等待用戶輸入。另一方面,如果它返回"False",這意味著表單已經(jīng)提交,所以電子郵件將被發(fā)送。
第二部分
<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()函數(shù)需要subject, message, from 這些參數(shù)。如果函數(shù)執(zhí)行成功,由PHP引擎發(fā)送郵件后,將打印出成功提示 "Your mail has been sent successfully"。如果出現(xiàn)錯誤,將提示相應信息 "An error has been occurred"
但是有朋友要問了,問題在哪里?主要的問題對用戶的輸入沒有做必要的驗證和過濾,正如《白帽子講web安全》里說到的,任何的安全問題可以歸結(jié)為信任的問題,這里存在的問題就是程序代碼對用戶的輸入無限制的信任。正如你所看到的在第三部分代碼,發(fā)送郵件功能代碼從用戶接收輸入(包括郵件主題、消息和來源等),參數(shù)沒有過濾和驗證。因此,惡意攻擊者可以任意控制這些參數(shù)的值,用戶發(fā)送inject攻擊。
四、郵件注入示范
notice:
為了使用PHP作為郵件發(fā)送代理,我們需要對PHP.INI進行簡單的配置:
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = smtp.qq.com
; http://php.net/smtp-port
smtp_port = 25
出于演示目的,我們將使用前面的帶漏洞的代碼。此外,我們將提交下列值作為發(fā)送郵件的參數(shù):
mail("littlehann@foxmail.com", "Call me urgent", "Hi,nPlease call me ASAP.nBye", "From: littlehann@foxmail.comn")
表單發(fā)送的HTTP數(shù)據(jù)包:
從攻擊者的角度來看,有許多額外的字段,可以被注入在郵件標題。更多信息見RFC 822。例如,CC(抄送)或者BCC(密送)允許攻擊者插入更多的消息。
但要注意的是,我們在添加一個新的參數(shù)之前,我們必須增加一個換行符分隔每個字段。換行符的16進制值為"0x0A"。下面是一個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ā)送到原來的收件人和攻擊者帳戶。注意,這里的攻擊者的賬戶是我們通過注入額外傳入的。
3) 郵件主題注入
From:sender@domain.com%0ASubject:This’s%20Fake%20Subject
攻擊者注入的假的主題subject將被添加到原來的主題中并且在某些情況下將取代原本的主題subject。這取決于郵件服務行為。即代碼編寫的容錯性,當參數(shù)中出現(xiàn)兩個subject的時候代碼是選擇丟棄還是后者覆蓋。
4) 改變消息的主體body
要注意SMTP的Mail格式,消息主題和頭部Header之間有兩個換行符(和HTTP是一樣的)。
From:sender@domain.com%0A%0AMy%20New%20%0Fake%20Message.
假消息將被添加到原始消息中。
五、實戰(zhàn)演示
這里提示一下,直接配置php.ini原生的email功能可能不太好用,配置起來也麻煩,建議采用一些第三方的Email系統(tǒng)(WP就挺不錯的)進行發(fā)送,這個模塊已經(jīng)把相關的交互和HTTP數(shù)據(jù)包的構造封裝好了。
附帶上一些實驗截圖:
1) 正常發(fā)送
2) Cc/Bcc注入
在From字段添加Inject Payload
發(fā)送郵件后,增加了抄送的功能:
3) 郵件主題注入
我們在from的參數(shù)加添加subject字段:
接收郵件后:
可以看到,原本的subject被注入語句覆蓋了一部分內(nèi)容,但是具體是覆蓋還是附加和具體的PHP代碼編寫邏輯有關,因為現(xiàn)在CMS對Email發(fā)送的普通做法就是利用PHP進行HTTP/HTTPS數(shù)據(jù)包的構造,先在本地構造好數(shù)據(jù)包后,再想服務器發(fā)送。
所以不同的系統(tǒng)對email注入的效果會有所不同。
4) 改變消息的主體body
這里要注意的的,SMTP區(qū)分消息頭部和消息主題是依據(jù)%0A%0A雙換行符決定的。
發(fā)送郵件后,我們發(fā)現(xiàn)消息的消息體已經(jīng)被修改了。
以上就是我在本地的PHP環(huán)境中模擬實驗的結(jié)果,因為環(huán)境和程序代碼處理邏輯的差異,可能在不同的環(huán)境下實驗會有差異,我的經(jīng)驗是根據(jù)不同的PHP CMS系統(tǒng)的Email源代碼進行分析,理清發(fā)送Email數(shù)據(jù)包的代碼邏輯,有針對性的進行email 注入。
六、解決方案
1. 永遠不要信任用戶的輸入字段。所有用戶輸入應該被認為是不可信的和潛在的惡意。應用程序不受信任的輸入過程可能會變得容易受到諸如緩沖區(qū)溢出攻擊、SQL注入,OS指令注入、拒絕服務和電子郵件注入。
2. 使用正則表達式來過濾用用戶提交的數(shù)據(jù)。例如,我們可以在輸入字符串中搜索(r 或 n)。
3. 使用外部組件和庫,提供防范這個問題像 ZEND mail、PEAR mail和swift mailer。
4. ModSecurity可以阻止服務器級別的電子郵件注入。利用ModSecurity,我們可以檢測通過POST或GET提交的CC, BCC或目的地址,并且拒絕任何包含這些字母請求。
相關文章
2019最新RDP遠程桌面漏洞官方補丁(針對win2003、win2008)
Windows系列服務器于2019年5月15號,被爆出高危漏洞,windows2003、windows2008、windows2008 R2、windows xp系統(tǒng)都會遭到攻擊,該服務器漏洞利用方式是通過遠程桌面端口332021-07-25寶塔面板 phpmyadmin 未授權訪問漏洞 BUG ip:888/pma的問題分析
這篇文章主要介紹了寶塔面板 phpmyadmin 未授權訪問漏洞 BUG ip:888/pma,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-24CPU幽靈和熔斷漏洞是什么?Intel為大家簡單易懂的科普了一番
不久前讓整全行業(yè)緊張、全球用戶恐慌的Spectre幽靈、Meltdown熔斷兩大漏洞事件剛剛告一段落了,那么這兩個漏洞到底是什么?可能還有很多人不是很清楚,想了解的朋友跟著小2018-03-21- 2017年5月12日,WannaCry蠕蟲通過MS17-010漏洞在全球范圍大爆發(fā),感染了大量的計算機,該蠕蟲感染計算機后會向計算機中植入敲詐者病毒,導致電腦大量文件被加密,本文對其2017-05-17
- 大部分的用戶可能不要了解文件上傳漏洞,下面小編就為大家具體的講解什么事文件上傳漏洞以及文件上傳漏洞的幾種方式2016-11-02
- 漏洞檢測工具用語有高危漏洞,中危漏洞,低危漏洞以及漏洞的危害介紹,本文介紹的非常詳細,具有參考解決價值,感興趣的朋友一起看看吧2016-10-11
- 漏洞無處不在,它是在硬件、軟件、協(xié)議的具體實現(xiàn)或系統(tǒng)安全策略上存在的缺陷,從而可以使攻擊者能夠在未授權的情況下訪問或破壞系統(tǒng)2016-09-29
手把手教你如何構造Office漏洞POC(以CVE-2012-0158為例)
近年來APT追蹤盛行,最常見的就是各種以釣魚開始的攻擊,不僅僅有網(wǎng)站掛馬式釣魚,也有魚叉式郵件釣魚,下面小編就為大家介紹office漏洞CVE-2012-0158,一起來看看吧2016-09-28- SSL(安全套接字層)逐漸被大家所重視,但是最不能忽視的也是SSL得漏洞,隨著SSL技術的發(fā)展,新的漏洞也就出現(xiàn)了,下面小編就為大家介紹簡單七步教你如何解決關鍵SSL安全問題2016-09-23
Python 爬蟲修養(yǎng)-處理動態(tài)網(wǎng)頁
在爬蟲開發(fā)中,大家可以很輕易地 bypass 所謂的 UA 限制,甚至用 scrapy 框架輕易實現(xiàn)按照深度進行爬行。但是實際上,這些并不夠。關于爬蟲的基礎知識比如數(shù)據(jù)處理與數(shù)據(jù)存2016-09-12