PostMessage Vulnerabilities
Vulnerabilnosti PostMessage
WhiteIntel je pretraživač na dark vebu 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 stranicu i isprobati njihovu mašinu za besplatno na:
Pošalji PostMessage
PostMessage koristi sledeću funkciju za slanje poruke:
Imajte na umu da targetOrigin može biti '*' ili URL poput https://company.com. U drugom scenariju, poruka se može poslati samo toj domeni (čak i ako je poreklo objekta prozora drugačije). Ako se koristi zvezdica, poruke se mogu poslati 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 do domena koji kontrolišete.
Imajte na umu da ako se stranica može iframovati ali je targetOrigin postavljen na URL a ne na zvezdicu, ovaj trik neće raditi.
Iskorišćavanje addEventListener
addEventListener
addEventListener
je funkcija koju JS koristi da deklariše funkciju koja očekuje postMessages
.
Koristiće se kod sličan sledećem:
U ovom slučaju primetite kako je prva stvar koju kod radi provera porekla. Ovo je izuzetno važno posebno ako stranica namerava da radi nešto osetljivo sa primljenim informacijama (kao što je menjanje 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
Koristite dodatak za pregledač poput 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
smatra se sigurnim jer vraćaTrue
samo za događaje koji su generisani pravim korisničkim akcijama. Iako je izazovno zaobići ga ako je ispravno implementiran, njegova važnost u sigurnosnim proverama je značajna.Korišćenje
indexOf()
za proveru porekla u PostMessage događajima može biti podložno zaobilaženju. Primer koji ilustruje ovu ranjivost je:
Metoda
search()
izString.prototype.search()
namenjena je regularnim izrazima, a ne stringovima. Prosleđivanje bilo čega osim regularnog izraza 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 provere sa posebno oblikovanim domenima. Na primer:
Funkcija
match()
, slično kaosearch()
, obrađuje regex. Ako je regex nepravilno 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 prepoznajehasOwnProperty
,escapeHtml
neće raditi kako se očekuje. Ovo je prikazano u primerima ispod:Očekivano neuspešno:
Zaobilaženje izbegavanja:
U kontekstu ove ranjivosti, objekat File
je posebno 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 veb stranice unutar sandboxed iframe koristeći %%%%%%, važno je razumeti da će poreklo ifream-a biti postavljeno na null. To 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 ne 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:
pageBypassing SOP with Iframes - 1Zaobilaž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 pregledačkih dodataka kako bi proverili da li je poruka poslata sa iste stranice):
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:
pageBypassing SOP with Iframes - 2Bypassovanje X-Frame-Header-a
Da biste izveli ove napade, idealno je da možete ubaciti ciljnu web stranicu 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 web aplikacije i komunicirati s njom:
Krađa poruke poslate detetu blokiranjem glavne stranice
Na sledećoj stranici možete videti kako biste mogli da ukradete osetljive podatke poslate putem postmessage detetu u iframe-u blokiranjem glavne stranice pre slanja podataka i zloupotrebom XSS-a u detetu da procure podatke pre nego što budu primljeni:
pageBlocking main page to steal postmessageKrađa poruke modifikovanjem lokacije iframe-a
Ako možete da uvezete veb stranicu bez X-Frame-Header-a koja sadrži drugi iframe, možete promeniti lokaciju tog dečijeg iframe-a, tako da ako prima postmessage poslat koristeći zvezdicu, napadač bi mogao da promeni tu iframe poreklo na stranicu kojom kontroliše i ukrade poruku:
pageSteal postmessage modifying iframe locationpostMessage ka Prototype Pollution i/ili XSS
U scenarijima gde su podaci poslati putem postMessage
izvršeni pomoću JS-a, možete iframe-ovati stranicu i iskoristiti prototype pollution/XSS slanjem eksploatacije putem postMessage
.
Par veoma dobro objašnjenih XSS-a putem postMessage
može se nać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:
Za više informacija:
Link ka stranici o zagađenju prototipa
Link ka stranici o XSS
Link ka stranici o zagađenju prototipa na klijentskoj strani do XSS-a
Reference
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.
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 njihov pretraživač besplatno na:
Last updated