服務(wù)器端模板注入攻擊(SSTI) 是指威脅行為者利用模板的本機(jī)語(yǔ)法并將惡意負(fù)載注入模板。然后在服務(wù)器端執(zhí)行受損模板。模板引擎通過(guò)將固定模板與易變數(shù)據(jù)相結(jié)合來(lái)生成網(wǎng)頁(yè)。

攻擊者使用服務(wù)器端模板注入技術(shù)將用戶輸入直接插入模板,允許他們引入任意指令來(lái)改變模板引擎的行為。它可以讓威脅行為者獲得對(duì)目標(biāo)服務(wù)器的完全控制。
服務(wù)器端模板注入有什么影響?
服務(wù)器端模板注入漏洞可能會(huì)使網(wǎng)站遭受各種攻擊,具體取決于模板引擎的類型及其與應(yīng)用程序的工作方式。在極少數(shù)情況下,這些漏洞不會(huì)構(gòu)成真正的安全風(fēng)險(xiǎn)。然而,在大多數(shù)情況下,SSTI 攻擊的影響是嚴(yán)重的。
在最嚴(yán)重的情況下,攻擊者可以遠(yuǎn)程執(zhí)行代碼并完全接管后端服務(wù)器。然后他們可以使用這些服務(wù)器對(duì)內(nèi)部基礎(chǔ)設(shè)施發(fā)起額外的攻擊。即使攻擊者無(wú)法遠(yuǎn)程執(zhí)行代碼,他們也可能能夠讀取存儲(chǔ)在服務(wù)器上的敏感數(shù)據(jù)或文件。具有讀取權(quán)限的攻擊者仍然可以使用 SSTI 作為許多其他攻擊的基礎(chǔ)。
如何檢測(cè) SSTI 漏洞
純文本與基于代碼的 SSTI 檢測(cè)
SSTI 漏洞可能出現(xiàn)在需要不同檢測(cè)技術(shù)的兩種情況下。
純文本 SSTI 檢測(cè)
測(cè)試人員可以通過(guò)使用模板表達(dá)式作為不同模板引擎使用的有效載荷來(lái)檢測(cè)純文本上下文中的 SSTI 漏洞。然后,引擎可以在錯(cuò)誤消息中查看服務(wù)器的 HTTP 響應(yīng)。
常見模板表達(dá)式的一些示例包括:
通用模板表達(dá)式
基于代碼的 SSTI 檢測(cè)
測(cè)試人員可以通過(guò)構(gòu)建有效負(fù)載來(lái)檢索錯(cuò)誤或空白服務(wù)器響應(yīng),從而在代碼上下文中測(cè)試 SSTI 漏洞。
例如,測(cè)試人員可以使用模板語(yǔ)句中的personal_greeting變量在 HTTP 請(qǐng)求中插入 GET 參數(shù)。負(fù)載服務(wù)器將以空白的“Hello”響應(yīng):
personal_greeting=用戶名 用戶 01 您好
接下來(lái),測(cè)試人員可以在使用以下有效負(fù)載后注入 HTML 標(biāo)記以中斷語(yǔ)句:
personal_greeting=用戶名}<tag> 你好 user01 <標(biāo)簽>
當(dāng)測(cè)試人員識(shí)別出注入點(diǎn)后,就可以根據(jù)相關(guān)的模板表達(dá)式來(lái)識(shí)別模板引擎。
輸入中使用的惡意或格式錯(cuò)誤的有效負(fù)載決定了測(cè)試人員是否會(huì)識(shí)別SSTI?。服務(wù)器可能會(huì)顯示錯(cuò)誤消息或標(biāo)記異常。
例如,測(cè)試人員可以通過(guò)在用戶輸入?yún)?shù)中注入以下有效負(fù)載來(lái)檢測(cè)漏洞:
POST /some-endpoint HTTP/1.1
主機(jī):victim-website.com
參數(shù)=${{<%[%'"}}%\.
如果存在漏洞,服務(wù)器將響應(yīng)一個(gè)反映模板引擎的錯(cuò)誤消息。
識(shí)別模板引擎
一旦測(cè)試人員檢測(cè)到模板注入,他們必須確定使用了哪個(gè)模板引擎。此步驟可能很簡(jiǎn)單,測(cè)試人員提交無(wú)效語(yǔ)法,使模板引擎在生成的錯(cuò)誤消息中識(shí)別自己。在某些情況下,這種技術(shù)是不夠的,因?yàn)槟承〇|西會(huì)抑制錯(cuò)誤消息。它也不適合自動(dòng)化。
或者,測(cè)試人員可以使用 Burp Suite 中的決策樹自動(dòng)執(zhí)行識(shí)別步驟。該樹可以映射特定于語(yǔ)言的有效載荷,紅色和綠色箭頭代表失敗和成功的響應(yīng)。有時(shí),單個(gè)負(fù)載可能有多個(gè)成功響應(yīng),例如 {{7*'7'}} 探測(cè)在 Jinja2 中產(chǎn)生 7777777,在 Twig 中產(chǎn)生 49。
利用漏洞
識(shí)別模板注入和底層模板引擎后,測(cè)試人員必須嘗試閱讀文檔。此步驟對(duì)于識(shí)別零日攻擊和驗(yàn)證攻擊者是否可以利用 SSTI 漏洞?很重要。
主要興趣點(diǎn)是:
- “對(duì)于模板作者”部分——本部分介紹基本語(yǔ)法。
- “安全注意事項(xiàng)”部分——應(yīng)用程序的開發(fā)人員可能跳過(guò)了這部分,這可能會(huì)提供有用的安全見解。
- 內(nèi)置功能列表——這應(yīng)該包括內(nèi)置函數(shù)、方法、變量和過(guò)濾器。
- 擴(kuò)展和插件列表——這可能包括默認(rèn)啟用的外部功能。
如果在這個(gè)階段沒有明顯的漏洞利用,那么測(cè)試人員應(yīng)該檢查環(huán)境的可訪問(wèn)性范圍。此步驟可能會(huì)揭示模板引擎提供的默認(rèn)對(duì)象和開發(fā)人員傳遞給模板的特定于應(yīng)用程序的對(duì)象。一些模板系統(tǒng)可能公開一個(gè)名稱空間或“自我”對(duì)象,允許開發(fā)人員列出對(duì)象的方法和屬性。
開發(fā)人員提供的對(duì)象更有可能包含敏感數(shù)據(jù),并且在應(yīng)用程序中的多個(gè)模板之間可能會(huì)有所不同。因此,測(cè)試人員應(yīng)將此過(guò)程分別應(yīng)用于每個(gè)模板。
到目前為止,測(cè)試人員應(yīng)該清楚地了解可用的攻擊面。最后一步是應(yīng)用傳統(tǒng)的安全審計(jì)方法來(lái)審查每個(gè)功能并識(shí)別攻擊者可能利用的漏洞。測(cè)試人員應(yīng)將此步驟作為整體應(yīng)用程序安全的一部分。某些功能可能允許攻擊者利用特定于應(yīng)用程序的功能。
服務(wù)器端模板注入攻擊防護(hù)
從服務(wù)器上完全刪除模板引擎通常是不可接受的,因?yàn)樗С謶?yīng)用程序更改而不會(huì)中斷正在進(jìn)行的操作。因此,學(xué)習(xí)如何在防止 SSTI 的同時(shí)安全地使用模板非常重要。

限制“編輯”訪問(wèn)
對(duì)所有人開放的模板很容易成為黑客的目標(biāo)。因此,最好通過(guò)對(duì)模板文件應(yīng)用訪問(wèn)規(guī)則來(lái)限制訪問(wèn)。防止模板被開發(fā)人員和管理員以外的任何人修改是至關(guān)重要的。此外,生產(chǎn)中使用的模板只能由負(fù)責(zé)服務(wù)器或應(yīng)用程序的特定管理員訪問(wèn),而不應(yīng)由開發(fā)人員訪問(wèn)。這可以降低供應(yīng)鏈攻擊和內(nèi)部威脅的風(fēng)險(xiǎn)。
清理輸入
滅菌可以顯著降低 SSTI 攻擊的風(fēng)險(xiǎn)。模板應(yīng)檢查所有預(yù)期輸入是否存在破壞性元素。如果可能,該模板應(yīng)使用白名單方法來(lái)僅允許用戶期望的輸入,并拒絕其他所有內(nèi)容。一種常見的方法是使用正則表達(dá)式來(lái)創(chuàng)建允許的輸入模式列表。雖然輸入清理很重要,但它是有限的,攻擊者有許多創(chuàng)造性的方法來(lái)規(guī)避它并創(chuàng)建符合允許模式的惡意輸入。因此,該解決方案不能保證完全保護(hù)。
沙盒
沙盒是一種比清理更安全的方法。這是一種預(yù)防措施,可為用戶創(chuàng)建安全、隔離的環(huán)境。在這個(gè)環(huán)境中,沒有危險(xiǎn)的功能或模塊,并且對(duì)其他數(shù)據(jù)的訪問(wèn)受到限制。這意味著如果發(fā)現(xiàn)漏洞或用戶嘗試攻擊,損害是有限的。對(duì)模板進(jìn)行沙箱處理是一種非常有效的措施,但實(shí)施起來(lái)卻很困難。此外,攻擊者可以利用錯(cuò)誤配置或嘗試提升權(quán)限以突破沙盒環(huán)境,從而避開沙盒。
無(wú)邏輯模板
也許最安全的方法是使用無(wú)邏輯模板。這些是將代碼解釋與視覺表示完全分開的模板。無(wú)邏輯模板引擎的一個(gè)例子是 Mustache。無(wú)邏輯模板使用控制流語(yǔ)句來(lái)確保控件在默認(rèn)情況下是數(shù)據(jù)驅(qū)動(dòng)的,從而實(shí)現(xiàn)與應(yīng)用程序邏輯的集成。在此設(shè)置中,遠(yuǎn)程代碼執(zhí)行的可能性變得非常小。






