伺服器端模板注入 - SSTI 漏洞 - SSTI 有效載荷

透過實際程式碼範例解釋伺服器端模板注入

伺服器端模板注入 (SSTI) 是一種漏洞,其中使用者輸入由模板引擎進行評估,而不是以純文字形式呈現,從而允許攻擊者在伺服器上運行任意程式碼。

伺服器端模板注入的幕後工作原理

當使用者輸入直接嵌入到模板引擎中,並在未經適當的清理或隔離的情況下進行評估時,就會發生伺服器端模板注入攻擊。這會造成 SSTI 漏洞,攻擊者可以利用該漏洞注入特製的 SSTI 有效載荷(例如, {{7*7}} 在 Jinja2 中),引擎會對其進行評估,從而實現從資料外洩到在伺服器上下文中執行任意程式碼等各種功能。由於不同的模板引擎公開的物件和 API 不同,SSTI 有效載荷也會因平台而異,但都存在相同的危險:它們允許不受信任的輸入逃逸出預期的渲染流程,並在應用程式運行時執行,如果不加以控制,通常會導致完全遠端程式碼執行或橫向移動。

Jinja2 中的最小漏洞範例

如果用戶發送 ?name={{7*7}}該應用程式將對其進行評估,並傳回結果。 你好49這是一個典型的SSTI漏洞。

Twig 中最小的易受攻擊範例

攻擊者可以注入 SSTI 有效載荷,例如 {{7*7}} 證明程式碼執行。 危險在於:簡單的注入攻擊可能會升級為讀取檔案、執行作業系統命令,甚至深入基礎架構內部。

真實案例:可觸發遠端程式碼執行的 SSTI 有效載荷

一旦有 SSTI 漏洞,攻擊者就會嘗試從概念驗證階段過渡到完整的攻擊階段。 RCE不同的模板引擎處理有效載荷的方式不同。

Jinja2 酬載

  • {{7*7}} → 算術執行
  • {{config.items()}} → 洩漏伺服器配置。
  • {{ “”.__class__.__mro__[2].__subclasses__() }} → 通往 RCE 的路徑

速度有效載荷

  • #set($x=”7″)${x} → 噴射旁路
  • #set($a=$class.inspect(“java.lang.Runtime”)) → 直接運行時訪問

樹枝載荷

  • {{7*7}} → 算術
  • {{app.request.server.all}} → 環境變數
  • {{_self.env.registerUndefinedFilterCallback(‘system’)}} → 程式碼執行

這些 SSTI 有效載荷表明,相同漏洞在不同引擎中會導致不同的結果。 漏洞利用路徑, 但它們始終都很危險。

伺服器端模板注入的隱藏之處 CI/CD-驅動型應用程式

伺服器端模板注入不僅僅是 Web 應用程式的風險;它還會出現在其他方面。 現代 CI/CD pipelines 了。 常見的藏身之處包括:

  • 掌舵圖 在 Kubernetes 中,模板值是動態渲染的。
  • 電子郵件模板 將使用者控制的輸入連接起來
  • Dashboards 其中查詢字串或配置資料被注入到模板中
  • DevOps腳本 使用模板引擎產生 HTML/Markdown。

示例:

If.Values.message 由於輸入來自不受信任的訊息,它會在部署過程中引入伺服器端模板注入。 pipeline 本身。

利用更安全的模板模式和靜態分析來預防 SSTI

緩解 SSTI 漏洞需要更好的編碼模式和早期檢測。

安全模式

  • ❌ 請勿使用 渲染模板字串 或同等學歷
  • ✅ 使用預先定義的模板檔案並傳遞經過清理的變數
  • ✅ 沙盒模板引擎(如有)
  • ✅ 在渲染之前驗證並轉義用戶輸入
  •  

開發人員簡易檢查清單

  • 切勿直接渲染原始使用者輸入。
  • 支援時請使用沙盒模板
  • 清理並驗證所有模板變數
  • 避免使用自訂範本評估器
  • 掃描二維碼 渲染模板字串 或字串連接模式

靜態分析 程式碼檢查工具可以在風險結構進入生產環境之前將其標記出來。

在 DevSecOps 中嵌入 SSTI 檢查 Pipelines

及早發現伺服器端模板注入比事後修復更經濟、更安全。 DevSecOps 團隊應該在系統中嵌入檢查機制。 pipelines:

  • Commit hooks: 拒絕 commit具有危險功能的(渲染模板字串)
  • 靜態分析器掃描模板程式碼中的伺服器端模板注入風險
  • 依賴性驗證標記存在已知 SSTI 漏洞的過時模板引擎
  • Pipeline 門:阻止合併,直到 SSTI 檢查通過

透過將 SSTI 有效載荷檢測納入其中 CI/CD這樣可以防止可利用漏洞的程式碼被發布。

不要讓伺服器端模板注入悄悄潛入你的技術棧。

單一伺服器端模板注入可以從數學技巧演變為更嚴重的攻擊({{7*7}})到完全遠端程式碼執行。 SSTI 漏洞不僅出現在 Web 應用程式中,也出現在… CI/CD pipelines、Helm 圖表和電子郵件範本。

關鍵要點

  • 切勿將原始使用者輸入渲染到範本中
  • 驗證並清理所有動態變量
  • 不同的引擎(Jinja2、Velocity、Twig)具有不同的SSTI有效載荷,但所有引擎都可以被武器化。
  • 在靜態分析和快速失敗閘中使用 pipelines
  • 定期審核堆疊中的模板

Xygeni Xygeni 會在程式碼庫中掃描注入漏洞和其他不安全的編碼模式,並在未經清理的模板渲染等風險結構進入生產環境之前將其捕獲,其 OWASP 基準測試的誤報率最低。 CI/CD 以及 IaC security 掃描功能將同樣的覆蓋範圍擴展到 pipeline Xygeni 會檢查配置、Helm Chart 和建置腳本,並在發布前標記錯誤配置和惡意命令。當 Xygeni 發現漏洞時,AI AutoFix 會直接在專案中產生一個上下文相關的、可供開發人員使用的修復程式。 pull request因此,補救措施不會等到下一個迭代周期。

在DevSecOps中,捕獲模板注入至關重要。 pipeline 部署階段,而不是部署之後,才是防止單一有效載荷完全失效的關鍵。

免費開始。 無需信用卡,幾分鐘即可掃描您的第一個倉庫。

常見問題

什麼是伺服器端模板注入?

當使用者輸入被傳遞到模板引擎並作為程式碼執行而不是作為文字顯示時,就會發生 SSTI,這使得攻擊者能夠在伺服器上下文中執行命令。

SSTI 和 XSS 是一回事嗎?

不。 XSS 注入的腳本會在受害者的瀏覽器中執行;SSTI 注入的程式碼會在伺服器端由模板引擎執行,因此 SSTI 可以直接導致遠端程式碼執行。

哪些模板引擎容易受到SSTI攻擊?

任何對表達式進行求值的引擎,如果使用者輸入未經清理,都可能存在漏洞,包括 Jinja2、Twig 和 Velocity,儘管它們各自暴露的物件不同,因此攻擊路徑也不同。

如何預防皮膚和軟組織感染? CI/CD pipelines?

掃描危險模式,例如 render_template_string at commit 在支援的情況下,使用沙箱模板引擎,並在程式碼進入生產環境之前,根據靜態分析結果進行程式碼合併。

sca-tools-software-composition-analysis-tools
優先處理、補救並保護您的軟體風險
註冊免費帳號。
不需要信用卡。

確保您的軟體開發和交付安全

使用 Xygeni 產品套件