116,【8】 攻防世界 web shrine(jinja2)

进入靶场

看开头像python代码

# 从 flask 库中导入 Flask 类,用于创建 Flask 应用实例
from flask import Flask
# 导入 os 模块,用于与操作系统进行交互,这里主要用于获取环境变量
import os

# 创建一个 Flask 应用实例,__name__ 是 Python 中的一个特殊变量,表示当前模块的名称
app = Flask(__name__)

# 从环境变量中获取名为 'FLAG' 的值,并将其设置为应用配置中的 'FLAG' 项
# os.environ.pop('FLAG') 会从环境变量中移除 'FLAG' 并返回其值
# 这样做可能是为了保证敏感信息(如 FLAG)不会一直存在于环境变量中
app.config['FLAG'] = os.environ.pop('FLAG')

# 使用装饰器 @app.route 定义一个路由,当用户访问根路径 '/' 时,会触发下面的函数
@app.route('/')
def index():
    # 打开当前文件(即这个 Python 脚本文件),并读取其内容
    # __file__ 是 Python 中的一个特殊变量,表示当前文件的路径
    # open(__file__).read() 会返回当前文件的所有文本内容
    return open(__file__).read()

# 使用装饰器 @app.route 定义一个路由,当用户访问 '/shrine/' 路径时,会触发下面的函数
# 这里的 <shrine> 是一个动态路由参数,用户请求的具体内容会作为参数传递给函数
@app.route('/shrine/<shrine>')
def shrine(shrine):
    # 定义一个内部函数 safe_jinja,用于对用户输入的内容进行过滤和处理
    def safe_jinja(s):
        # 将用户输入的内容中的左括号 '(' 和右括号 ')' 替换为空字符串,即移除括号
        s = s.replace('(', '').replace(')', '')
        # 定义一个黑名单列表,包含不允许在用户输入中出现的关键字
        blacklist = ['config', 'self']
        # 遍历黑名单中的每个关键字,生成对应的 Jinja2 模板语句
        # '{
  
  {% set {}=None%}}'.format(c) 会将关键字设置为 None,避免用户利用这些关键字进行恶意操作
        # ''.join(...) 将生成的语句拼接成一个字符串,并添加到用户输入内容的前面
        return ''.join(['{
  
  {% set {}=None%}}'.format(c) for c in blacklist]) + s
    # 调用 safe_jinja 函数对用户输入的 shrine 参数进行处理
    # 然后使用 flask.render_template_string 函数将处理后的内容作为 Jinja2 模板进行渲染并返回
    return flask.render_template_string(safe_jinja(shrine))

# 当这个脚本作为主程序运行时,执行下面的代码
if __name__ == '__main__':
    # 启动 Flask 应用,开启调试模式
    # 调试模式下,当代码发生更改时,应用会自动重启,并且会显示详细的错误信息
    app.run(debug=True)

 过滤了config和self

都是flask里会出现的东西

还有get_flashed_messages 函数可以尝试,它是 Flask 框架中的一个非常实用的函数,主要用于获取之前通过 flash 函数存储的消息。这些信息通常只需要显示一次,在用户刷新页面或者进行下一次请求后就不再需要显示

 

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

1. url_for

 

url_for 是 Flask 框架中一个非常有用的函数,用于根据视图函数的名称生成对应的 URL。在 Python 里,函数也是对象,每个函数都有自己的属性,__globals__ 就是其中之一。

2. __globals__

 

__globals__ 是函数对象的一个属性,它指向函数所在的全局命名空间。通过这个属性,可以访问到函数所在模块的全局变量。

3. ['current_app']

 

current_app 是 Flask 中的一个全局代理对象,它代表当前正在运行的 Flask 应用实例。借助 url_for 函数的 __globals__ 属性,可以获取到这个全局代理对象。

4. .config

 

config 是 Flask 应用实例的一个属性,它是一个字典,用于存储应用的各种配置信息,像数据库连接字符串、密钥、调试模式开关等。

5. ['FLAG']

 

['FLAG'] 表示从 config 字典中获取键为 FLAG 的值。

 

 

笔记 

ssti是一个新知识点

Flask框架漏洞:SSTI_flask ssti-优快云博客

SSTI漏洞详解-优快云博客

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值