iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0

想必大家都有遇過把變數丟進模板、結果畫面莫名顯示奇怪東西的經驗吧?或是在模板裡丟個小表達式想試個效果,結果程式跑出意外結果。其實這背後的秘密就是——模板引擎會執行你給它的東西

什麼是 SSTI?

  • 應用直接把使用者輸入放到模板變數裡,然後把整個模板字串送去引擎渲染(而非當作純文字顯示)。
  • 使用者可控制的輸入沒有被視為字面值(escaped/encoded),引擎會把它當成可執行的模板表達式評估。
  • 某些 debug 模式或錯誤回顯會加深危險(例如回傳未過濾的渲染結果或例外堆疊)。

為什麼 SSTI 很危險?

模板引擎通常會暴露語言內建的功能(字串/函式/物件存取),若能藉由模板語法探索物件型態(mro、class、globals 等),就可能從資料讀取、執行系統命令到取得任意程式碼執行(RCE)。不同模板引擎可利用的技巧差異很大,但一旦能評估任意表達式,風險就非常高。

常見模板引擎與表現形式

  • Jinja2 / Flask/Jinja:常見於 Python web 應用,語法 {{ ... }},可透過物件探索走到 __class____mro__ 等。
  • Django templates:限制較多,但在某些配置或自訂 filter 下也可能被濫用。
  • Twig (PHP):語法類似 {{ ... }},也能存取物件/函式。
  • ERB (Ruby):語法 <%= ... %>,可執行 Ruby 表達式。
  • Freemarker / Velocity (Java):語法不同,但同樣可能在模板中執行方法或存取物件。

要注意:每個引擎行為不同,payload 必須針對引擎調整。

常見檢測方法

在新頁面或參數遇到模板渲染時,可以先做幾個簡單的測試來判斷是否存在 SSTI(只在自己 lab / CTF 測試):

  1. 輸出簡單運算
    • 在輸入欄放 {{7*7}} → 若頁面顯示 49,表示輸入被當作模板表達式執行。
  2. 輸出字串拼接 / 運用內建函數
    • {{'SSTI' + ' OK'}}{{'SSTI'.upper()}}(視引擎而定)查看是否被處理。
  3. 錯誤回顯引導
    • 嘗試送出會產生例外的模板語法,觀察是否回傳堆疊或錯誤訊息(有時會曝露引擎類型與版本)。

picoCTF - SSTI1

我們先用{{7*7}} 確認這題有SSTI漏洞,顯示49就代表有漏洞!

https://ithelp.ithome.com.tw/upload/images/20250919/20169105abAfyF2789.png

接下來我們用{{ request.application.__globals__.__builtins__.__import__('os').popen('ls').read() }} 執行ls指令,可以發現一個叫flag的檔案

https://ithelp.ithome.com.tw/upload/images/20250919/20169105i7XTgiVNtK.png

把上面那個payload的指令改為cat flag ,這樣就能成功獲得這題的flag啦

https://ithelp.ithome.com.tw/upload/images/20250919/20169105HzdSaLpPMA.png


以上就是今天的內容啦

想看更多,記得明天再來喔~


上一篇
Day 23 - xss
下一篇
Day25 - 組合語言
系列文
一天一題picoCTF:從Easy開始的新手生活27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言