Mail Header Injection (SMTP)
本地沒有搭環境,沒法演示,附上轉載的
https://www.acunetix.com/blog/articles/email-header-injection/
什么是電子郵件標題注入?
通常的做法是網站實施聯系表單,反過來將合法用戶的電子郵件發送給消息的預期收件人。大多數情況下,這樣的聯系表單將設置SMTP標頭From
,Reply-to
以便讓收件人輕松處理聯系表單中的通信,就像其他電子郵件一樣。
不幸的是,除非用戶的輸入在插入SMTP頭之前被驗證,否則聯系表單可能容易受到電子郵件頭插入(也稱為SMTP頭注入)的攻擊。這是因為攻擊者可以將額外的頭部注入到消息中,從而指示SMTP服務器執行與預期不同的指令。
以下PHP代碼是一種易受電子郵件頭部注入攻擊的典型聯系人表單的示例。以下代碼將由網站訪問者提供的名稱和電子郵件地址,並准備電子郵件的標題列表。
使用From標題,以便電子郵件的收件人(在本示例中為root @ localhost)將知道電子郵件作者是誰。回復標題允許電子郵件的收件人通過他們的電子郵件客戶端中的回復按鈕回復發送電子郵件的人。
<?php
if(isset($_POST['name']))
{
$name = $_POST['name'];
$replyto = $_POST['replyTo'];
$message = $_POST['message'];
$to = 'root@localhost';
$subject = 'My Subject';
// Set SMTP headers
$headers = "From: $name \n" .
"Reply-To: $replyto";
mail($to, $subject, $message, $headers);
}
?>
典型的正版POST請求如下。
POST /contact.php HTTP/1.1
Host: www.example.com
name=Joe Bloggs&replyTo=joebloggs@example.com&message=Example message
攻擊者可以通過發送以下POST請求來濫用此聯系表單。
POST /contact.php HTTP/1.1
Host: www.example.com
name=Attacker\nbcc: spam@victim.com&replyTo=attacker@attacker.com&message=Attacker message
在此示例中,攻擊者正在插入換行符(\n
在\r\n
Windows系統上的大多數UNIX和Linux系統上),並附加一個包含附加電子郵件地址的密碼SMTP標頭,SMTP服務器將向BCC發送電子郵件。
攻擊者可以使用這樣的策略匿名發送大量消息,甚至發送網絡釣魚電子郵件,其中接收者認為這些消息源自可信來源。還值得注意的是,此漏洞不限於PHP; 它可能會影響任何基於任意用戶輸入發送電子郵件的應用程序。
檢測電子郵件頭部注入漏洞
為了自動檢測電子郵件頭部注入,我們需要依賴中介服務,因為檢測到這樣一個漏洞需要帶外和時間延遲的向量。Acunetix 在自動掃描期間通過使用AcuMonitor作為其中介服務來解決此問題。
在掃描期間,Acunetix將找到聯系表單,並注入指向AcuMonitor電子郵件地址的自定義BCC SMTP標頭。如果有問題的應用程序導致SMTP服務器發送電子郵件到AcuMonitor,那么AcuMonitor知道它是易受攻擊的,它會發送一個通知回到Acunetix,表明它應該提高電子郵件頭插入警報。
減輕
減少電子郵件標題注入涉及驗證用戶輸入,不允許輸入中的任何換行符,這將導致添加另一個SMTP標頭。一般來說,當驗證用戶輸入時,實現強輸入驗證的最簡單和最強勁的方法是通過白名單中允許的字符用於SMTP標頭。