当前位置: 首页 > article >正文

116,【8】 攻防世界 web shrine

进入靶场

看开头像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-CSDN博客

SSTI漏洞详解-CSDN博客 


http://www.kler.cn/a/534795.html

相关文章:

  • 在 Vue Router 中,params和query的区别?
  • Python爬虫-如何正确解决起点中文网的无限debugger
  • 开源AI智能名片2 + 1链动模式S2B2C商城小程序:内容价值创造与传播新引擎
  • 基于HTML生成网页有什么优势
  • 机器学习--2.多元线性回归
  • 自研有限元软件与ANSYS精度对比-Bar3D2Node三维杆单元模型-央视大裤衩实例
  • Anaconda 下个人环境的快速安装指南:支持 GPU 运算的 PyTorch 环境
  • 清除el-table选中状态 clearSelection
  • 春晚「宇树科技」人形机器人H1技术浅析!
  • M系列/Mac安装配置Node.js全栈开发环境(nvm+npm+yarn)
  • 脚本批量重启openstack虚拟机并加上启动编号、脚本批量验证openstack虚拟机状态并加上编号
  • Vuex 解析:从 Vue 2 到 Vue 3 的演变与最佳实践
  • Gemini 2.0 全面开放,AI 进入新纪元!
  • deepseek r1 完全本地部署实战教程
  • [paddle] 矩阵的分解
  • Python——Unicode 编码 或 解码 工具(GUI打包版)
  • 禅道社区版项目管理软件部署(记录篇)
  • System类
  • 联想拯救者开机进入bios
  • 2025年前端面试准备html篇
  • @DeclareParents
  • 如何借助DeepSeek、ChatGPT等AI模型构建自己的量化交易策略?
  • maven详细讲解
  • 【Leetcode刷题记录】90. 子集 II
  • .netframework升级为.net8以后元组数据返回格式变成了 [{}]
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_vslprintf 函数