5.6 Server-Side Template Injection (SSTI)
SSTI
Zranitelnost typu Server-Side Template Injection (SSTI) umožňuje útočníkovi oklamat webový server a využít nativní syntaxe (značek a syntaxe pro výrazy) určitého šablonovacího jazyka tak, že do šablony (template) vloží vlastní škodlivý payload, který je následně přímo vykonán enginem pro zpracování šablon na straně serveru.
Nástroje pro šablonování (například systémy Smarty, Twig pro PHP, Jinja2 pro Python, nebo Freemarker pro Javu) mají za úkol jednoduše vložit a obalit proměnné do statické HTML kostry. Fatální problém vznikne tehdy, pokud vývojář vezme uživatelem dodaný vstup a nespojí ho do vygenerované šablony jen jako čistý text, ale jako text k dalšímu zpracování samotným kompilátorem šablony.
Jak rozpoznat SSTI (Ověření enginu)
Útočník se zpravidla snaží vstřikovat elementární matematické výpočty v hranatých či jiných závorkách charakteristických pro rozličné šablonovací jazyky. Pokud se payload provedl a místo vzorce se mu v odpovědi objeví vyčíslený výsledek (například "49"), prokáže tím zranitelnost SSTI a podle odpovídající syntaxe pak pozná i typ enginu:
{{ 7*7 }}(Twig, Jinja2, atd.)${ 7*7 }(Mako, EL)<%= 7*7 %>(ERB)
V případě, že je aplikace zranitelná vůči SSTI, útočníkovi často nic nebrání ve vykonání vzdáleného systémového kódu (Remote Code Execution - RCE), což obvykle povede k plnému kompromitování aplikace nebo celého serveru (například pomocí vloženého kódu typu {% system("ls /") %} apod.).
Obrana: Použití logic-less enginů (Mustache)
Zásadní metodou obrany je nikdy nekonkatenovat uživatelský text přímo s obsahem samotné definice šablony (vždy používat uživatelské hodnoty pouze jako data plnící předem připravená místa šablony). Pro maximální bezpečnost se doporučuje používat enginy označované jako "logic-less" (bez logiky), jejichž příkladem je engine Mustache.
- Mustache z principu nedovoluje spouštět žádný komplexní nebo systémový kód a nevyhodnocuje funkce zevnitř těla šablony. Všechny výrazy vnímá jen a pouze jako plně obyčejný text.
- Další podstatnou výhodou Mustache enginu je, že defaultně provádí automatický HTML escape (unikání) (
{{ promenna }}překlopí nebezpečné značky jako<a>na entity). Zabraňuje to primárně XSS. Až když programátor explicitně zadá trojité závorky{{{ promenna }}}, vyhne se tomuto unikání.