1. 程式人生 > 實用技巧 >SSTI( 伺服器模板注入)以及常見利用方式

SSTI( 伺服器模板注入)以及常見利用方式

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-81e29bb8e0f9

0x03 修復意見

針對於不同的模板引擎,該漏洞的修復方法會有所不同,但如果在傳遞給模板指令之前,對使用者輸入進行安全過濾的話,則可以大大減少這類威脅。此外,另一種防禦方法是使用沙箱環境,將危險的指令刪除/禁用,或者對系統環境進行安全加固。

0x04 參考連線

http://www.secbook.info/index.php/archives/51.html https://xz.aliyun.com/t/2637 https://portswigger.net/blog/server-side-template-injection https://nvisium.com/blog/2016/03/11/exploring-ssti-in-flask-jinja2-part-ii.html

轉載請註明:Adminxe's Blog»SSTI( 伺服器模板注入)以及常見利用方式