xctf-shrine

题目简介

一道Flask模板注入题

题目分析

import flask 
import os 
app = flask.Flask(__name__) 
app.config['FLAG'] = os.environ.pop('FLAG') 
@app.route('/') 
def index(): 
	return open(__file__).read() 
@app.route('/shrine/') 
def shrine(shrine): 
	def safe_jinja(s): 
		#过滤了()
		s = s.replace('(', '').replace(')', '') 
		#黑名单设置了config,self
		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)

首先看源代码发现,源码中使用了flask.render_template_string()这个函数,猜测这题是使用ssti漏洞去解的。

有关ssti漏洞的详细内容参考这位师傅写的文章:https://www.cnblogs.com/bmjoker/p/13508538.html

Jinja2是一种面向Python的现代和设计友好的模板语言,它是以Django的模板为模型的

Jinja2是Flask框架的一部分。Jinja2会把模板参数提供的相应的值替换了 {{…}} 块

Jinja2使用 {{name}}结构表示一个变量,它是一种特殊的占位符,告诉模版引擎这个位置的值从渲染模版时使用的数据中获取

本题的主要目标是获取到第四行的os.environ.pop('FLAG')

解题方法

payload:

http://111.200.241.244:58074/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}

url_for()会根据传入的路由器函数名,返回该路由对应的URL,本题绕过限制的方式是使用使用url_for()函数获取全局变量得到config['Flag']进而得到flag

image

参考链接

ssti详解:https://www.cnblogs.com/bmjoker/p/13508538.html

ctf ssti常用payload:https://blog.csdn.net/qq_33020901/article/details/83036927

posted @ 2022-04-10 19:09  墨宸  阅读(23)  评论(0)    收藏  举报