攻防世界-shrine write up

攻防世界-shrine write up,第1张

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

 

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

@app.route('/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': 。利用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() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。



 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/790647.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存