Wpis z mikrobloga

postMessage pozwala na wymienianie danych pomiędzy różnymi domenami przy użyciu #javascript
Dzisiaj w #od0dopentestera o tym, jak sprawdzić źródło wiadomości oraz dlaczego nie używać wyrażeń regularnych do tego celu.

window.addEventListener("message", function(message) {
alert(message.data);
}

Jeżeli na stronie umieścimy taki kawałek kodu, dowolna inna witryna będzie mogła przesłać do naszej domeny wiadomość i wyświetlić ją użytkownikowi:

document.getElementById("f").contentWindow.postMessage("Wiadomość", "*");
Jest to możliwe ponieważ nie sprawdzamy skąd pochodzi taka wiadomość.
Powinniśmy pozwalać na wykonanie akcji tylko zaufanym stroną.
W tym celu przeglądarka do każdej wiadomości dodaje pole origin, w którym zawarta jest nazwa domeny próbującej przesłać wiadomość:

if (message.origin == "[http://naszadomena.local](http://naszadomena.local)")
Ale ciągi znaków można sprawdzać na różne sposoby, na przykład przy użyciu wyrażeń regularnych:

if (/^http\/\/www.domena.local$/.test(message.origin))
Łatwo wtedy zapomnieć, że kropka - oznacza dowolny jeden znak.
Aby sprawdzać czy jest tam rzeczywiście kropka - musielibyśmy poprzedzić ją \.
W tym przypadku dane można również wysłać z wwwXdomena.local czy też wwwYdomena.local.

if (message.origin.indexOf("www.domena2.local") > 0)
Funkcja indexOf zwraca offset pod którym odnalazła poszukiwany ciąg.
Sprawdza zatem czy podany tekst znajduje się gdziekolwiek.
Aby obejść ten filtr możemy stworzyć subdomenę: www.domena2.local.innadomena.local
Jeżeli chcesz być wołany dodaj się do Mirkolisty.
Masz pytanie na temat bezpieczeństwa? Zadaj je na grupie od 0 do pentestera na Facebooku.

Ps. Zapraszam do obserwowania tagu autorskiego #od0dopentestera

#security #bezpieczenstwo #programowanie #programista15k #informatyka #it #nauka #technologia #ciekawostki #gruparatowaniapoziomu
KacperSzurek - postMessage pozwala na wymienianie danych pomiędzy różnymi domenami pr...
  • 4
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@KacperSzurek:

Sprawdza zatem czy podany tekst znajduje się gdziekolwiek.

if (message.origin.indexOf("www.domena2.local") > 0)


Kod zadziała bo na początku jest jeszcze protokół, ale jeśli sprawdzasz, czy tekst znajduje się gdziekolwiek to powinieneś porównywać
  • Odpowiedz