SSTI( 伺服器模板注入)以及常見利用方式
阿新 • • 發佈:2020-11-20
0x00 前言
簡單介紹下,由於模板引擎支援使用靜態模板檔案,並在執行時用HTML頁面中的實際值替換變數/佔位符,從而讓HTML頁面的設計變得更容易。當前廣為人知且廣泛應用的模板引擎有Smarty、Twig、Jinja2、FreeMarker和Velocity。
簡而言之,我們如果在開發過程中,如果選擇使用的字串格式化將URL動態新增到模板字串中並返回到頁面中,這時使用者對模板是可控的。
0x01 漏洞演示
根據清風師傅在文章中所提到的,我們原版來分析下:
針對於模板可控,帶入觸發XSS
http://127.0.0.1:5000/<script>alert(/xss/)</script>
Jinjan2 基礎語法
{% ... %}
{{ ... }}
{# ... #}
模版引擎成功解析
http://127.0.0.1:5000/aaa{{1+2}}
雞肋拒絕服務攻擊
request 是Flask模版的一個全域性物件,其代表 “當前請求物件(flask.request)”,在request 物件中有一個environ物件名。
request.environ 物件是一個與伺服器環境相關的物件字典,字典中一個名為 shutdown_server 的方法名分配的鍵為 werkzeug.server.shutdown 。
注射 {{ request.environ['werkzeug.server.shutdown']() }} 會造成拒絕服務。
Python
Copy
獲取配置專案資訊
config 也是 Flask模版中的一個全域性物件,它包含了所有應用程式的配置值。
{{ config.items() }} // 檢視配置專案的資訊
輸入:http://127.0.0.1:5000/a{{ config.items() }}
更多詳情連結:http://www.pythondoc.com/flask/config.html
config是一個類字典物件,它的子類包含很多方法:from_envvar, from_object, from_pyfile, root_path。
Flask/config.py
def from_object(self, obj):
1. from_object 遍歷新加模組中的所有大寫的變數的屬性並新增屬性
2. 並且這些新增到config物件的屬性都會維持他們本來的型別
3. 驗證:我們將 {{ config.items() }} 注入到存在SSTI漏洞的應用中,注意當前配置條目
4. 注入 {{ config.from_object('os') }}。這會向config物件新增os庫中所有大寫變數的屬性
5. 再次檢視 {{ config.items() }} ; os 模組中大寫變數的屬性成功新增屬性cf
0x02 獲取伺服器shell
同步參考文章,這裡面還是主要採用MSF的php馬反彈shell(php有效載荷遠端下載後,進行訪問獲取伺服器shell許可權)進行獲取伺服器許可權
https://medium.com/@david.valles/gaining-shell-using-server-side-template-injection-ssti-81e29bb8e0f90x03 修復意見
針對於不同的模板引擎,該漏洞的修復方法會有所不同,但如果在傳遞給模板指令之前,對使用者輸入進行安全過濾的話,則可以大大減少這類威脅。此外,另一種防禦方法是使用沙箱環境,將危險的指令刪除/禁用,或者對系統環境進行安全加固。