一般的作法是網站實施聯繫表單,反過來將合法用戶的電子郵件發送給消息的預期收件人。大多數狀況下,這樣的聯繫表單將設置SMTP標頭From
,Reply-to
以便讓收件人輕鬆處理聯繫表單中的通訊,就像其餘電子郵件同樣。網絡
不幸的是,除非用戶的輸入在插入SMTP頭以前被驗證,不然聯繫表單可能容易受到電子郵件頭插入(也稱爲SMTP頭注入)的攻擊。這是由於攻擊者能夠將額外的頭部注入到消息中,從而指示SMTP服務器執行與預期不一樣的指令。app
如下PHP代碼是一種易受電子郵件頭部注入攻擊的典型聯繫人表單的示例。如下代碼將由網站訪問者提供的名稱和電子郵件地址,並準備電子郵件的標題列表。網站
使用From標題,以便電子郵件的收件人(在本示例中爲root @ localhost)將知道電子郵件做者是誰。回覆標題容許電子郵件的收件人經過他們的電子郵件客戶端中的回覆按鈕回覆發送電子郵件的人。spa
<?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請求以下。code
POST /contact.php HTTP/1.1 Host: www.example.com name=Joe Bloggs&replyTo=joebloggs@example.com&message=Example message
攻擊者能夠經過發送如下POST請求來濫用此聯繫表單。blog
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發送電子郵件。get
攻擊者可使用這樣的策略匿名發送大量消息,甚至發送網絡釣魚電子郵件,其中接收者認爲這些消息源自可信來源。還值得注意的是,此漏洞不限於PHP; 它可能會影響任何基於任意用戶輸入發送電子郵件的應用程序。it
檢測電子郵件頭部注入漏洞
爲了自動檢測電子郵件頭部注入,咱們須要依賴中介服務,由於檢測到這樣一個漏洞須要帶外和時間延遲的向量。Acunetix 在自動掃描期間經過使用AcuMonitor做爲其中介服務來解決此問題。
在掃描期間,Acunetix將找到聯繫表單,並注入指向AcuMonitor電子郵件地址的自定義BCC SMTP標頭。若是有問題的應用程序致使SMTP服務器發送電子郵件到AcuMonitor,那麼AcuMonitor知道它是易受攻擊的,它會發送一個通知回到Acunetix,代表它應該提升電子郵件頭插入警報。
減輕
減小電子郵件標題注入涉及驗證用戶輸入,不容許輸入中的任何換行符,這將致使添加另外一個SMTP標頭。通常來講,當驗證用戶輸入時,實現強輸入驗證的最簡單和最強勁的方法是經過白名單中容許的字符用於SMTP標頭。