Server Side Template Injection

Vandaag wil ik weer een keer een technisch wonder beschrijven, namelijk ‘Server Side Template Injection’.

Inleiding

Server side template injection is een kwetsbaarheid dat te maken heeft met templates, veel websites maken gebruik van templates zoals (Twig en FreeMaker). Een server side template injectie ontstaat wanneer gebruikersinvoer word ingebed in een template op een onveilige manier. Als voorbeeld zie onderstaande code:

$output = $twig->render("Dear {first_name},", array("first_name" => $user.first_name) ); 

Bovenstaande code toont de first_name variable op de pagina, deze variable wordt gepakt op het eind in de code namelijk bij ($user.first_name). Bovenstaande code is de juiste implementatie, nu kijken wij naar de volgende stuk code:

$output = $twig->render($_GET['custom_email'],  array("first_name" => $user.first_name) );

Zoals hier te zien is word er vanuit de GET request de email gepakt en meegegeven. Dit kan een probleem zijn indien de aanvaller vreemde input meegeeft, input dat de applicatie niet verwacht. Een aanvaller kan namelijk als input meegeven:

{{9 x 9}}

Waarna de applicatie het getal 81 als email meegeeft wat natuurlijk geen email is.

Methode

In een artikel dat ik aan het lezen was werd er gebruik gemaakt van een bepaalde methodiek voor het vinden van een server side template injection. Deze zal ik nu kort beschrijven en toelichten.

Detect -> Identify -> Exploit -> Read -> Explore -> Attack

Detect

De meeste template talen ondersteunen gebruikersinvoer in de vorm van tekst. Een gebruiker kan direct tekst invoeren wat erna word getoond op de web applicatie. Hieronder een paar voorbeelden:

smarty=Hello {user.name}
Hello user1
 
freemarker=Hello ${username}
Hello newuser 

Vaak leidt dit tot XSS en wordt server side template injectie over het hoofd gezien. Een aanvaller kan het volgende proberen:

{{ 7 x 7 }}

Indien het getal 49 eruit komt of ergens wordt getoond dan is er inderdaad Server side template injection aanwezig.

Identify

Nadat de kwetsbaarheid is gevonden is de volgende stap om erachter te komen welke template engine er wordt gebruikt, dit kan soms worden gevonden door de kwetsbaarheid uit te buiten. Soms komt er een error bericht met daarin al de versie en welke engine er wordt gebruikt. Indien error berichten uit staan dan werkt dit natuurlijk niet.

In onderstaande afbeelding (afkomstig van de bron die onderaan het artikel wordt vermeld) wordt het schematisch gepresenteerd:

Exploit

Nadat de template injectie is gevonden en er gevonden is welke engine er gebruikt wordt is het belangrijk dat de documentatie wordt gelezen. Er is namelijk al eerder een zero-day kwetsbaarheid gevonden door puur de documentatie te lezen!. Sleutel gebieden zijn:

  • Basis syntax
  • Lijst van plugins en extensies
  • Functies, filters en variables

Explore

Indien na het lezen van documentatie niks is gevonden, is het een kwestie van trial en error. Voornamelijk houdt dit in dat de omgeving wordt bekeken en overal wordt op geklikt om te kijken of er bepaalde invoervelden tevoorschijn komen of dat er parameters worden meegegeven die aangepast kunnen worden.

Attack

Op dit moment zou jij een goed idee moeten hebben hoe je de applicatie kan aanvallen en testen. Nu start je met de algemene audit technieken en bekijk je de applicatie op vreemde functionaliteiten.

Bronnen

  • https://portswigger.net/research/server-side-template-injection
Please share and spread
NederlandsEnglish