譯者 | 劉濤
審校 | 重樓
(資料圖片)
服務(wù)器端模板注入(SSTI)漏洞是網(wǎng)絡(luò)應(yīng)用安全中不太為人所知的一種漏洞類(lèi)型。盡管這些漏洞很少見(jiàn),但一旦被發(fā)現(xiàn),其影響往往非常嚴(yán)重,通常會(huì)導(dǎo)致遠(yuǎn)程代碼執(zhí)行(RCE)。
本文旨在揭示這些問(wèn)題是如何產(chǎn)生的,并找出它們?cè)诂F(xiàn)實(shí)環(huán)境中經(jīng)常出現(xiàn)的地方。
什么是服務(wù)器端模板(Server-Side Templates)現(xiàn)代網(wǎng)絡(luò)嚴(yán)重依賴(lài)于大量的用戶信息、產(chǎn)品細(xì)節(jié)和各種其他類(lèi)型的數(shù)據(jù)。為了以有意義的方式呈現(xiàn)這些信息,就需要在網(wǎng)頁(yè)上對(duì)它們進(jìn)行有效的組織,這樣用戶才能快速找到最重要的信息;這也是用戶從精選的搞笑圖片頁(yè)面中獲得快樂(lè)的方式。
模板語(yǔ)言和框架引入了特殊的語(yǔ)法和結(jié)構(gòu),使開(kāi)發(fā)人員能夠創(chuàng)建包含靜態(tài)內(nèi)容的模板,同時(shí)提供的語(yǔ)法和結(jié)構(gòu)允許動(dòng)態(tài)內(nèi)容在不需要混合后端和前端代碼的情況下呈現(xiàn)。
安全問(wèn)題從何而來(lái)?如果攻擊者可以發(fā)送請(qǐng)求,從而使服務(wù)器的模板引擎把用戶的輸入當(dāng)作模板來(lái)處理,那么就會(huì)產(chǎn)生安全問(wèn)題。一個(gè)好的安全評(píng)估在尋找這類(lèi)漏洞時(shí),需要專(zhuān)注考慮以下幾個(gè)方面:
管理員功能 - 允許管理員定制頁(yè)面,橫幅,或者應(yīng)用程序中的其他可視元素,有時(shí)還會(huì)提供模版作為一項(xiàng)特色。一些開(kāi)發(fā)人員甚至可能選擇允許訪問(wèn)模板語(yǔ)言,從而打開(kāi)這個(gè)漏洞。
未經(jīng)過(guò)濾的輸入 - 任何可能返回給用戶或顯示在另一頁(yè)上的輸入都可能導(dǎo)致SSTI,具體取決于網(wǎng)站的功能。既然理解了模板語(yǔ)言的用例,那么請(qǐng)戴上您的開(kāi)發(fā)帽,思考您會(huì)在哪些地方使用模板。
測(cè)試SSTI漏洞如果懷疑應(yīng)用程序存在SSTI漏洞,那么在應(yīng)用程序中可以使用一些模板語(yǔ)言。測(cè)試越有針對(duì)性,效果越好。如果能夠通過(guò)偵測(cè)確定應(yīng)用程序的開(kāi)發(fā)語(yǔ)言(如Python/Java/PHP等),則可以為目標(biāo)語(yǔ)言中常用的模板框架創(chuàng)建測(cè)試有效載荷。
SSTI Polyglot PayloadSSTI Polyglot有效載荷旨在跨多個(gè)框架和語(yǔ)言測(cè)試SSTI漏洞。在源代碼未知的情況下,它可以輔助測(cè)試。但由于此特定有效載荷很常見(jiàn),且包含大量特殊字符(如${{<%[%""}}%),所以它更可能被輸入過(guò)濾( input sanitization)攔截或被防火墻(WAFs)阻斷。
可以考慮在請(qǐng)求中使用有效載荷,以在目標(biāo)應(yīng)用程序上觸發(fā)某種錯(cuò)誤消息。
GET/search?query=${{<%[%""}}%\.Python - Jinja2(Python的一組模板引擎)
一個(gè)簡(jiǎn)單的用于測(cè)試應(yīng)用程序是否正在處理Jinja模板的有效載荷是{{7*7}},如果應(yīng)用程序正在處理該模板,則頁(yè)面上將顯示49。
為了進(jìn)一步提升這個(gè)有效載荷,您可以嘗試使用下面的示例來(lái)使用Python的OS包執(zhí)行date命令。
{{self.__init__.__globals__.__builtins__.__import__("os").popen("date").read()}}
在使用上述示例時(shí),您正在使用Jinja來(lái)執(zhí)行OS功能,從而執(zhí)行OS命令,而這些應(yīng)該包含在應(yīng)用程序的類(lèi)路徑中。如果應(yīng)用程序的運(yùn)行環(huán)境特別嚴(yán)格,但您有一個(gè)可行的SSTI POC(證明服務(wù)器端模板注入漏洞存在漏洞利用代碼),您可以考慮深入研究應(yīng)用程序使用的任何其他Python包。例如,您嘗試通過(guò)SSTI訪問(wèn)常用的requests包以進(jìn)行進(jìn)一步地利用。這類(lèi)似于您可能在反序列化漏洞中看到的應(yīng)用開(kāi)發(fā)方式。
Jinja 過(guò)濾器旁路您也應(yīng)該知道,對(duì)于Jinja2 應(yīng)用防火墻和應(yīng)用程序過(guò)濾器存在繞過(guò)方法。過(guò)濾器和相關(guān)的繞過(guò)方法總是在變化,但是下面是您可能會(huì)看到的常見(jiàn)過(guò)濾器。
防火墻可能會(huì)攔self.__init__.__globals__.__builtins__.的某些部分。如果是這種情況,使用attr()可能會(huì)有所幫助,因?yàn)樗梢灾苯釉L問(wèn)builtins(內(nèi)置函數(shù))對(duì)象。
{{ request|attr("builtins")|import("os")|popen("date")|read}}
深入研究過(guò)濾器繞過(guò)方法,您可以讓Python幫助轉(zhuǎn)換有效載荷!例如,使用format()可以在處理模板引擎時(shí)轉(zhuǎn)換有效載荷。當(dāng)某些組合. or_被阻止時(shí),這將有所幫助。
{{ request|format("%s%sbuiltins%s%s")|import("os")|popen("date")|read}}
Java模板注入
Java有更多的模板框架需要應(yīng)對(duì),可能好壞參半?;赟pring的Web應(yīng)用程序非常常見(jiàn),Baeldung有一個(gè)很棒的列表,網(wǎng)址如下:https://www.baeldung.com/spring-template-engines
ThymeLeaf(Java服務(wù)器端模板引擎)注入這是 Java中常見(jiàn)的一種模板引擎類(lèi)型,其利用 SSTI漏洞的方法已廣為人知。做個(gè)簡(jiǎn)單的測(cè)試,看看是否存在模板注入漏洞,可以再次使用${7*7}這個(gè)方法,如果您在響應(yīng)中看到49而不是模板,那就意味著存在問(wèn)題。
這種RCE有效載荷(一種遠(yuǎn)程代碼執(zhí)行的有效載荷)有兩種變體,Spring Expression Language (SpringEL) 和 Object Graph Navigation Language (OGNL)。SpringEL比較流行,也比較現(xiàn)代化,但是您可能會(huì)發(fā)現(xiàn) OGNL模板仍然被使用。這里是我們的示例,再次執(zhí)行date命令。
SpringEL ${T(java.lang.Runtime).getRuntime().exec(‘date’)}OGNL ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec(‘date’)}
結(jié)束語(yǔ)
盡管本文只是一個(gè)簡(jiǎn)單的介紹,但希望您能了解這些漏洞是如何被利用以及它們是如何產(chǎn)生的。這并沒(méi)有涵蓋所有可能的SSTI有效載荷和框架,但我建議您深入研究。
延伸閱讀https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server Side Template Injection/README.md
https://portswigger.net/web-security/server-side-template-injection
譯者介紹劉濤,51CTO社區(qū)編輯,某大型央企系統(tǒng)上線檢測(cè)管控負(fù)責(zé)人。
原文標(biāo)題:An Introduction to Server Side Template Injection Bugs,作者:David Neal
標(biāo)簽: