# Iframes u XSS, CSP i SOP {{#include ../../banners/hacktricks-training.md}} ## Iframes u XSS Postoje 3 načina da se označi sadržaj stranice unutar iframe-a: - Putem `src` koji označava URL (URL može biti različitog porekla ili istog porekla) - Putem `src` koji označava sadržaj koristeći `data:` protokol - Putem `srcdoc` koji označava sadržaj **Pristupanje roditeljskim i dečijim varijablama** ```html ``` ```html ``` Ako pristupite prethodnom html-u putem http servera (kao što je `python3 -m http.server`), primetićete da će svi skripti biti izvršeni (pošto ne postoji CSP koji to sprečava). **roditelj neće moći da pristupi `secret` varijabli unutar bilo kog iframe-a** i **samo iframe-ovi if2 i if3 (koji se smatraju istim sajtom) mogu pristupiti tajni** u originalnom prozoru.\ Obratite pažnju kako se if4 smatra da ima `null` poreklo. ### Iframes sa CSP > [!TIP] > Molimo vas, obratite pažnju kako u sledećim zaobilaženjima odgovor na iframed stranicu ne sadrži nijedan CSP header koji sprečava izvršavanje JS-a. `self` vrednost `script-src` neće dozvoliti izvršavanje JS koda koristeći `data:` protokol ili `srcdoc` atribut.\ Međutim, čak i `none` vrednost CSP-a će dozvoliti izvršavanje iframe-ova koji stavljaju URL (potpun ili samo putanju) u `src` atribut.\ Stoga je moguće zaobići CSP stranice sa: ```html
``` Napomena kako **prethodni CSP dozvoljava samo izvršavanje inline skripte**.\ Međutim, **samo `if1` i `if2` skripte će biti izvršene, ali samo `if1` će moći da pristupi roditeljskom tajnom**. .png>) Stoga, moguće je **obići CSP ako možete da otpremite JS datoteku na server i učitate je putem iframe-a čak i sa `script-src 'none'`**. Ovo se **potencijalno može uraditi i zloupotrebom same-site JSONP krajnje tačke**. Možete testirati ovo sa sledećim scenarijom gde je kolačić ukraden čak i sa `script-src 'none'`. Samo pokrenite aplikaciju i pristupite joj putem vašeg pregledača: ```python import flask from flask import Flask app = Flask(__name__) @app.route("/") def index(): resp = flask.Response('') resp.headers['Content-Security-Policy'] = "script-src 'self'" resp.headers['Set-Cookie'] = 'secret=THISISMYSECRET' return resp @app.route("/cookie_s.html") def cookie_s(): return "" if __name__ == "__main__": app.run() ``` #### Nove (2023-2025) CSP bypass tehnike sa iframovima Istraživačka zajednica nastavlja da otkriva kreativne načine zloupotrebe iframova kako bi prevazišla restriktivne politike. Ispod možete pronaći najznačajnije tehnike objavljene tokom poslednjih nekoliko godina: * **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** – Kada aplikacija reflektuje HTML, ali jaka CSP blokira izvršavanje skripti, i dalje možete iscuriti osetljive tokene injektovanjem *dangling* `