0 Minuten lezen
0 Min
5 dec 2022

We zijn blij je weer welkom te heten op onze blogserie waarin we inzicht geven in de meest interessante en nuttige inzichten over top gerapporteerde kwetsbaarheden. In deze blog zullen we het hebben over de kwetsbaarheid van Template Injectie, en bespreken waar de kwetsbaarheid kan worden gevonden, welke types van deze kwetsbaarheid er zijn, wat de impact, ernst en manieren zijn waarop kwetsbaarheid kan worden voorkomen en verholpen.

Wat is template injectie?

Template injectie is een kwetsbaarheid in webapplicaties waarbij invoer als code wordt geëvalueerd door een sjabloonengine. 

Sjabloon engines worden in webapplicaties gebruikt om automatisch webpagina's te genereren, zoals de resultaten van een zoekopdracht. Dit hergebruikt statische webpagina-elementen terwijl dynamische elementen worden gedefinieerd op basis van webverzoekparameters. 

Bijvoorbeeld, een profielinstellingenpagina van een webapplicatie kan een sjabloon gebruiken waarin de informatie van de gebruikers dynamisch wordt ingevuld. De pagina zal meestal hetzelfde zijn voor iedereen, maar specifieke gebruikersinformatie zal dynamisch worden ingevuld op basis van de ingelogde gebruiker.

Om een template injectie kwetsbaarheid te vinden, zal een aanvaller proberen te zien hoe een invoerveld reageert op sjabloonuitdrukkingen; als de code wordt geëvalueerd, zal de output anders zijn dan wat de aanvaller in het veld heeft ingevoerd. Bij het invoeren van {{7*’7’}} reageren Twig en Jinja2 anders. In Jinja2 resulteert dit in 7777777 en in Twig is het resultaat 49.

Als de respons ergens op de pagina wordt gereflecteerd, kan de aanvaller testen of template injectie mogelijk is en vaak bepalen welke sjabloonengine wordt gebruikt. Het volgende voorbeeld is een eenvoudige pagina die de informatie van een gebruiker weergeeft.

Door verschillende payloads in te voeren, kan worden vastgesteld dat de pagina kwetsbaar is voor template injectie. Het kan ook worden gedetecteerd dat de gebruikte sjabloonengine Jinja2 is op de manier waarop het reageert op de {{7*’7’}} payload.

Er zijn twee verschillende soorten template injectie, serverzijde en clientzijde. Bij clientzijde template injectie (CSTI) kan een aanvaller code uitvoeren in de browser. Template injectie met serverzijde (SSTI) is wanneer de code op de server wordt uitgevoerd.

Template injectie kwetsbaarheden zijn aanwezig in, maar niet beperkt tot de volgende sjabloon engines:

  • PHP: Smarty, Twig.

  • Java: Velocity, Freemaker.

  • Python: Jinja2, Mako, Tornado.

Impact

Serverzijde

Op afstand code uitvoeren
Wanneer een template injectie code uitvoert aan serverzijde, kan het mogelijk zijn om op afstand code uit te voeren, afhankelijk van de gebruikte sjabloonengine. Een andere mogelijke impact van SSTI is het ophalen van bestanden van de server met lokale bestandinclusie.

Informatie-inbreuk
Een tegenstander kan template injectie gebruiken om gevoelige informatie te verkrijgen, bijvoorbeeld door de inhoud van variabelen te lezen of commando's in te voeren die informatie onthullen. Door {{config.items()}} in de voorbeeldpagina in te voegen, kunnen de configuratiegegevens worden weergegeven.

Clientzijde

Cross-site scripting
Wanneer code wordt uitgevoerd met een kwetsbaarheid voor template injectie, kan het mogelijk zijn om JavaScript in te voegen om een XSS-kwetsbaarheid te creëren. Dit is mogelijk met zowel serverzijde als clientzijde template injectie. Dit geeft een template injectie kwetsbaarheid dezelfde impact als XSS kan hebben. Bijvoorbeeld:

  • Stelen van sessiecookies.

  • Stelen van inloggegevens.

  • Toegang krijgen tot gevoelige informatie.

Ernst

De ernst van een template injectie kwetsbaarheid hangt af van de impact. SSTI zal een hogere impact hebben dan CSTI. 

Elke kwetsbaarheid die op afstand code-uitvoering kan bereiken, zal een kritieke ernst hebben.

Een voorbeeld van een template injectie met hoge of gemiddelde ernst is wanneer de template injectie kan worden verhoogd naar XSS. Gereflecteerde XSS heeft een gemiddelde ernst en opgeslagen XSS heeft vaak een hoge ernst.

Wanneer clientzijde template injectie aanwezig is, maar er geen informatie kan worden opgehaald en het kan niet worden verhoogd naar XSS, is de ernst laag.

Preventie

Om template injectie te voorkomen, kan invoer worden gefilterd om te voorkomen dat deze als code wordt weergegeven. De volgende tekens worden vaak gebruikt bij het testen op template injectie: ${{<%[%’”}}%\. Het is ook mogelijk om invoer op de toegestane lijst te zetten en alleen verwachte invoer toe te staan.

Mildering

Als het niet mogelijk is om invoer te filteren, kun je soms de sjabloon sandboxen om de acties te beperken die mogelijk zijn bij het injecteren van code met template injectie.
Omdat template injectie een bekend probleem is in sjabloon engines, bieden veel sandboxing mogelijkheden aan. Bijvoorbeeld in Twig, een PHP-sjabloon engine, kan de sandbox-tag worden gebruikt voor een ingesloten sjabloon.
Voorbeeld: 

{% sandbox %}
{% include 'user.html' %}
{% endsandbox %}

We hopen dat je de informatie nuttig vindt en geniet van de blog! Als je dat deed, blijf dan kijken naar de volgende blog over top gerapporteerde kwetsbaarheden!

Meer informatie