SSTI惡意指令注入:駭客攻擊防範實戰指南
2024年台灣企業必讀戒備策略
▍模板引擎漏洞核心解析
當開發者將「使用者可控輸入」直接串接至模板時(例如用戶名、Email內容、動態頁面參數),駭客即可透過模板語法注入惡意指令。
相較於僅影響前端的CSTI,SSTI可直接操控伺服器執行系統命令,高風險場景包括:
– 個人化郵件模板(電子報/電子發票)
– 購物網站商品動態頁面
– 使用者資料輸出頁面(如會員帳戶頁)
💡 致命差異:CSTI攻擊受限瀏覽器沙箱,SSTI卻能取得伺服器控制權!
相較於僅影響前端的CSTI,SSTI可直接操控伺服器執行系統命令,高風險場景包括:
– 個人化郵件模板(電子報/電子發票)
– 購物網站商品動態頁面
– 使用者資料輸出頁面(如會員帳戶頁)
💡 致命差異:CSTI攻擊受限瀏覽器沙箱,SSTI卻能取得伺服器控制權!
▍台灣企業常見攻擊案例與Payload
透過PortSwigger研究總監James Kettle的檢測流程,實戰識別引擎類型:
模板引擎 | 隸屬技術棧 | 檢測Payload | RCE攻擊指令 | |
---|---|---|---|---|
Twig | PHP/Symfony | {{7*7}} | `{{[‘id’] | filter(‘system’)}}` |
Jinja2 | Python/Flask | {{7*’7′}} | 透過物件繼承鏈呼叫subprocess | |
Thymeleaf | Java/Spring | ${7*7} | ${T(Runtime).getRuntime().exec(‘id’)} | |
Smarty | PHP | {7*7} | {system(‘cat /etc/passwd’)} | |
PugJs | Node.js | #{7*7} | 劫持child_process模組執行命令 |
⚠️ 台灣重大案例警示:台灣資安研究員Orange透過Jinja2 SSTI漏洞,在Uber個人資料修改頁面注入惡意模板,成功觸發遠端代碼執行(RCE)。關鍵教訓:來自資料庫的資料仍屬不可信輸入!
▍7大實戰防護策略(適用台灣企業架構)
1. 輸入驗證鐵則
python
# Flask/Jinja2 範例:白名單過濾機制
from jinja2 import Template
safe_str = re.sub(r'[{}]’, ”, user_input) # 移除所有花括號
Template.render(safe_str)
2. 沙箱隔離實作
啟用Jinja2沙箱模式:
Environment(loader=..., sandboxed=True)
Node.js適用vm2沙箱模組:封鎖
require('child_process')
3. 靜態模板優先原則
啟用Jinja2沙箱模式:
Environment(loader=..., sandboxed=True)
Node.js適用vm2沙箱模組:封鎖
require('child_process')