1. 题目描述
打开链接,发现是一串源码:
从源码中不难发现关键词是flask.render_template_string(safe_jinja(shrine)) ,这个函数说明了题目的关键点在于模板渲染,即存在模板注入
2. 思路分析
从代码中不难发现,即使存在模板渲染的操作,但是进行了一些安全防护措施
2.1 将(和)替换成了空字符
2.2 将关键字config和self替换为空字符串,不能直接传入这两个字符串
我们的flag在app.config[‘FLAG’] = os.environ.pop(‘FLAG’)中
因为这次的flag在app.config里面,和之前直接在设备上执行命令还不一样,这里会利用到url_for或者get_flashed_messages这两个内置函数(参考https://blog.csdn.net/qq_45290991/article/details/120117615)
在Flask框架中,url_for函数是一个全局函数,它用于生成指定视图函数的URL。它位于Flask的全局命名空间中。
通过访问url_for.__globals__,您可以获取到url_for函数所在的全局命名空间,其中存储了定义的全局变量和其他函数,利用这一点可以获取到flag。(get_flashed_messages同理)
3. 解题过程
3.1 访问http://61.147.171.105:63693/shrine/shrine={{url_for.__globals__}},发现存在一个current_app能够利用
3.2 因为flag在app.config中,直接访问http://61.147.171.105:63693/shrine/shrine={{url_for.__globals__.current_app.config}}就可以获取到flag了
最终的flag为flag{shrine_is_good_ssti}
总结:本体关键是SSTI利用函数的使用,算是了解了SSTI的一种新的利用点和新的利用函数,也算是收获满满吧