“服務器端模板注入”漏洞被披露出來,那么,它與跨站腳本之間有何區別?相應地,防御策略也是否有所不同?
Michael Cobb:驗證并清除來自不受信任來源的輸入是軟件開發人員需要遵守的重要原則,以防止惡意代碼注入攻擊如跨站腳本(XSS)和SQL注入等。盡管清理用戶輸入是安全編程的核心原則,然而數據未被清理的情況仍舊時有發生,且生成黑客可以攻擊用戶及系統的漏洞。
Web安全公司PortSwigger的研究人員研制了Web應用安全測試工具Burp Suite,該工具最新發現一個不知名的注入漏洞級別的漏洞,他們將其稱作“服務器端模版注入”。
模版引擎廣泛用于從展示層分離程序邏輯,維基、博客和內容管理系統都傾向于使用模版引擎。不僅因為這是良好的編程實踐,也因為它能夠使懂很少HTML知識的員工輕松地更新和維護網站內容或編寫HTML格式的電子郵件。它們也讓專業的網頁設計師利用這些代碼快速而高效地建站。流行的模板包括Twig、Jade以及XWike Enterprise。
一些引擎使用簡單的字符串,占位符由數據替換。舉個例子,一封電子郵件模板開頭可能是 "Dear {user_firstname}" ,在模板引擎中,"user_firstname" 則由底層數據庫中的’first name‘所取代。其他模板也用所謂的"if-defined-conditionals"來測試數據存在與否,有些則包括額外的靈活性,諸如用for-each循環、遞歸宏和嵌入式表達來提供更豐富的功能。
對于駐留在服務器上的模板引擎代碼來說,驗證和清理任何用戶提供的添加進模板的輸入和內容都是非常必要的;否則,則很可能發生服務器端模板注入攻擊。不像XSS攻擊,它能夠直接攻擊底層Web服務器,而非只是它的用戶。盡管一些模板引擎部署了沙箱來限制訪問,確保能安全處理不信任的輸入,PortSwigger公司發現很多這類注入攻擊都能繞過這些沙箱。該項研究解釋了檢測和利用模板注入漏洞的方法,并演示了利用五個最流行模板引擎的各種利用方式,包括沙箱逃避。
目前PortSwigger并不確定該模板注入攻擊有多普遍,不過它打算使用Burp Suite來檢測這類注入漏洞。簡單和相對扁平的模板如Mustache不會引起風險,用戶無法從模板語言中調用函數,盡管HTML輸出仍然需要被清理。Wikipedia背后的開源模板引擎MediaWiki是更為靈活的引擎,根據PortSwigger,其沙箱環境在防止沾染潛在危險模塊和功能方面做的非常好。
該研究表明企業開發團隊不應該盲目依賴網站開發工具來實現最佳實踐。安全團隊需要仔細評估模板引擎是如何處理用戶輸入的以及內置安全檢查或沙箱是否會被規避。閱讀福袋文檔可以在輸入檢查使顯示明顯的缺點,不過分析師應該仔細檢查模板的代碼以及是哪些引擎能夠允許用戶輸入以及查看是否安全檢查會被繞過。緩解技巧之一就是將模板引擎置于一個強化的Docker容器沙箱環境中,來追蹤任何惡意代碼執行。