Bypassing SOP with Iframes - 2
Ramki w SOP-2
W rozwiązaniu dla tego wyzwania, @Strellic_ proponuje podobną metodę do poprzedniego rozdziału. Sprawdźmy to.
W tym wyzwaniu atakujący musi obejść to:
Jeśli tak, może wysłać postmessage z treścią HTML, która zostanie zapisana na stronie za pomocą innerHTML
bez oczyszczania (XSS).
Sposób na ominięcie pierwszej weryfikacji polega na ustawieniu window.calc.contentWindow
na undefined
i e.source
na null
:
window.calc.contentWindow
to tak naprawdędocument.getElementById("calc")
. Możesz nadpisaćdocument.getElementById
za pomocą<img name=getElementById />
(zauważ, że API Sanitizer -tutaj- nie jest skonfigurowane do ochrony przed atakami na nadpisywanie DOM w domyślnym stanie).Dlatego możesz nadpisać
document.getElementById("calc")
za pomocą<img name=getElementById /><div id=calc></div>
. Wtedywindow.calc
będzieundefined
.Teraz musimy sprawić, żeby
e.source
byłoundefined
lubnull
(ponieważ używane jest==
zamiast===
,null == undefined
jestTrue
). To jest "łatwe" do osiągnięcia. Jeśli utworzysz iframe i wyślesz z niego postMessage, a następnie natychmiast go usuniesz,e.origin
będzienull
. Sprawdź poniższy kod.
Aby ominąć drugą kontrolę dotyczącą tokenu, należy wysłać token
z wartością null
i ustawić wartość window.token
na undefined
:
Wysłanie
token
w postMessage z wartościąnull
jest trywialne.window.token
jest wywoływane w funkcjigetCookie
, która używadocument.cookie
. Należy zauważyć, że dostęp dodocument.cookie
na stronach o pochodzeniu null powoduje błąd. Spowoduje to, żewindow.token
będzie miało wartośćundefined
.
Ostateczne rozwiązanie autorstwa @terjanq znajduje się tutaj:
Last updated