Die Frage stellt eine API zum Lesen von XFF-Headern bereit. Es kann festgestellt werden, dass sie mit der Smarty-Engine geschrieben wurde.
#🎜 🎜#Bestimmen Sie grundsätzlich die Möglichkeit von SSTi auf dieser Seite Ändern Sie den xff-Header von 127.0.0.1 auf 127.0.0{ 1+2} Das folgende Ergebnis erscheint ssti Es besteht kein Zweifel Die endgültige Nutzlast ist# 🎜🎜#
X -Forwarded-For: {if var_dump(file_get_contents('/flag')) }{/if}Smarty SSTI Exploit# 🎜🎜#
Smarty wurde auf Basis von PHP entwickelt. Die Methode zur Nutzung von Smartys SSTI unterscheidet sich stark vom üblichen SSTI von Flask. Sicherheitslückenbestätigung Im Allgemeinen können Sie die zurückgegebene Smarty-Versionsnummer sehen, indem Sie {$smarty.version} eingeben. Die Smarty-Version dieser Frage ist 3.1.30Allgemeine Verwendung
Smarty unterstützt die Verwendung von {php}{/ php}-Tag, um die darin eingeschlossenen PHP-Anweisungen auszuführen. Die gängigste Idee ist, das Tag zuerst zu testen. Aber was dieses Thema betrifft, wird bei Verwendung des {php}{/php}-Tags ein Fehler gemeldet:Das offizielle Handbuch von Smarty3 hat die folgende Beschreibung:# 🎜🎜#
Smarty hat das Tag {php} veraltet und es wird dringend empfohlen, es nicht zu verwenden. In Smarty 3.1 ist {php} nur in SmartyBC verfügbar.Diese Frage verwendet die Smarty-Klasse, daher können wir nur einen anderen Weg finden. {literal} Tag
Das offizielle Handbuch beschreibt dieses Tag wie folgt:
{literal} kann die Zeichen in a belassen Vorlagenbereich, wenn sie ausgegeben werden. Dies wird häufig verwendet, um zu verhindern, dass Javascript- oder CSS-Stylesheets auf der Seite aufgrund von Smarty-Trennzeichen falsch analysiert werden.Dann können wir für die PHP5-Umgebungverwenden, um die PHP-Codeausführung zu implementieren, aber die Frageumgebung dieser Frage ist PHP7, diese Methode Es schlägt fehl.<script language="php">phpinfo();</script>Nach dem Login kopieren
statische Methode
Das Abrufen der Smarty-Klasse durch sich selbst und das anschließende Aufrufen ihrer statischen Methode zum Lesen und Schreiben von Dateien wird in vielen Artikeln im Internet übernommen.
public function getStreamVariable($variable) { $_result = ''; $fp = fopen($variable, 'r+'); if ($fp) { while (!feof($fp) && ($current_line = fgets($fp)) !== false) { $_result .= $current_line; } fclose($fp); return $_result; } $smarty = isset($this->smarty) ? $this->smarty : $this; if ($smarty->error_unassigned) { throw new SmartyException('Undefined stream variable "' . $variable . '"'); } else { return null; } }
Sie können sehen, dass diese Methode eine Datei lesen und ihren Inhalt zurückgeben kann, sodass wir sie verwenden können self, um das Smarty-Objekt abzurufen und diese Methode aufzurufen. Die in vielen Artikeln angegebene Nutzlast hat die Form: {self::getStreamVariable("file:///etc/passwd")}. Die Verwendung dieser Nutzlast löst jedoch den folgenden Fehler aus:
Fatal error: Uncaught --> Smarty Compiler: Syntax error in template „string:display("string:".$ip); }Sie können sehen, dass Zeichenfolgen anstelle von Smarty-Vorlagen verwendet werden, was dazu führt, dass die eingefügten Smarty-Tags direkt analysiert und ausgeführt werden, was zu SSTI führt.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Smarty SSTi. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!