国产精品一区二区在线观看完整版,在线观看91精品国产性色,欧美日韩另类视频

杭州校區切換校區
圖標

學習文章

當前位置:首頁 > >學習文章 > >

在PHP應用程序開發中不正當使用mail()函數引發的血案

發布時間: 2017-06-16 15:18:13

在我們挖掘PHP應用程序漏洞的過程中,發現了一個遠程命令執行漏洞(CVE-2016-9920)。該漏洞允許攻擊者通過利用Roundcube接口發送一個精心構造的電子郵件從而在目標系統上執行任意命令。在這篇文章中,小編將分析一下這些漏洞的共同點,哪些安全補丁仍然存在問題以及如何安全的使用mail()函數。

 

二、淺析PHP的mail()函數

PHP自帶了一個內聯函數mail()用于在PHP應用程序中發送電子郵件。開發者可以通過使用以下五個參數來配置郵件發送。



這個函數的前三個參數這里就不細說了,因為這些參數一般情況下不會受到注入攻擊的影響。值得關注的一點是如果$to參數由用戶控制控制的話,那么其可以向任意電子郵件地址發送垃圾郵件。

 

三、郵件頭注入

在這篇文章中小編重點分析后兩個參數。第四個參數$additional_headers的主要功能是規定額外電子郵件報頭。比如From、Reply-To、Cc以及Bcc。由于郵件報頭由CRLF換行符\r\n分隔。當用戶輸入可以控制第四個參數,攻擊者可以使用這些字符(\r\n)來增加其他的郵件報頭。這種攻擊方式稱為電子郵件頭注入(或短電子郵件注入)。這種攻擊可以通過向郵件頭注入CC:或BCC:字段造成發送多封垃圾郵件。值得注意的是某些郵件程序會自動將\n替換為\r\n。

 

四、為什么沒有正確處理mail()函數的第五個參數會引發安全問題

為了在PHP中使用mail()函數,必須配置一個電子郵件程序或服務器。在php.ini配置文件中可以使用以下兩個選項:

  • 配置PHP連接的SMTP服務器的主機名和端口
  • 配置PHP用作郵件傳輸代理(MTA)的郵件程序文件路徑

當PHP配置了第二個選項時,調用mail()函數的將導致執行配置的MTA(郵件傳輸代理)程序。盡管PHP內部可以調用escapeshellcmd()函數防止惡意用戶注入其他的shell命令,mail()函數的第五個參數$additional_parameters允許向MTA(郵件傳輸代理)中添加新的程序參數。因此,攻擊者可以在一些MTA中附加程序標志,啟用創建一個用戶可控內容的文件。

1. 漏洞演示代碼     


 

在上述代碼中存在一個遠程命令執行漏洞,這個問題容易被沒有安全意識的開發人員忽略。GET參數完全由用戶控制,攻擊者可以利用該處輸入向郵件程序傳遞其他額外的參數。例如在發送郵件的過程中可以使用-O參數來配置發送郵件的選項,使用-X參數可以指定日志文件的位置。

2. 概念性驗證(PoC)



這個PoC的功能是在Web目錄中生成一個PHP webshell。該文件(rce.php)包含受到PHP代碼污染的日志信息。因此,當訪問rce.php文件時,攻擊者能夠在Web服務器上執行任意PHP代碼。

 

五、最新相關的安全漏洞

在許多現實世界的應用程序中,有很多由于mail()函數的第五個參數使用不當引發的安全問題。最近發現以下廣受關注的PHP應用程序受到此類漏洞的影響(多數漏洞由Dawid Golunski發現)。


由于一些廣泛使用的Web應用程序,如Wordpress、Joomla和Drupal,部分模塊基于以上庫開發,所以也會受到該類漏洞的影響。

 

六、為什么escapeshellarg()函數沒有那么安全?

PHP提供了escapeshellcmd()和escapeshellarg()函數用來過濾用戶的輸入,防止惡意攻擊者執行其他的系統命令或參數。直觀來講,下面的PHP語句看起來很安全,并且防止了-param1參數的中斷:



然而,當此程序有其他可利用參數時,那么這行代碼就是不安全的。攻擊者可以通過注入"foobar' -param2 payload "來突破-param1參數的限制。當用戶的輸入經過兩個escapeshell*函數的處理,以下字符串將到達system()函數。



從最終系統執行的命令可以看出,兩個嵌套的轉義函數混淆了引用并允許附加另一個參數param2。PHP的mail()函數在內部使用escapeshellcmd()函數過濾傳入的參數,以防止命令注入攻擊。這正是為什么escapeshellarg()函數不會阻止mail()函數的第五個參數的攻擊。

 

七、為什么FILTER_VALIDATE_EMAIL是不安全的?

另一種直接的方法是使用PHP的電子郵件過濾器(email filter),以確保在mail()函數的第五個參數中只使用有效的電子郵件地址。



但是,并不是所有可能存在安全問題的字符串都會被過濾器過濾。它允許使用嵌入雙引號的轉義的空格。由于函數底層實現正則表達式的原因,filter_var()沒有對輸入正確的過濾,導致構造的payload被帶入執行。   



對于上文給出的url編碼輸入,filter_var()函數返回true,將該payload識別為有效的郵件格式。當開發人員使用該函數驗證電子郵件格式作為唯一的安全驗證措施,此時仍然是可以被攻擊者利用的。



切記,filter_var()不適合用于對用戶輸入內容的過濾,因為它對部分字符串的驗證是不嚴格的。

 

八、如何安全的使用mail()函數

仔細分析應用程序中傳入mail()函數的參數,滿足以下條件:

1. $to 除非可以預期用戶的輸入內容,否則不直接使用用戶輸入

2. $subject 可以安全的使用

3. $message 可以安全的使用

4. $additional_headers 過濾\r、\n字符

5. $additional_parameters 禁止用戶輸入

事實上,當把用戶的輸入作為shell指令執行時,沒有什么辦法可以保證系統的安全性,千萬不要去考驗你的運氣。如果在開發你的應用程序過程中第五個參數一定要由用戶控制,你可以使用電子郵件過濾器(email filter)將用戶輸入的合法數據限制為最小字符集,即使它違反了RFC合規性。小編建議不要信任任何轉義或引用程序,因為據研究資料表明這些功能是存在安全問題的,特別是在不同環境中使用時,可能還會暴露出其他安全隱患。

許多PHP應用程序都有向其用戶發送電子郵件的功能,例如提醒和通知。雖然電子郵件頭注入是眾所周知的安全問題,但是當開發人員使用mail()函數時,往往會忽視不正當的使用有可能導致遠程命令執行漏洞。

 

  

上一篇: 停止并重啟OpenStack實例的方法

下一篇: {Android}深入理解Android的渲染機制

在線咨詢 ×

您好,請問有什么可以幫您?我們將竭誠提供最優質服務!

<bdo id="pdyax"></bdo>

    <pre id="pdyax"></pre>
    <menuitem id="pdyax"></menuitem>
      <form id="pdyax"><tbody id="pdyax"></tbody></form>

      1. <center id="pdyax"><center id="pdyax"></center></center>
          1. 主站蜘蛛池模板: 巫山县| 景德镇市| 越西县| 砀山县| 司法| 兴山县| 潼关县| 司法| 昂仁县| 特克斯县| 武乡县| 板桥市| 江达县| 渑池县| 霞浦县| 山西省| 和硕县| 阳春市| 芷江| 宜兴市| 吴川市| 祥云县| 巴里| 济阳县| 广河县| 新巴尔虎右旗| 邛崃市| 江北区| 温宿县| 和田市| 修文县| 东兴市| 慈利县| 宝应县| 和顺县| 鹤山市| 罗城| 胶南市| 陆丰市| 台中县| 仪征市|