Flask jinja2模板注入思路总结

前言

虽然这个漏洞已经出现很久了,不过偶尔还是能够看到。翻了翻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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180224B0YQW100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券