<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
Junte-se ao servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de recompensas por bugs!
Política de Segurança de Conteúdo ou CSP é uma tecnologia integrada ao navegador que **ajuda a proteger contra ataques como scripting entre sites (XSS)**. Ela lista e descreve caminhos e fontes dos quais o navegador pode carregar recursos de forma segura. Os recursos podem incluir imagens, frames, javascript e mais. Aqui está um exemplo de recursos sendo permitidos do domínio local (self) para serem carregados e executados em linha e permitir funções de execução de código 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 as violações à medida que são detectadas.
CSP funciona restringindo as origens de onde o conteúdo ativo e passivo pode ser carregado. Ele pode adicionalmente restringir certos aspectos do conteúdo ativo, como a execução de javascript inline e o uso de `eval()`.
* **script-src**: Esta diretiva especifica fontes permitidas para JavaScript. Isso inclui não apenas URLs carregadas diretamente em elementos, mas também coisas como manipuladores de eventos de script inline (onclick) e folhas de estilo XSLT que podem desencadear a execução de scripts.
* **default-src**: Esta diretiva define a política para buscar recursos por padrão. Quando diretivas de busca estão ausentes no cabeçalho CSP, o navegador segue esta diretiva por padrão.
* **Child-src**: Esta diretiva define recursos permitidos para web workers e conteúdos de frames embutidos.
* **frame-ancestors**: Esta diretiva especifica as fontes que podem incorporar a página atual. Esta diretiva aplica-se a [`<frame>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame), [`<iframe>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe), [`<object>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object), [`<embed>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed), ou [`<applet>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/applet). Esta diretiva não pode ser usada em tags e aplica-se apenas a recursos não HTML.
* **img-src**: Define fontes permitidas para carregar imagens na página da web.
* **manifest-src**: Esta diretiva define fontes permitidas de arquivos de manifesto de aplicação.
* **media-src**: Define fontes permitidas de onde objetos de mídia podem ser carregados.
* **object-src**: Define fontes permitidas para os elementos \<object>, \<embed> e \<applet>.
* **base-uri**: Define URLs permitidas que podem ser carregadas usando um elemento.
* **form-action**: Esta diretiva lista endpoints válidos para envio a partir de tags.
* **plugin-types**: Define limites nos tipos de mime types que uma página pode invocar.
* **upgrade-insecure-requests**: Esta diretiva instrui navegadores a reescrever esquemas de URL, mudando HTTP para HTTPS. Esta diretiva pode ser útil para sites com um grande número de URLs antigas que precisam ser reescritas.
* **sandbox**: A diretiva sandbox habilita um sandbox para o recurso solicitado semelhante ao atributo sandbox. Aplica restrições às ações de uma página, incluindo prevenir popups, prevenir a execução de plugins e scripts, e impor uma política de mesma origem.
* \*: Permite qualquer URL exceto esquemas `data:`, `blob:`, `filesystem:`.
* **self**: Esta fonte define que o carregamento de recursos na página é permitido do mesmo domínio.
* **data**: Esta fonte permite carregar recursos através do esquema data (por exemplo, imagens codificadas em Base64).
* **none**: Esta diretiva não permite que nada seja carregado de qualquer fonte.
* **unsafe-eval**: Permite o uso de eval() e métodos semelhantes para criar código a partir de strings. Não é uma prática segura incluir esta fonte em qualquer diretiva. Por essa razão, é nomeada como insegura.
* **unsafe-hashes**: Permite a ativação de manipuladores de eventos inline específicos.
* **unsafe-inline**: Permite o uso de recursos inline, como elementos inline, URLs javascript:, manipuladores de eventos inline e elementos inline. Novamente, isso não é recomendado por razões de segurança.
* **nonce**: Uma lista de permissões para scripts inline específicos usando um nonce criptográfico (número usado uma vez). O servidor deve gerar um valor de nonce único cada vez que transmite uma política.
* **sha256-\<hash>**: Lista de permissões para scripts com um hash sha256 específico.
* **strict-dynamic**: Permite que o navegador carregue e execute novas tags JavaScript no DOM de qualquer fonte de script que tenha sido previamente autorizada por um valor de "nonce" ou "hash".
Se você conseguir de alguma forma fazer com que um **código JS permitido crie uma nova tag de script** no DOM com o seu código JS, porque um script permitido está criando-o, a **nova tag de script será permitida para execução**.
No entanto, é altamente provável que o servidor esteja **validando o arquivo enviado** e só permitirá que você **envie tipos determinados de arquivos**.
Além disso, mesmo que você consiga enviar um **código JS dentro** de um arquivo usando uma extensão aceita pelo servidor (como: _script.png_), isso não será suficiente porque alguns servidores, como o servidor Apache, **selecionam o tipo MIME do arquivo com base na extensão** e navegadores como o Chrome **rejeitarão executar código Javascript** dentro de algo que deveria ser uma imagem. "Felizmente", existem erros. Por exemplo, de um CTF, aprendi que o **Apache não conhece** a extensão _**.wave**_, portanto, ele não a serve com um **tipo MIME como audio/\***.
A partir daqui, se você encontrar um XSS e um upload de arquivo, e conseguir encontrar uma **extensão mal interpretada**, você poderia tentar enviar um arquivo com essa extensão e o conteúdo do script. Ou, se o servidor estiver verificando o formato correto do arquivo enviado, crie um poliglota ([alguns exemplos de poliglota aqui](https://github.com/Polydet/polyglot-database)).
#### Payloads usando Angular + uma biblioteca com funções que retornam o objeto `window` ([confira este post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
O post mostra que você pode **carregar** todas as **bibliotecas** de `cdn.cloudflare.com` (ou qualquer outro repositório permitido de bibliotecas JS), executar todas as funções adicionadas de cada biblioteca e verificar **quais funções de quais bibliotecas retornam o objeto `window`**.
De acordo com [**este writeup de CTF**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=es&\_x\_tr\_pto=wapp#noteninja-3-solves), você pode abusar de [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) dentro de um CSP para executar código JS arbitrário contornando o CSP:
Cenários como este, onde `script-src` está definido como `self` e um domínio específico que está na lista de permissões, podem ser contornados usando JSONP. Pontos de extremidade JSONP permitem métodos de callback inseguros que permitem a um atacante realizar XSS, payload funcional:
A mesma vulnerabilidade ocorrerá se o **endpoint confiável contiver um Redirecionamento Aberto** porque se o endpoint inicial é confiável, redirecionamentos também são.
Como descrito no [post seguinte](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), existem muitos domínios de terceiros, que podem estar permitidos em algum lugar no CSP, que podem ser abusados para exfiltrar dados ou executar código JavaScript. Alguns desses terceiros são:
Se você encontrar algum dos domínios permitidos no CSP do seu alvo, é provável que você consiga fazer um bypass no CSP ao se registrar no serviço de terceiros e, ou exfiltrar dados para esse serviço ou executar código.
A Política de Segurança de Conteúdo (CSP) é uma camada adicional de segurança que ajuda a detectar e mitigar ataques de injeção de conteúdo, como Cross-Site Scripting (XSS). CSP permite que os desenvolvedores web controlem os recursos que a página pode carregar e executar.
Se a CSP incluir diretivas inseguras como `'unsafe-inline'` ou `'unsafe-eval'`, pode ser possível injetar scripts diretamente ou usar `eval()` para executar código JavaScript arbitrário.
Entender e testar a eficácia da CSP é crucial para a segurança de um site. Embora a CSP possa ser uma defesa poderosa contra ataques de injeção, é importante estar ciente das técnicas de bypass e garantir que a política esteja configurada corretamente.
Você deve ser capaz de exfiltrar dados, de forma semelhante ao que sempre foi feito com [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). Neste caso, você segue estes passos gerais:
1. Vá para "Configurações -> Básico" e obtenha seu "App ID".
1. No site alvo de onde você quer exfiltrar dados, você pode exfiltrar dados usando diretamente o gadget do SDK do Facebook "fbq" através de um "customEvent" e o payload de dados.
1. Vá para o "Gerenciador de Eventos" do seu aplicativo e selecione o aplicativo que você criou (observe que o gerenciador de eventos pode ser encontrado em uma URL semelhante a esta: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events
1. Selecione a aba "Test Events" para ver os eventos sendo enviados pelo "seu" site.
Então, no lado da vítima, você executa o seguinte código para inicializar o pixel de rastreamento do Facebook para apontar para o app-id da conta de desenvolvedor do Facebook do atacante e emitir um evento personalizado como este:
Além do redirecionamento mencionado anteriormente para contornar restrições de caminho, existe outra técnica chamada Relative Path Overwrite (RPO) que pode ser usada em alguns servidores.
O navegador acabará carregando `https://example.com/scripts/angular/angular.js`.
Isso funciona porque, para o navegador, você está carregando um arquivo chamado `..%2fangular%2fangular.js` localizado em `https://example.com/scripts/react/`, o que está em conformidade com a CSP.
No entanto, para certos servidores, ao receber a solicitação, eles a decodificarão, efetivamente solicitando `https://example.com/scripts/react/../angular/angular.js`, que é equivalente a `https://example.com/scripts/angular/angular.js`.
A solução é não tratar `%2f` como `/` no lado do servidor, garantindo uma interpretação consistente entre o navegador e o servidor para evitar esse problema.
Se a diretiva **base-uri** estiver ausente, você pode abusar dela para realizar uma [**injeção de marcação pendente**](../dangling-markup-html-scriptless-injection/).
Além disso, se a **página estiver carregando um script usando um caminho relativo** (como `<script src="/js/app.js">`) usando um **Nonce**, você pode abusar da **tag base** para fazer com que ela **carregue** o script do **seu próprio servidor, alcançando um XSS.**\
Se a página vulnerável for carregada com **httpS**, use uma URL httpS na base.
Dependendo da política específica, o CSP bloqueará eventos JavaScript. No entanto, o AngularJS define seus próprios eventos que podem ser usados em substituição. Quando dentro de um evento, o AngularJS define um objeto especial `$event`, que simplesmente referencia o objeto de evento do navegador. Você pode usar este objeto para realizar um bypass no CSP. No Chrome, existe uma propriedade especial no objeto `$event/event` chamada `path`. Esta propriedade contém um array de objetos que fazem com que o evento seja executado. A última propriedade é sempre o objeto `window`, que podemos usar para realizar uma fuga de sandbox. Ao passar este array para o filtro `orderBy`, podemos enumerar o array e usar o último elemento (o objeto `window`) para executar uma função global, como `alert()`. O código a seguir demonstra isso:
**Encontre outras formas de contornar o Angular em** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
Se a aplicação estiver usando Angular JS e os scripts forem carregados de um domínio na lista de permissões, é possível contornar essa política CSP chamando funções de retorno e classes vulneráveis. Para mais detalhes, visite este incrível repositório [git](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh\*t,-it's-CSP!%22).
Outros pontos de execução arbitrária JSONP podem ser encontrados [**aqui**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (alguns deles foram excluídos ou corrigidos)
O que acontece quando o CSP encontra um redirecionamento do lado do servidor? Se o redirecionamento levar a uma origem diferente que não é permitida, ainda assim falhará.
No entanto, de acordo com a descrição em [CSP spec 4.2.2.3. Caminhos e Redirecionamentos](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), se o redirecionamento levar a um caminho diferente, ele pode contornar as restrições originais.
Se o CSP estiver definido para `https://www.google.com/a/b/c/d`, como o caminho é considerado, ambos os scripts `/test` e `/a/test` serão bloqueados pelo CSP.
No entanto, o final `http://localhost:5555/301` será **redirecionado no lado do servidor para `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Como é um redirecionamento, o **caminho não é considerado**, e o **script pode ser carregado**, contornando assim a restrição do caminho.
Portanto, a melhor solução é garantir que o site não tenha vulnerabilidades de redirecionamento aberto e que não existam domínios que possam ser explorados nas regras do CSP.
`'unsafe-inline'` significa que você pode executar qualquer script dentro do código (XSS pode executar código) e `img-src *` significa que você pode usar na página da web qualquer imagem de qualquer recurso.
Você pode contornar essa CSP exfiltrando os dados por meio de imagens (nesta ocasião, o XSS abusa de um CSRF onde uma página acessível pelo bot contém um SQLi e extrai a bandeira por meio de uma imagem):
Você também pode abusar dessa configuração para **carregar código javascript inserido dentro de uma imagem**. Se, por exemplo, a página permite carregar imagens do Twitter. Você poderia **criar** uma **imagem especial**, **fazer upload** dela no Twitter e abusar do "**unsafe-inline**" para **executar** um código JS (como um XSS comum) que irá **carregar** a **imagem**, **extrair** o **JS** dela e **executá-lo**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
Se um **parâmetro** enviado por você está sendo **colado dentro** da **declaração** da **política**, então você poderia **alterar** a **política** de alguma forma que a torne **inútil**. Você poderia **permitir script 'unsafe-inline'** com qualquer um desses bypasses:
Você pode encontrar um exemplo aqui: [http://portswigger-labs.net/edge\_csp\_injection\_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge\_csp\_injection\_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
Desta vez você pode fazer a vítima **carregar** uma página **sob seu controle** via **XSS** com um `<iframe>`. Desta vez, você vai fazer a vítima acessar a página de onde você quer extrair informações (**CSRF**). Você não pode acessar o conteúdo da página, mas se de alguma forma você puder **controlar o tempo que a página leva para carregar**, você poderá extrair as informações necessárias.
Desta vez, uma **flag** será extraída, sempre que um **caractere for adivinhado corretamente** via SQLi, a **resposta** leva **mais tempo** devido à função sleep. Então, você será capaz de extrair a flag:
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.
Neste [**relatório de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), o CSP é burlado injetando dentro de um iframe permitido um CSP mais restritivo que proibiu carregar um arquivo JS específico que, então, via **poluição de protótipo** ou **dom clobbering** permitiu **abusar de um script diferente para carregar um script arbitrário**.
Neste [**relatório de CTF**](https://github.com/aszx87410/ctf-writeups/issues/48), foi possível por meio de **injeção de HTML****restringir** ainda mais uma **CSP** de modo que um script que impedia CSTI foi desativado e, portanto, a **vulnerabilidade tornou-se explorável.**\
A CSP pode ser tornada mais restritiva usando **meta tags HTML** e scripts inline podem ser desativados **removendo** a **entrada** que permite seu **nonce** e **habilitar scripts inline específicos via sha**:
Se você conseguir fazer com que o servidor responda com o cabeçalho **`Content-Security-Policy-Report-Only`** com um **valor controlado por você** (talvez por causa de um CRLF), você poderá fazê-lo apontar para o seu servidor e, se você **envolver** o **conteúdo JS** que deseja exfiltrar com **`<script>`**, e porque é altamente provável que `unsafe-inline` não seja permitido pelo CSP, isso irá **desencadear um erro de CSP** e parte do script (contendo as informações sensíveis) será enviada para o servidor a partir de `Content-Security-Policy-Report-Only`.
Imagine uma situação onde 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.\
**Também páginas que são redirecionadas não são permitidas pela política de segurança, mas a página que redireciona é.**
A violação do 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 `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, você também pode usar uma busca 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)
Participe do servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de recompensas por bugs!
O PHP é conhecido por **bufferizar a resposta em 4096** bytes por padrão. Portanto, se o PHP estiver mostrando um aviso, ao fornecer **dados suficientes dentro dos avisos**, a **resposta** será **enviada****antes** do **cabeçalho CSP**, fazendo com que o cabeçalho seja ignorado.\
De [**este writeup**](https://blog.ssrf.kr/69) parece que foi possível burlar uma proteção CSP carregando uma página de erro (potencialmente sem CSP) e reescrevendo seu conteúdo.
SOME é uma técnica que explora um XSS (ou XSS altamente limitado) **em um ponto de extremidade de uma página** para **abusar****de outros pontos de extremidade da mesma origem.** Isso é feito carregando o ponto de extremidade vulnerável a partir de uma página do atacante e, em seguida, atualizando a página do atacante para o ponto de extremidade real na mesma origem que você deseja abusar. Dessa forma, o **ponto de extremidade vulnerável** pode usar o objeto **`opener`** no **payload** para **acessar o DOM** do **ponto de extremidade real a ser abusado**. Para mais informações, confira:
Além disso, o **wordpress** possui um ponto de extremidade **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 ponto de extremidade para **gerar um ataque SOME** contra o WordPress e **incorporá-lo** dentro de `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` 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 **ponto de extremidade de callback 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, confira [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/)
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.
Junte-se ao servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de recompensas por bugs!
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).