https://portswigger.net/web-security/server-side-template-injection
簡介
SSTI 全稱 Server-side template injection ,服務端模板注入
什麼是模板、SSTI
模板引擎被設計用來將可變的數據插入到固定的頁面模板中以生成 web 頁面。此處的模板指的是 JavaScript template 。其是用來減少工作量、簡化開發,用來生成 除數據外頁面結構相同的 web 頁面。
當用戶輸入直接被插入到模板中,而不是以值的形式傳進去,則會導致攻擊者可以注入任意的模板指令。
例如有如下的 PHP 代碼,其中 twig 爲php 的模板引擎。
# 參數以值的形式傳遞,不存在該漏洞
$output = $twig->render("Dear {first_name},", array("first_name" => $user.first_name) );
# 參數直接插入到模板中,存在 SSTI
$output = $twig->render("Dear ".$_GET['name']);
# 利用方式
http://vulnerable-website.com/?name={{bad-stuff-here}}
可以看到,該漏洞產生原理和 SQL 注入 相像,都是用戶輸入參數未作處理,直接當作指令的一部分執行。
是否使用預編譯
CSTI & SSTI
根據最終模板代碼執行位置的不同,模板注入分爲服務端模板注入和客戶端模板注入。
漏洞危害
該漏洞最終危害就是執行任意的模板代碼。
同樣是執行 js 代碼,服務端的 js 危害更大。
但通常受限於不同模板引擎的規則,造成的影響也不同,例如絕大多數模板引擎都默認存在沙箱安全機制。
如何攻擊
- 檢測是否存在模板注入的漏洞
- 識別服務端使用何種模板引擎,因爲不同的模板引擎語法不同。
- 進行利用
自動化工具 tplmap https://github.com/epinna/tplmap
效果一般,識別能力不太行,用來利用還不錯。
如何防禦
攻擊
payload 參考:https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection
檢測是否存在模板引擎
對參數進行fuzz ${{<%[%'"}}%\
對可疑的輸入參數進行審計。
檢測
在管理界面有修改顯示名的功能,而實際展現修改後的效果,是在另一個頁面觸發。
利用
查詢官方文檔,尋找敏感功能,進行利用。