SSTI惡意指令注入:駭客攻擊防範實戰指南

2024年台灣企業必讀戒備策略

▍模板引擎漏洞核心解析

當開發者將「使用者可控輸入」直接串接至模板時(例如用戶名、Email內容、動態頁面參數),駭客即可透過模板語法注入惡意指令。
相較於僅影響前端的CSTI,SSTI可直接操控伺服器執行系統命令,高風險場景包括:

– 個人化郵件模板(電子報/電子發票)
– 購物網站商品動態頁面
– 使用者資料輸出頁面(如會員帳戶頁)
💡 致命差異:CSTI攻擊受限瀏覽器沙箱,SSTI卻能取得伺服器控制權!

▍台灣企業常見攻擊案例與Payload

透過PortSwigger研究總監James Kettle的檢測流程,實戰識別引擎類型:
模板引擎隸屬技術棧檢測PayloadRCE攻擊指令
TwigPHP/Symfony{{7*7}}`{{[‘id’]filter(‘system’)}}`
Jinja2Python/Flask{{7*’7′}}透過物件繼承鏈呼叫subprocess
ThymeleafJava/Spring${7*7}${T(Runtime).getRuntime().exec(‘id’)}
SmartyPHP{7*7}{system(‘cat /etc/passwd’)}
PugJsNode.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')

Similar Posts