前言
虽然这个漏洞已经出现很久了,不过偶尔还是能够看到。翻了翻freebuf上好像只有python2的一些payload,方法也不是很全。我找来找去也走了些弯路,小白们可以参考一下。如果有什么错误,欢迎各位指正。
漏洞简介
漏洞原理可以参考
http://www.freebuf.com/articles/web/98619.html
http://www.freebuf.com/articles/web/98928.html
常见payload
ssti可以用于xss,不过这里不具体介绍; 前面两篇文章给出了几个比较常用的getshell的payload; 我会总结并补充一些。
python2:
也可以通过写jinja2的environment.py执行命令; jinja2的模板会load这个module,而且这个environment.py import了os模块, 所以只要能写这个文件,就可以执行任意命令:
python3:
Go Deeper
环境
这里给出的是vulhub的flask ssti漏洞环境 方便复现
__globals__
其实这些payload的思路大概都是一样的,从python的内置变量出发,通过调用各类型的一些隐藏属性(方法),从而得到我们需要的函数。
其中有一个属性 globals 很有意思,文档里这样解释:
也就是说所有的函数都会有一个__globals__属性,它会以一个dict,返回函数所在模块命名空间中的所有变量。 举个例子:
这段代码输出
可以看到__globals__中会包括引入了的modules;同时每个python脚本都会自动加载 builtins 这个模块,而且这个模块包括了很多强大的built-in 函数,例如eval, exec, open等等。
所以要从内置变量出发找到一个可以达成payload的函数(eval, exec..),只需要随便从一个内置变量调用隐藏属性,找到任意一个函数,然后查看它的__globals__['__builtins __']就可以了,而这个是非常容易的。
start to find a payload
我们都知道python的类有被称为Special method names的方法,这些方法会在特定的时候被调用。而开发者可以通过重载这些函数实现各种简洁又强大的功能。例如class.__init __ 会在一个实例被new()创建的时候自动调用,从而起到构造函数的作用。
而我们的目标只是找到任意一个函数,所以我们只需要去找这些函数就可以了,比如说从字符串开始
其中寻找function的过程可以用一个小脚本解决, 脚本找到被重载过的function,然后组成payload
output
随便选一个payload填上命令
当然这种方法不仅仅适合python3, python2也可以用这个方法,上面那个payload就是两个版本都可以使用的。
总结
利用flask的ssti漏洞,可以通过python的内置变量得到功能强大的built-in functions, 从而执行各种命令。而python函数自带的__globals__属性使得寻找built-in functions的过程变得更加简单,不受版本约束。
文章转自FreeBuf.com
领取专属 10元无门槛券
私享最新 技术干货