攻防世界web题-shrine


打开页面,给出了代码,整理代码

import os
import flask

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

@app.route('/')
def index():
    return open(__file__).read()
#显示源代码
@app.route('/shrine/')
#在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)

代码审计,目标是查看app.config[‘FLAG’] 。并对传入的参数进行了过滤。
查看了别的大佬写的题解,这里是SSTI模板类注入,之前没接触过。简单看了以下,没有特别深入,不过大概就是这样(没具体搞懂)

模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程
服务端把用户输入的内容渲染成模板就可能造成SSTI(Server-Side Template Injection)
模板渲染接受的参数需要用两个大括号括起来{{}},所以我们需要在大括号内
构造参数形成注入

首先看是否存在注入{{1+1}}
在这里插入图片描述
存在,那么我们需要构建payload来,查看app.config[‘FLAG’]。直接config是不行的,被黑名单了,我们需要通过别的函数来查看全局变量来获取当前的app因为我们的目标是app.config[‘FLAG’] 。如python的内置函数url_for或者get_flashed_messages,大佬给出的解释是,利用python对象之间的引用关系来调用被禁用的函数对象。
首先注入url_for.globals
在这里插入图片描述
我们可以看到当前的app是current_app。继续注入当前app的config:
url_for.globals[‘current_app’].config
在这里插入图片描述
成功找到flag!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值