攻防世界Web_python_template_injection

SSTI注入,这里是flask注入,具体教程可以搜B站。
在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。
先来看几个魔术方法:
class 返回类型所属的对象
mro 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
base 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
subclasses 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
init 类的初始化方法
globals 对包含函数全局变量的字典的引用

我们看一下object的子类

复制下来粘到notepad里,找一下有用的函数,我们找到Popen

第238行,所以是__subclasses__()[237]

我们执行一下{{''.class.mro[2].subclasses()[237].init.globals['os'].popen('ls').read()}}可以看到

目录下有fl4g,我们即可读出flag(把ls换成cat fl4g)

posted @ 2020-11-12 18:01  不爱代码的程序员  阅读(114)  评论(0)    收藏  举报