Template-Engines werden in Webanwendungen häufig verwendet, um HTML und Daten zu kombinieren und Anzeigen zu generieren. Beispielsweise werden Template-Engines im Backend verwendet, um Benutzernamen, Beitragsinhalte usw. in HTML einzubetten.
Benutzereingaben direkt in eine solche Vorlagenverarbeitung , kann die gesamte Vorlagensyntax ausgewertet werden. Diese Sicherheitslücke wird als „SSTI (Server-Side Template Injection)“ bezeichnet.
Tritt ein SSTI auf, besteht je nach Typ der Template-Engine das Risiko, dass es zu internen Variablenzugriffen oder im schlimmsten Fall zur Ausführung beliebiger Betriebssystembefehle (RCE) kommt. Insbesondere in Python-basierten Systemen Jinja2
und Mako
mit ihrer anfälligen Implementierung ein bequemes Einfallstor für Angreifer darstellen.
Mako
das Thema dieser Überprüfung , ist eine der in Python häufig verwendeten Template-Engines, aber besteht auch die Gefahr, dass Benutzereingaben versehentlich direkt eingebettet werden
Wir werden uns anhand eines konkreten Beispiels ansehen, wie diese Sicherheitslücke in einer realen Anwendung ausgenutzt werden kann.
📹: Wie es in der Praxis funktioniert, könnt ihr euch auch auf YouTube anschauen!
- Das klare Tippgefühl, das einzigartig für das kapazitive berührungslose System ist!
- Das erste drahtlos kompatible Gerät von REALFORCE! Auch mit Kabelverbindung erhältlich!
- Im Gegensatz zum HHKB weist das japanische Tastaturlayout keine Macken auf und ist für jeden einfach zu verwenden!
- Ausgestattet mit einem Daumenrad ist horizontales Scrollen ganz einfach!
- Es verfügt außerdem über eine hervorragende Geräuschreduzierung, wodurch es leise und komfortabel ist!
- Das Scrollen kann zwischen Hochgeschwindigkeitsmodus und Ratschenmodus umgeschaltet werden!
Über HackTheBox
Dieses Mal verwenden wir tatsächlich HackTheBox (HTB), um Schwachstellen zu überprüfen.
HackTheBox ist eine praxisorientierte CTF-Plattform, auf der Teilnehmer in verschiedenen Sicherheitsbereichen wie Webanwendungen, Servern und Netzwerken üben können.
Das Besondere daran: Die Teilnehmer können lernen, indem sie tatsächlich auf die anzugreifenden Maschinen und Anwendungen zugreifen und selbst Hand anlegen.
ist eine der Challenge-Kategorien , die zuvor auf HackTheBox angeboten wurden und derzeit nur für Benutzer mit einem VIP-Plan oder höher
Es gibt auch Maschinen und Herausforderungen in verschiedenen Kategorien, darunter Web, Reversing, Pwn und Forensik, sodass Sie sie auf einem für Sie geeigneten Niveau angehen können.
Wenn Sie Ihre Fähigkeiten mit HackTheBox ernsthaft verbessern möchten, melden Sie sich unbedingt den VIP-Plan und nutzen Sie alle Vorteile der bisherigen Maschinen und Herausforderungen.
👉 Besuchen Sie hier die offizielle HackTheBox-Website
👉 Für detaillierte Informationen zur Registrierung für HackTheBox und den Unterschieden zwischen den Plänen klicken Sie bitte hier.

Zusammenfassung der Herausforderung: Spookifier
Die Herausforderung, der wir uns dieses Mal gestellt haben, „ Spookifier ist in der Web-Kategorie von HackTheBox hat den SEHR EINFACH
Oberflächlich betrachtet ist die Anwendung sehr simpel: ein Webdienst, der Text bei der Eingabe einfach konvertiert und in verschiedenen Schriftarten anzeigt. Auf den ersten Blick scheint sie keine Sicherheitslücken zu haben.
Allerdings verwendete die Anwendung die Python-Template-Engine „Mako“ und die vom Benutzer eingegebene Zeichenfolge wurde direkt innerhalb des Templates ausgewertet.
Dieser Konstruktionsfehler kann zu Server-Side Template Injection (SSTI) und letztendlich zur willkürlichen Befehlsausführung (RCE) führen
👉 https://app.hackthebox.com/challenges/Spookifier
Herausforderungspunkte
- Verwendete Technologien: Python, Flask, Mako
- Bemerkenswertes Verhalten: Eingaben werden in mehreren Schriftarten angezeigt
- Angriffsvektor: Nicht bereinigte Eingabe in Vorlage → SSTI
- Ziel: Flags aus
/flag.txt
Auf diese Weise verbirgt sich hinter der Funktionalität, die an der Oberfläche sicher erscheint, eine Schwäche im Prozess der Vorlagenbewertung , und die Struktur ermöglicht es Ihnen, ein typisches „Muster von SSTI zu RCE“ zu erleben.
Hacking in der Praxis: Von SSTI bis RCE
Von hier aus werden wir mit der App herumspielen und nach Schlupflöchern suchen.
Bei unsachgemäßem Umgang mit der Vorlage könnte sie zum Angriffspunkt werden.
Wir werden prüfen, ob SSTI gültig ist und letztendlich RCE anstreben.
Scouting 1: Erstmal die App ausprobieren
Greifen Sie zunächst auf die Zielanwendung zu und prüfen Sie, welche Funktionen sie hat und welche Eingaben sie akzeptiert
Der Bildschirm verfügt über ein einfaches Eingabeformular und scheint nur die Funktion „Text eingeben, in einen dekorierten Schriftstil konvertieren und ausgeben“ zu haben.
Das Erscheinungsbild und die Struktur sind sehr einfach, ohne Authentifizierungsfunktionen oder komplexes Routing.

Wichtig hierbei ist die vom Benutzer eingegebene Zeichenfolge auf irgendeine Weise verarbeitet und dann als Vorlage angezeigt wird .
Es scheint, dass die Zeichenfolge irgendwo im Prozess der „Anzeige in mehreren Schriftarten“ von einer Vorlagen-Engine manipuliert wird.

Ich habe die Anforderungsinformationen mit Devtools überprüft, aber es scheinen dort keine aussagekräftigen Informationen zu sein.

Aufklärung 2: Identifizierung der Template-Engine aus dem Quellcode
Bei der Untersuchung von Schwachstellen in tatsächlichen Webanwendungen ist der Zugriff auf den Quellcode selten möglich.
Penetrationstests und Bug-Bounty-Tests basieren auf Black-Box-Tests (Beobachtung des Verhaltens von außen).
Daher prüfen wir in der Regel mit dem folgenden Prozess, ob eine Template-Engine vorhanden ist und ob Schwachstellen vorliegen.
- Probieren Sie im Textfeld gängige Vorlagensyntax , z. B.
${7*7}
,{{7*7}}
,<%= 7*7 %>
- das Ergebnis
49
oder7*7
anzeigt - Etwaige ungewöhnliche Vorlagenfehler oder Auswertungsergebnisse können Hinweise auf die Vorlagen-Engine geben.
- anhand der Ausgabe und des Verhaltens auf die verwendete Vorlagen-Engine (Mako, Jinja2, Twig usw.).
Diesmal wurde der Quellcode als besondere Herausforderung bereitgestellt, um etwas über Schwachstellen zu erfahren.
So konnte ich die interne Struktur direkt untersuchen und schnell verstehen, wie die Vorlagenverarbeitung funktioniert.
Im bereitgestellten Quellcode finden Sie die folgende Beschreibung zur Vorlagendarstellung:
von mako.template importiere Template ... returniere Template(Ergebnis).render()
Dieser Satz zeigt deutlich, dass
Mako als Template-Engine verwendet wird Mako ist eine Python-Template-Engine und die ${...}-
Syntax direkt als Python-Ausdruck ausgewertet wird, was ein Risiko von SSTI (Server-Side Template Injection)
versucht, ${}
in der Benutzereingabe
Nachdem wir nun wissen, dass Mako als Vorlagen-Engine verwendet wird, müssen wir als Nächstes prüfen , ob
das ${}
in der vom Benutzer eingegebenen Zeichenfolge tatsächlich als Vorlagenausdruck ausgewertet wird . Dies ist der erste Schritt zur Feststellung, ob SSTI (Server-Side Template Injection) vorhanden ist.
, die grundlegende Vorlagensyntax von Mako, ${7*7},
einzugeben
${7*7}
Wenn die Vorlagen-Engine diese Eingabe als Ausdruck auswertet, sollte sie die Zahl
49
Wenn sie hingegen nicht ausgewertet und als Zeichenfolge behandelt wird, wird sie ${7*7}
angezeigt
Als ich es abschickte, wurde die folgende Meldung auf dem Bildschirm angezeigt:

Das Ergebnis 49
vom Benutzer eingegebenen ${7*7}
von der Template-Engine (Mako) ausgewertet wurden.
Mit anderen Worten: Mako verarbeitet Benutzereingaben als Vorlage und es wurde bestätigt, dass SSTI wirksam war.
Intrusion: Auf RCE prüfen ⇒ Versuchen Sie zu sehen, wie weit Sie es von der Vorlagenformel aus ausführen können
Nachdem SSTI bestätigt war, war unser nächstes Ziel klar:
Wir wollten herausfinden, ob wir Vorlagenausdrücke nutzen können, um beliebigen Code auf der Serverseite auszuführen (RCE)
Bestätigung der Befehlsausführung
Testen wir zunächst, ob wir tatsächlich einen Betriebssystembefehl aus einem Vorlagenausdruck ausführen können.
Zur Überprüfung verwenden wir den einfachen Befehl whoami
${__import__('os').popen('whoami').read()}
Als ich diese Formel übermittelte, erhielt ich folgendes Ergebnis:

Das Ausführungsergebnis von whoami
zeigt root
was bestätigt , dass jeder Betriebssystembefehl über einen Vorlagenausdruck ausgeführt werden kann und dass der Befehl mit Root-Berechtigungen ausgeführt wird
An diesem Punkt ist klar, dass eine Remote Code Execution-Schwachstelle (RCE) besteht, die es einem Angreifer ermöglicht, Befehle mit erhöhten Berechtigungen auszuführen
Überprüfen der gelesenen Datei
Nachdem wir nun wissen, dass wir Befehle ausführen können, können wir prüfen,
ob wir eine beliebige Datei lesen können Ein typisches Beispiel /etc/passwd
, die aus Linux-Umgebungen bekannt ist.
${open('/etc/passwd').read()}
Die Ausgabe enthielt die Benutzerinformationen, beispielsweise:

Dieses Ergebnis zeigt, dass
open()
von Python aufzurufen , wodurch Sie die volle Kontrolle über Lesevorgänge auf dem Server haben.
Ausführung: Flags suchen und abrufen
Bisher durch Template-Injektion
- Ausführen von Python-Code
- Führen Sie Betriebssystembefehle aus
- Beliebiges Lesen von Dateien
Dies bedeutet, dass eine vollständige Remote Code Execution (RCE) erreicht wurde .
Der nächste Schritt die Zielflaggendatei zu finden und ihren Inhalt abzurufen .
Suchen Sie den Speicherort der Flag-Datei
Schauen wir uns zunächst den Inhalt des Stammverzeichnisses /
an und sehen wir, welche Verzeichnisse und Dateien dort vorhanden sind.
${__import__('os').listdir('/')}

Wie Sie sehen, ist es in Ordnung, wenn Sie die gewünschte Datei ( flag.txt
) finden können. Wenn Sie sie jedoch nicht finden können, Home
oder Root
graben
Die Flagge lesen
Wenn die Suche eine Datei wie /flag.txt
open(),
um ihren Inhalt abzurufen:
${open('/flag.txt').read()}
Als ich diesen Ausdruck ausführte, erhielt ich die folgende Ausgabe:

Wir haben die Flagge erfolgreich erhalten
, was das Endziel der HackTheBox-Challenge Durch diesen Prozess konnten wir durch tatsächliche Tests ein tieferes Verständnis dafür gewinnen, inwieweit die SSTI-Sicherheitslücke ausgenutzt werden kann.
Warum ist diese Sicherheitslücke aufgetreten? So verwenden Sie Vorlagen sicher
Die Hauptursache für diese Sicherheitslücke (SSTI → RCE) die unsachgemäße Verwendung der Template-Engine
Insbesondere wurden auf der Python-Seite dynamisch Vorlagenzeichenfolgen erstellt, die Benutzereingaben enthalten , was zu Vorlageninjektion (SSTI) und schließlich Remotecodeausführung (RCE) führt.
Lösung – Übergeben Sie keine dynamischen Zeichenfolgen an Vorlagen
Eines der typischen Muster, bei denen SSTI (Server-Side Template Injection) auftritt,
, dass eine Zeichenfolge in Python erstellt und dann als Vorlage ausgewertet wird .
Das Erstellen von Vorlagenstrings mit str.format()
, wie im folgenden Code,
def generate_render(converted_fonts): Ergebnis = '''<tr><td> {0}</td></tr><tr><td> {1}</td></tr><tr><td> {2}</td></tr><tr><td> {3}</td></tr> '''.format(*konvertierte_Schriftarten) return Template(Ergebnis).render()
converted_fonts
beispielsweise die folgende Benutzereingabe enthält:
${__import__('os').popen('id').read()}
Durch die Übergabe dieser Vorlage an Mako entsteht eine schwerwiegende Sicherheitslücke, Mako ${...}
auswertet
Sichere Verwendung: Trennen der Vorlagenstruktur von den Daten
Um dieses Problem zu vermeiden, ist es wichtig
, die Vorlagenstruktur von der Benutzereingabe (Variablen) zu trennen Sie können dies sicher handhaben, indem Sie Variablen explizit an render()
, wie folgt:
def generate_render(konvertierte_Schriftarten): Vorlage = '''<tr><td> ${font1}</td></tr><tr><td> ${font2}</td></tr><tr><td> ${font3}</td></tr><tr><td> ${font4}</td></tr> ''' returniere Template(template).render( font1=konvertierte_Schriftarten[0], font2=konvertierte_Schriftarten[1], font3=konvertierte_Schriftarten[2], font4=konvertierte_Schriftarten[3] )
font1
bis font4
mit dieser Methode ${}
enthalten , behandelt Mako sie als normale Zeichenfolgen und wertet sie nicht als Vorlagenausdrücke aus.

Makos ${...}
-Syntax wertet Ausdrücke innerhalb von Vorlagen aus,
und wenn Benutzereingaben wörtlich übergeben werden, besteht das Risiko der Codeausführung.
Übergeben Sie Variablen
hingegen Template(...).render(var=value)
In diesem Fall var }
bedenkenlos als Platzhalter im Template verwendet werden , wird aber nicht als Code ausgeführt.
Zusammenfassung: SSTIs sind Schwachstellen, die durch „Nutzungsgewohnheiten“ verursacht werden
Bei dieser „Spookifier“-Herausforderung
konnten wir durch unsachgemäße Handhabung von Mako-Vorlagen eine Sicherheitslücke ausnutzen, die zu Server-Side Template Injection (SSTI) und letztendlich zu Remote Code Execution (RCE) führte.
Diese Sicherheitslücken werden durch
Implementierungsfehler der Entwickler Sie sind besonders gefährlich, wenn Template-Strings dynamisch erstellt werden.
So verwenden Sie Template-Engines sicher:
- Trennen Sie immer Vorlagen und Daten (Variablen)
- Übergeben Sie Variablen als Platzhalter und werten Sie Ausdrücke nicht aus
- Geben Sie nicht vertrauenswürdige Eingaben nicht direkt an Vorlagen weiter.
Durch die einfache Befolgung dieser Grundprinzipien können viele SSTIs verhindert werden.
👉 Für detaillierte Informationen zur Registrierung für HackTheBox und den Unterschieden zwischen den Plänen klicken Sie bitte hier.
