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模板引擎特点)
-
{{……}}:装载一个变量,模板渲染的时候,会使用传进来的同名参数将这个变量代表的值替换掉
-
{%……%}:装载一个控制语句
-
{#……#}:装载一个注释,模板渲染的时候会忽略这中间的值