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博客