首页 > 其他分享 >[WesternCTF2018]shrine(Jinja2模板注入)

[WesternCTF2018]shrine(Jinja2模板注入)

时间:2024-07-19 13:52:02浏览次数:6  
标签:__ app WesternCTF2018 current FLAG shrine Jinja2 config

首先判断出是Jinja2模板注入
判断方法 https://www.cnblogs.com/dghh/p/18307622

import flask
import os

# 创建一个 Flask 应用实例
app = flask.Flask(__name__)

# 从环境变量中读取 'FLAG' 并设置到应用配置中
app.config['FLAG'] = os.environ.pop('FLAG')

# 定义根路径('/')的路由
@app.route('/')
def index():
    # 返回当前脚本的内容
    return open(__file__).read()

# 定义 'shrine' 路径的路由
@app.route('/shrine/<path:shrine>')
def shrine(shrine):
    
    # 定义一个安全处理 Jinja 模板的函数
    def safe_jinja(s):
        # 移除字符串中的圆括号,以减少攻击面的复杂度
        s = s.replace('(', '').replace(')', '')
        
        # 定义一个黑名单,包含 'config' 和 'self'
        blacklist = ['config', 'self']
        
        # 为黑名单中的每个词添加置空变量的 Jinja 语句
        # 并在字符串前添加这些语句
        return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

    # 渲染经过安全处理后的 Jinja 模板字符串
    return flask.render_template_string(safe_jinja(shrine))

# 启动 Flask 应用
if __name__ == '__main__':
    app.run(debug=True)

经过对代码的分析我们知道注册了一个名为FLAG的config,这应该就是flag,如果没有过滤可以直接{{config}}即可查看所有app.config内容,但是这题设了黑名单[‘config’,‘self’]并且过滤了括号;
这个过滤并不是把‘config’,‘self’删除而是把这两个变量置为空


在python里,有许多内置函数,其中有一个 url_for ,其作用是给指定的函数构造 URL。配合globals(),该函数会以字典类型返回当前位置的全部全局变量。这样也可以实现查看的效果
https://blog.csdn.net/Drifter_Galaxy/article/details/116106315
先查看当前位置的全部全局变量

shrine/{{url_for.__globals__}} 

image

current_app': <Flask 'app'>这里的current就是指的当前的app,这样我们只需要能查看到这个的config就可以看到flag了
方法如下

{% set config=None %} 和 {% set self=None %} 将 config 和 self 变量设置为 None,其目的是防止模板注入攻击中利用这些变量来访问敏感信息。
可以通过属性访问的方式绕过这种防御。例如,使用 url_for.globals['current_app'].config['FLAG'] 这样的表达式:
config:{{url_for.__globals__['current_app'].config['FLAG']}}
这里的 config 是一个路径而不是直接的变量引用。具体来说,这个表达式:
url_for: 通常在 Flask 应用中用于生成 URL。
globals: Flask 提供的全局对象。
current_app: 代表当前应用实例。
config: 当前应用的配置对象。
['FLAG']: 从配置对象中访问名为 FLAG 的配置项。
在这个表达式中,config 只是路径的一部分,而不是直接的变量引用。因此,即使您在模板中将 config 变量设置为 None,也不会影响这个路径的解析,因为这里的 config 并不是模板中的 config 变量,而是 current_app 对象的属性。
{{url_for.__globals__['current_app'].config['FLAG']}}

当然不用url_for也行
可以用get_flashed_messages

{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}

标签:__,app,WesternCTF2018,current,FLAG,shrine,Jinja2,config
From: https://www.cnblogs.com/dghh/p/18311335

相关文章

  • django使用jinja2模板
    1.使用Django默认模板TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[BASE_DIR/'templates'],#使用路径表达式'APP_DIRS':True,'OPTIO......
  • 攻防世界 shrine
    题目打开就是源码importflaskimportosapp=flask.Flask(__name__)app.config['FLAG']=os.environ.pop('FLAG')@app.route('/')defindex():returnopen(__file__).read()@app.route('/shrine/<path:shrine>')......
  • HTML相关知识(二)- Jinja2
    1.for循环{%foriteminmy_list%}是Jinja2模板引擎中的语法,用于在模板中进行循环操作。这里的`my_list`是一个列表,`item`是列表中的每一个元素。在Flaskweb框架中,我们可以在Python代码中定义一个列表,然后将这个列表传递给模板。在模板中,我们可以使用`{%for%}`......
  • 【 攻防实操系列+漏洞复现 】-- Jinja2 SSTI模板注入
    框架:python---Flask描述:Flask是一个使用Python编写的轻量级Web应用框架。其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2漏洞复现:Jinja2SSTI模板注入使用vulhub靶场,启动环境先进入容器看一下web服务的代码,得出参数值为name,且可控判断是否存在ssti漏洞,输入:?name={{1*9}},......
  • Linux架构30 Ansible jinja2模板, jinja2模板配置负载均衡, keepalived
    Ansiblejinja2模板一、Ansiblejinja2模板概述#什么是jinja2模板jinja2是Python的全功能模板引擎#Jinja2与Ansible啥关系Ansible通常会使用jinja2模板来修改被管理主机的配置文件等...在saltstack中同样会使用jinja2如果在100台主机上安装服务,每台服务的监听端口都不一样......
  • [WesternCTF2018]shrine
    [WesternCTF2018]shrine代码整理后得到importflask<!--more-->importosapp=flask.Flask(__name__)app.config['FLAG']=os.environ.pop('FLAG')@app.route('/')defindex():returnopen(__file__).read()@app.route(......
  • FLASK学习记录-Jinja2模块引擎
    Flask中引入了jinja2模板引擎,可以显示动态数据、数据过滤、语句控制、模板继承和引用等。实战实例app.pyfromflaskimportFlask,render_templateapp=Flask(__name__)@app.route('/')defindex():LibraryName="NationalLibrary"visitor={"name":"J......
  • jinja2 通过Template. make_module 进行动态macro 创建以及macro 方法调用
    实际属于一个小技巧,可以实现比较灵活的jinja2扩展,是从dbt对于macro的处理部分学习到的参考代码app.pyfromjinja2importEnvironment env=Environment() #定义macro的内容macro_template="""{%macromydemo(name,age)-%}{{name......
  • jinja2模块模板语法 django基础
    jinja2去数据库中获取数据,传递给HTML页面,借助于模板语法发送给浏览器还能帮你简单方便的操作字典去后端获取数据库中数据展示到前端页面importpymysqldefget_user(env):去数据库中获取数据,传递给HTML页面,借助于模板语法发送给浏览器还能帮你简单方便的操作字典......
  • Flask 使用Jinja2模板引擎
    Jinja2,由Flask框架的创作者开发,是一款功能丰富的模板引擎,以其完整的Unicode支持、灵活性、高效性和安全性而备受推崇。最初受Django模板引擎启发,Jinja2为Flask提供了强大的模板支持,后来也成为其他项目的首选。在本文中,我们将深入探讨Jinja2的特性、语法以及如何在Flask应用中使用......