La question fournit une API pour lire les en-têtes XFF. Il y a des mots Build With Smarty au bas de la page. On peut déterminer qu'elle est écrite avec le moteur Smarty.
On peut essentiellement déterminer que le. la possibilité de SSTi existe sur cette page
Changez l'en-tête xff de 127.0.0.1 à 127.0.0{1+2} et le résultat suivant apparaîtra
ssti ne fait aucun doute
La charge utile finale est
X-Forwarded-For : {if var_dump(file_get_contents ('/flag')) }{/if}
Smarty est développé sur la base de PHP. La méthode d'utilisation du SSTI de Smarty. est très différent du SSTI du flacon commun.
En général, vous pouvez voir le numéro de version smarty renvoyé en saisissant {$smarty.version}. La version Smarty de cette question est 3.1.30
Smarty prend en charge l'utilisation de la balise {php}{/php} pour exécuter les instructions php qui y sont incluses. L'idée la plus courante est de tester d'abord la balise. . Mais en ce qui concerne ce sujet, l'utilisation de la balise {php}{/php} signalera une erreur :
Le manuel officiel de Smarty3 a la description suivante :
Smarty a abandonné la balise {php} , et il est fortement déconseillé de l’utiliser. Dans Smarty 3.1, {php} n'est disponible que dans SmartyBC.
Cette question utilise la classe Smarty, nous ne pouvons donc trouver qu'un autre moyen.
Le manuel officiel décrit cette balise comme suit :
{literal} peut faire en sorte que les caractères d'une zone de modèle soient affichés tels quels. Ceci est souvent utilisé pour protéger les feuilles de style Javascript ou CSS de la page contre une analyse incorrecte en raison des délimiteurs Smarty.
Ensuite, pour l'environnement php5, nous pouvons utiliser
<script language="php">phpinfo();</script>
pour implémenter l'exécution de code PHP, mais l'environnement de question de cette question est PHP7, donc cette méthode n'est pas valide.
Obtenir la classe Smarty via self puis appeler sa méthode statique pour lire et écrire des fichiers est adopté par de nombreux articles sur Internet.
Le code de la méthode getStreamVariable de la classe Smarty est le suivant :
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; } }
Vous pouvez voir que cette méthode peut lire un fichier et renvoyer son contenu, on peut donc utiliser self pour récupérer l'objet Smarty et appeler cette méthode The. les charges utiles données dans de nombreux articles sont Le formulaire est : {self::getStreamVariable("file:///etc/passwd")}. Cependant, l'utilisation de cette charge utile déclenchera l'erreur suivante :
Erreur fatale : Uncaught --> Compilateur Smarty : Erreur de syntaxe dans le modèle "string :IP actuelle :{ self: :getStreamVariable('file:///etc/passwd')}" La classe statique 'self' n'est pas définie ou n'est pas autorisée par le paramètre de sécurité <-- lancée dans /var/www/html/smarty/libs/sysplugins/ smarty_internal_templatecompilerbase.phpon line 12
On constate que la méthode d'utilisation SSTI de cette ancienne version de Smarty n'est pas applicable à la nouvelle version de Smarty. De plus, cette méthode statique a été officiellement supprimée dans la version 3.1.30 de Smarty. La méthode writeFile de la classe Smarty_Internal_Write_File mentionnée dans ces articles pour écrire le shell ne peut pas être utilisée pour la même raison.
Tag {if}
Voir cette description dans la documentation officielle :
Smarty's {if}
条件判断和PHP的if 非常相似,只是增加了一些特性。每个{if}
必须有一个配对的{/if}
. 也可以使用{else}
和{elseif}
Toutes les expressions et fonctions conditionnelles PHP peuvent être utilisées dans if, telles que ||, ou, &&, et, is_array (), etc. .
Puisque toutes les fonctions PHP peuvent être utilisées, pouvons-nous l'utiliser pour exécuter notre code ?
Comme mentionné au début
est lu dans le fichier après getshell. Le code qui provoque le SSTI dans cette question est simplifié comme suit :
display("string:".$ip); }Vous pouvez voir que les chaînes sont utilisées ici à la place. de modèles intelligents, ce qui conduit à l'injection. Les balises Smarty sont directement analysées et exécutées, ce qui entraîne le SSTI.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!