Bypassing SOP with Iframes - 1
Ramki w SOP-1
W tym wyzwaniu stworzonym przez NDevTK i Terjanq musisz wykorzystać XSS w zakodowanym kodzie.
Główny problem polega na tym, że główna strona używa DomPurify do wysyłania data.body
, więc aby wysłać własne dane html do tego kodu, musisz obejść e.origin !== window.origin
.
Zobaczmy, jakie rozwiązanie proponują.
Ominięcie SOP 1 (e.origin === null)
Gdy //example.org
jest osadzone w ramce z ograniczeniami (sandboxed iframe), to pochodzenie strony będzie null
, czyli window.origin === null
. Dlatego, poprzez osadzenie ramki za pomocą <iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">
możemy wymusić null
pochodzenie.
Jeśli strona była osadzalna, można było ominąć tę ochronę w ten sposób (może być również konieczne ustawienie ciasteczek na SameSite=None
).
Ominięcie SOP 2 (window.origin === null)
Mniej znany fakt jest taki, że gdy ustawiona jest wartość sandbox allow-popups
, to otwarte wyskakujące okno odziedziczy wszystkie atrybuty związane z sandboxem, chyba że ustawiono allow-popups-to-escape-sandbox
.
Dlatego, otwierając wyskakujące okno z pochodzeniem null, window.origin
wewnątrz wyskakującego okna również będzie null
.
Rozwiązanie wyzwania
Dlatego, dla tego wyzwania, można utworzyć ramkę, otworzyć wyskakujące okno do strony obsługującej podatny kod XSS (/iframe.php
), ponieważ window.origin === e.origin
, ponieważ oba są null
, możliwe jest wysłanie payloadu, który wykorzysta XSS.
Ten payload pobierze identyfikator i wyśle XSS z powrotem do górnej strony (strony, która otworzyła wyskakujące okno), która zmieni lokalizację na podatną /iframe.php
. Ponieważ identyfikator jest znany, nie ma znaczenia, że warunek window.origin === e.origin
nie jest spełniony (pamiętaj, że pochodzenie to wyskakujące okno z ramki, które ma pochodzenie null
), ponieważ data.identifier === identifier
. Następnie, XSS zostanie ponownie uruchomiony, tym razem w poprawnym pochodzeniu.
Last updated