攻防世界-shrine write up

打开靶机,发现源码是没有排序的python代码,CTRL+u 查看源码:

 

可知:引入了flask和os库,render_template_string()函数说明引入了SSTI(详见上一篇easy_tornado1),

@app.route('/shrine/<path:shrine>') 在/shrine/路径下提交参数,

app.config['FLAG'] = os.environ.pop('FLAG') 说明注册了FLAG,而flag可能就在这里面,

 s = s.replace('(', '').replace(')', '') 
blacklist = ['config', 'self']   这两行说明他把(和)都替换成了空格,而且把config跟self加进了黑名单,那么就不能使用config来查看FLAG的内容了,没有过滤可以直接{undefined{config}}查看所有app.config。

return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s 这一行把blacklist里的所有东西遍历为空。

但是pythonflask框架有其他内置函数和·变量:Python中Flask框架的变量和函数 - 简书 (jianshu.com)

用内置函数url_for,构造payload:

/shrine/{{url_for.__globals__}}

图上传不了了,,救命,反正就是会发现一大堆代码,中间有个非常亮眼的 'current_app': <Flask 'app'>。利用url_for()函数查看current_app里的flag:

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

 或者用get_flashed_message函数:

构建payload:

/shrine/{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}

 

 flag:flag{shrine_is_good_ssti}(岂可休,我上传不了图片orz)

拓展:

url_for:

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

get_flashed_message:

这个函数返回之前在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值