SSTI模块注入之Flask框架

2022_11_15

参考资料:

讲解:

(容易理解) https://www.bilibili.com/video/BV17V411i7hA/

(讲的详细) https://www.bilibili.com/video/BV1Pz4y1r7yz/

利用:

从零学习flask模板注入 - FreeBuf网络安全行业门户

实例:

攻防世界

wp:

攻防世界-Web_python_template_injection详解_Mr H的博客-CSDN博客

自己的理解

原理:通过继承关系,找到要使用的模块。

产生原因:有用户可改变的变量,此变量有回显,二次渲染(因为传入的是一个由{{}}包裹的,所以需要再渲染一下。要不然就会显示原样)

  • 二次渲染:得到变量值后先拼接到语句中,再return返回语句。重点在"<p>

    "中间的值
from flask import *
app=Flask(__name__)
@app.route('/')
def index():
    str = request.args.get('s')
    # 重点在下一行
    html = "<h1>Welcome</h1></br><p>%s</p>"%(str)
    return render_template_string(html)
if __name__ = "__main__":
    app.run()
  • 无二次渲染:在return返回语句中返回页面和变量的值。重点在"<p>

    "中间的值
from flask import *
app=Flask(__name__)
@app.route('/')
def index():
    str = request.args.get('s')
    # 重点在下一行
    html = "<h1>Welcome</h1></br><p>{{str}}</p>"
    return render_template_string(html, str=str)
if __name__ = "__main__":
    app.run()

重点

1.几个魔术方法

__dict__  保存类实例或对象实例的属性变量键值对字典
__class__  返回类型所属的对象
__mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
__bases__  返回该对象所继承的类型列表

__subclasses__()   以列表的形式返回对象的子类。每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__  类的初始化方法
__globals__  函数会以字典类型返回当前位置的全部全局变量,与 func_globals 等价

2.Flask框架(JinJa模板引擎特点)

  • {{……}}:装载一个变量,模板渲染的时候,会使用传进来的同名参数将这个变量代表的值替换掉

  • {%……%}:装载一个控制语句

  • {#……#}:装载一个注释,模板渲染的时候会忽略这中间的值

posted @ 2022-11-15 18:14  konglong  阅读(21)  评论(0)    收藏  举报