uug4na/blogs

PostMessage XSS-н тухай

2024-05-28·5 min·mn·medium
#xss#postmessage#sop

· PostMessage гэж юу вэ?

Юун түрүүнд Developer-н өнцгөөс postMessage-г хэрхэн, яагаад ашиглагдаж байгааг мэдвэл зүгээр байх.

Жишээ нь зарим нэгэн вебсайт руу орход ADS харагддаг бөгөөд Developer-ууд ихэвчлэн iframe таг ашиглан тухайн AD-г байршуулж байгааг доорх зурагнаас харж болно.

weather.com дээрх iframe-ээр байршуулсан зарууд
Зураг 1
html
<iframe src="https://youradurl.com"
        height="700px"
        width="500px">
</iframe>
<!-- Зар байршуулж буй жишээ код -->

Дээрхээс гадна их ашиглагддаг жишээнүүдээс гэвэл Cross-Origin Communication буюу өөр ялгаатай Origin/Domain-ууд хоорондоо мэдээлэл солилцоход их хэрэглэгддэг. Ихэвчлэн төлбөрийн систем холбох, OAuth, AD байршуулах гэх мэт Third Party service-тэй харьцахад ашиглагдах магадлал өндөр.

· Same-Origin Policy (SOP)

Үүнийг даган Same-Origin Policy (SOP) гэх сэдэв хөндөгдөх бөгөөд SOP нь 2 ялгаатай Origin-той Frame, Window-г хоорондоо харьцах боломж болон нэгнийхээ Resource/нөөц-рүү хандах боломжийг хязгаарлаж байгаа болно.

Origin-г тодорхойлохдоо protocol (http[s]://), hostname (domain), port-г ашиглана. Аль нэг нь л зөрвөл Same-Origin биш болно. Дэлгэрэнгүй жишээг MDN дээрх Same-origin policy хуудаснаас харж болно.

· Window болон Frame

iframe нь өөр Web page-г өөрийн Web page-д хавсаргаж буй хэлбэр юм (Зураг 1 дээрх ADS ашигласан жишээнээс харж болно). Хэрвээ iframe ажлуулан өөр Web page дуудвал, дуудаж буй хуудас нь дуудагдаж буй хуудастайгаа адилхан Origin-той тохиолдолд дуудсан хуудсандаа нөлөөлж чадах буюу хүссэн Javascript кодоо тухайн дуудагдсан веб дээр ажлуулах боломжтой болно (дээр дурдсны дагуу Resource-руу хандаж байгаа хэлбэр). Жишээг доорх зургуудад хавсаргав.

index.html дотор google.com-г iframe-ээр дуудаж, contentDocument-руу хандахыг оролдсон код
google.com refused to connect алдаа болон console дээрх X-Frame-Options, cross-origin frame алдаанууд
iframe-р дамжуулан google.com-г дуудан ажлуулсан нь

Ажиллаагүй шалтгаан нь google.com нь iframe-р дуудагдахдаа зөвхөн өөртэй ижил Origin-оос дуудагдах тохиргоо буюу X-Frame-Options: SAMEORIGIN header нэмснээс болсон бөгөөд VSCode дээрх Javascript кодыг харвал дуудсан Web Page-нхээ Content-г хэвлэх ёстой байсан ч ажиллаагүйг Browser Console-оос харж болно.

curl -I google.com гаралт дээрх X-Frame-Options: SAMEORIGIN header
SAMEORIGIN header-г баталгаажуулсан нь

Харин адилхан Origin-оос өөр Web Page дуудсан тохиолдолд VSCode доторх Javascript код ажиллаж буйг харж болно. Кодонд дуудаж буй хуудсынхаа h1 таг дээрх текстыг өөрчилж байгаа бөгөөд өмнө ба дарааг хэвлэв (мэдээж өөр Origin-той эсвэл зөвшөөрөгдөөгүй Origin тохиолдолд ажиллахгүй. Ажиллавал юу болж болох өнцгөөс харуулав).

Ижил origin дээрх iframetest.html-г дуудаж h1 текстийг өөрчилж буй код
Console дээр Өмнө нь / Дараа нь гэж хэвлэгдсэн, iframe доторх гарчиг өөрчлөгдсөн үр дүн

Дээрх жишээнд текст өөрчилж харуулсан бол доорх жишээнд дээрх JS кодоор дамжуулан XSS халдлагыг хийж үзүүлэв.

iframe доторх h1.innerHTML-рүү img src=x onerror=alert() payload бичиж буй код
localhost:8080 says XSS PROOF BY IFRAME гэсэн alert цонх
Дуудаж буй iframe Page-н доторх контентыг XSS Payload-оор солив.

Window-н хувьд дээрх тайлбартай төстэй бөгөөд ялгаатай тал нь iframe бус window-оор дуудагдаж буйд болно. Хамгийн энгийн жишээ нь popup хийгдэж буй Page-дэх контентруу хандаж чадах чадахгүйд тогтоно.

Үүнээс гадна өөр Origin-той байсан ч iframe, window-р дуудагдаж болох Domain-ууд байгаа ч зөвхөн адилхан эсвэл зөвшөөрөгдсөн Origin-той үед доторх контент болон Javascript-рүү хандаж чадаж байгаа болно. SOP-н талаар энгийн ойлголт өгсөн гэж бодож байна.

· PostMessage XSS

Энэхүү эмзэг байдлыг хайхдаа юун түрүүнд тухайн вебсайт нь web messaging ашиглаж буй эсэхийг мэдэх хэрэгтэй. Жишээ нь postMessage() function эсвэл EventListener-г дараах байдлаар ашигласан байх магадлалтай.

javascript
addEventListener("message", function (event) {
  // ...
});

window.postMessage(message, targetOrigin, transfer);
Main page болон iframe хооронд postMessage API-аар хувьсагч дамжуулж буй диаграм

Миний хувьд бол postMessage-tracker ашигладаг. Тухайн вебийг postMessage ашиглаж байгаа эсэхийг JS кодоос нь filter-дээд гаргаад ирдэг их амар extension.

Тэгэхээр postMessage-г ашиглан хэрхэн халддаг вэ гэвэл iframe дээрх жишээтэй нилээн төстэй бөгөөд энэхүү халдлага нь ихэвчлэн postMessage-ээр дамжин ирж байгаа мессежийг буруу аргаар handle хийх буюу орж ирсэн мессежээ sanitize хийлгүйгээр innerHTML-ээр дамжуулан set хийх гэх мэт, мессежийг шууд DOM-рүү бичихээс үүднэ.

vulnerable.html дээр window.onmessage дотор event.data-г шууд innerHTML-рүү бичиж буй код

innerHTML-ээс гадна DOM-руу янз бүрээр бичиж болох бөгөөд өөр жишээнүүдийг дурдвал outerHTML, insertAdjacentHTML, document.write гэх мэтээр sanitize хийхгүй л бол олон янзаар эмзэг байдал нь үүсч болно.

PoC-оо бодит болгохын тулд vulnerable.html дээрх кодыг өөр газар host хийсэн болно (https://uug4na.me/poc/index.html). Доор үзүүлж буй attacker.html нь localhost дээр host хийгдсэн байгаа. Хичнээн 2 өөр Origin боловч vulnerable.html дээрх кодонд огт Origin-г нь шалгаагүй буюу хаанаас ч мессеж ирсэн шууд DOM-руу бичиж байгааг харж болно.

attacker.html дээр window.open хийгээд postMessage-ээр img src=x onerror=alert(document.domain) payload илгээж буй код

vulnerable.html, attacker.html дээрх жишээнүүдийг туршин бичлэгэн байдлаар доор үзүүлэв. attacker.html дээрх Javascript кодыг харвал халдаж буй вебийнхээ домайныг алертээр харуулж байгаа бөгөөд бодит орчинд бол нөхцөл нь таарвал Cookie хулгайлах гэх мэт Javascript-ээр хийж болох бүхнийг болох бөлгөө :)

· Хамгаалалт

Харин хамгаалах тал дээр бол Origin шалгах болон ирж буй мессежийг sanitize хийх гэх мэт арга хэмжээнүүд авч болно. Алдаа гаргаагүй жишээ кодыг доор үлдээв.

javascript
window.onmessage = function (event) {
  // Validate the origin
  if (event.origin !== "https://safe-origin.com") {
    return;
  }

  // Create elements safely
  var messageDiv = document.getElementById("message");
  var newElement = document.createElement("div");
  newElement.textContent = event.data; // Safely set text content
  messageDiv.appendChild(newElement);
};
дүгнэлт
postMessage XSS-н талаар бүр нарийн тайлбарлаж чадаагүй ч хангалттай ерөнхий ойлголт авсан гэж бодож байна.

· Бодит жишээ report-ууд

Бодит орчинд томоохон системүүд дээр гарсан жишээ report-ууд:


← blogs