Wissen › Server-Side Template Injection (SSTI)
Server-Side Template Injection (SSTI)
Nutzereingabe wird als Template gerendert — oft ein direkter Weg zur Code-Ausführung.
SSTI entsteht, wenn von Nutzern kontrollierte Werte nicht als Daten in ein Template eingesetzt, sondern selbst als Template-Quelle gerendert werden. Die Template-Engine wertet dann eingeschleuste Ausdrücke serverseitig aus — je nach verfügbaren Funktionen bis hin zu Remote Code Execution.
Wie der Angriff funktioniert
- Eine Eingabe wird als Template-Source gesetzt (nicht als Variable übergeben) und gerendert.
- Eingeschleuste Template-Syntax wird ausgewertet — vom harmlosen Umwandeln bis zum Aufruf mächtiger Funktionen.
- Der entscheidende Fehler ist die Verwechslung von 'Daten in ein Template' und 'Daten ALS Template'.
Beispiel
Nutzerwerte gehören als Variable zugewiesen — niemals als Template-Quelle:
// gefährlich: Nutzerwert wird als Template gerendert
$view->setTemplateSource($userInput);
$view->render();
// sicher: Nutzerwert ist nur eine Variable im festen Template
$view->setTemplatePathAndFilename($trustedTemplate);
$view->assign('value', $userInput);
Mögliche Auswirkungen
- Auslesen von Konfiguration/Umgebungsvariablen.
- Je nach verfügbaren ViewHelpern/Funktionen bis zu Remote Code Execution.
- Häufig über scheinbar harmlose Felder (Name, Betreff) ausnutzbar.
Worauf du in TYPO3 achten musst
In TYPO3 ist die Template-Engine Fluid. SSTI entsteht, wenn Code Nutzereingaben als Fluid-Quelle rendert — direkt oder über Hilfsfunktionen. Admin-definierte Templates sind unkritisch; Nutzer-definierte Template-Quellen sind das Problem.
Niemals setTemplateSource() auf Nutzereingabe
StandaloneView/TemplateView mit setTemplateSource($userInput) macht die Eingabe zum Template. Immer ein festes Template per setTemplatePathAndFilename() nutzen und Werte über assign() übergeben.
fluidParseString()/Inline-Rendering mit Vorsicht
Hilfsfunktionen, die Strings als Fluid parsen, dürfen nur auf vertrauenswürdige, admin-kontrollierte Strings angewandt werden — nie auf submitted values.
Konfiguration ist nicht gleich beliebige Eingabe
Dass Redakteure/Integratoren Fluid-Snippets in der Konfiguration hinterlegen dürfen, ist gewollt. Gefährlich wird es, wenn END-Nutzer (FE) Template-Quelle beeinflussen können.
Extensions aktuell halten
SSTI-Lücken traten in verbreiteten Extensions auf, wenn Feldwerte als Template gerendert wurden. Security-Advisories des TYPO3-Teams verfolgen und zeitnah patchen.
Schutzmaßnahmen
- Nutzereingaben ausschließlich als Variablen übergeben, nie als Template-Quelle rendern.
- fixe Template-Dateien statt dynamischer setTemplateSource()-Aufrufe.
- Extensions patchen; Eingabevalidierung als zusätzliche Hürde.
Interaktiv üben
In der Lernplattform kannst du diese Schwachstellenklasse an einer echten, isolierten TYPO3-Instanz nachvollziehen: