# Iframes em XSS, CSP e SOP {{#include ../../banners/hacktricks-training.md}} ## Iframes em XSS Existem 3 maneiras de indicar o conteúdo de uma página em um iframe: - Via `src` indicando uma URL (a URL pode ser de origem cruzada ou mesma origem) - Via `src` indicando o conteúdo usando o protocolo `data:` - Via `srcdoc` indicando o conteúdo **Acessando variáveis Pai & Filho** ```html ``` ```html ``` Se você acessar o HTML anterior via um servidor http (como `python3 -m http.server`), você notará que todos os scripts serão executados (já que não há CSP impedindo isso). **o pai não poderá acessar a variável `secret` dentro de qualquer iframe** e **apenas os iframes if2 e if3 (que são considerados do mesmo site) podem acessar o segredo** na janela original.\ Note como if4 é considerado ter origem `null`. ### Iframes com CSP > [!NOTE] > Por favor, note como nos seguintes bypasses a resposta para a página iframed não contém nenhum cabeçalho CSP que impeça a execução de JS. O valor `self` de `script-src` não permitirá a execução do código JS usando o protocolo `data:` ou o atributo `srcdoc`.\ No entanto, mesmo o valor `none` do CSP permitirá a execução dos iframes que colocam uma URL (completa ou apenas o caminho) no atributo `src`.\ Portanto, é possível contornar o CSP de uma página com: ```html ``` Note que o **CSP anterior só permite a execução do script inline**.\ No entanto, **apenas os scripts `if1` e `if2` serão executados, mas apenas `if1` poderá acessar o segredo do pai**. ![](<../../images/image (372).png>) Portanto, é possível **contornar um CSP se você puder fazer upload de um arquivo JS para o servidor e carregá-lo via iframe, mesmo com `script-src 'none'`**. Isso pode **potencialmente ser feito abusando de um endpoint JSONP de mesmo site**. Você pode testar isso com o seguinte cenário onde um cookie é roubado mesmo com `script-src 'none'`. Basta executar o aplicativo e acessá-lo com seu navegador: ```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() ``` ### Outros Payloads encontrados na natureza ```html ``` ### Iframe sandbox O conteúdo dentro de um iframe pode estar sujeito a restrições adicionais através do uso do atributo `sandbox`. Por padrão, esse atributo não é aplicado, o que significa que não há restrições em vigor. Quando utilizado, o atributo `sandbox` impõe várias limitações: - O conteúdo é tratado como se originasse de uma fonte única. - Qualquer tentativa de enviar formulários é bloqueada. - A execução de scripts é proibida. - O acesso a certas APIs é desativado. - Impede que links interajam com outros contextos de navegação. - O uso de plugins via ``, ``, `` ou tags similares é proibido. - A navegação do contexto de navegação de nível superior do conteúdo pelo próprio conteúdo é impedida. - Recursos que são acionados automaticamente, como reprodução de vídeo ou foco automático em controles de formulário, são bloqueados. O valor do atributo pode ser deixado vazio (`sandbox=""`) para aplicar todas as restrições mencionadas. Alternativamente, pode ser definido como uma lista de valores específicos separados por espaço que isentam o iframe de certas restrições. ```html ``` ## Iframes na SOP Verifique as seguintes páginas: {{#ref}} ../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md {{#endref}} {{#ref}} ../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md {{#endref}} {{#ref}} ../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md {{#endref}} {{#ref}} ../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md {{#endref}} {{#include ../../banners/hacktricks-training.md}}