Iframes in XSS, CSP and SOP
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Istnieją 3 sposoby na wskazanie zawartości strony w iframe:
Poprzez src
wskazujący URL (URL może być cross origin lub same origin)
Poprzez src
wskazujący zawartość za pomocą protokołu data:
Poprzez srcdoc
wskazujący zawartość
Dostęp do zmiennych rodzica i dziecka
Jeśli uzyskasz dostęp do poprzedniego html za pośrednictwem serwera http (takiego jak python3 -m http.server
), zauważysz, że wszystkie skrypty będą wykonywane (ponieważ nie ma CSP, które by to uniemożliwiało). Rodzic nie będzie mógł uzyskać dostępu do zmiennej secret
wewnątrz żadnego iframe i tylko iframes if2 i if3 (które są uważane za tej samej witryny) mogą uzyskać dostęp do sekretnych w oryginalnym oknie.
Zauważ, że if4 jest uważany za mający null
origin.
Proszę zauważyć, że w poniższych obejściach odpowiedź na stronę w iframe nie zawiera żadnego nagłówka CSP, który uniemożliwia wykonanie JS.
Wartość self
w script-src
nie pozwoli na wykonanie kodu JS przy użyciu protokołu data:
lub atrybutu srcdoc
.
Jednak nawet wartość none
CSP pozwoli na wykonanie iframe, które umieszczają adres URL (pełny lub tylko ścieżkę) w atrybucie src
.
Dlatego możliwe jest obejście CSP strony za pomocą:
Zauważ, że poprzedni CSP zezwala tylko na wykonanie skryptu inline.
Jednak tylko skrypty if1
i if2
będą wykonywane, ale tylko if1
będzie mogło uzyskać dostęp do tajemnicy rodzica.
Dlatego możliwe jest obejście CSP, jeśli możesz przesłać plik JS na serwer i załadować go za pomocą iframe, nawet przy script-src 'none'
. To można potencjalnie również zrobić, nadużywając punktu końcowego JSONP w tej samej witrynie.
Możesz to przetestować w następującym scenariuszu, w którym ciasteczko jest kradzione, nawet przy script-src 'none'
. Po prostu uruchom aplikację i uzyskaj do niej dostęp za pomocą przeglądarki:
Zawartość w iframe może być poddana dodatkowym ograniczeniom za pomocą atrybutu sandbox
. Domyślnie ten atrybut nie jest stosowany, co oznacza, że nie ma żadnych ograniczeń.
Gdy jest używany, atrybut sandbox
nakłada kilka ograniczeń:
Zawartość jest traktowana tak, jakby pochodziła z unikalnego źródła.
Każda próba przesłania formularzy jest blokowana.
Wykonanie skryptów jest zabronione.
Dostęp do niektórych interfejsów API jest wyłączony.
Zapobiega interakcji linków z innymi kontekstami przeglądania.
Użycie wtyczek za pomocą <embed>
, <object>
, <applet>
lub podobnych tagów jest zabronione.
Nawigacja w górnym kontekście przeglądania przez samą zawartość jest zablokowana.
Funkcje, które są uruchamiane automatycznie, takie jak odtwarzanie wideo lub automatyczne ustawianie fokusu na kontrolkach formularzy, są blokowane.
Wartość atrybutu może być pozostawiona pusta (sandbox=""
), aby zastosować wszystkie powyższe ograniczenia. Alternatywnie, może być ustawiona na listę specyficznych wartości oddzielonych spacjami, które zwalniają iframe z niektórych ograniczeń.
Sprawdź następujące strony:
Bypassing SOP with Iframes - 1Bypassing SOP with Iframes - 2Blocking main page to steal postmessageSteal postmessage modifying iframe locationUcz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)