# XS-Search/XS-Leaks
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir e **automatizar fluxos de trabalho** com as ferramentas comunitárias **mais avançadas** do mundo.\ Obtenha Acesso Hoje: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! Outras formas de apoiar o HackTricks: * 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 exclusivos**](https://opensea.io/collection/the-peass-family) * **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 do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
## **Informações Básicas** XS-Search é uma técnica voltada para **exfiltrar informações cross-origin** abusando de **ataques de canal lateral**. Existem diferentes elementos neste tipo de ataque: * **Web Vulnerável**: É a web de onde queremos exfiltrar alguma informação. * **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 Leak**: Após acessar a web vulnerável, uma técnica será usada para diferenciar entre os possíveis estados 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**: Esta é a informação que o atacante tem que tentar decidir o estado 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** cross-origin (por exemplo, erros de servidor, erros de cliente ou erros de autenticação). * **Uso de API**. Esta diferença detectável permite que um atacante detecte o **uso de APIs Web** entre páginas, permitindo que um atacante infira se uma página cross-origin está usando uma API Web JavaScript específica. * **Redirecionamentos**. É possível detectar se uma aplicação 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 pode ser o **número de frames 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 coletar seu valor. Isso inclui cabeçalhos como X-Frame-Options, Content-Disposition e Cross-Origin-Resource-Policy. * **Tempo**: Um atacante pode detectar que existe uma diferença de tempo consistente entre 2 estados. ### Métodos de Inclusão * **Elementos HTML**. O HTML oferece uma variedade de elementos que permitem a **inclusão de recursos cross-origin**. Elementos como folhas de estilo, imagens ou scripts, forçam o navegador da vítima a solicitar um recurso não-HTML especificado. Uma lista que enumera possíveis elementos HTML para esse propósito está disponível online ([https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)). * **Frames**. Elementos como **iframe**, **object** e **embed** podem incorporar recursos HTML diretamente na página do atacante. Se a página **não usar proteção contra frames**, o código JavaScript pode acessar o objeto window do recurso emoldurado através da propriedade contentWindow. * **Pop-ups**. O método **`window.open`** carrega um recurso em uma nova aba ou janela do navegador. O método retorna um **manipulador de janela** que o código JavaScript pode usar para acessar métodos e propriedades, que estão em conformidade com o SOP. Esses chamados pop-ups são frequentemente usados em single sign-on. Navegadores modernos só permitem pop-ups se forem acionados por certas interações do usuário. Para ataques XS-Leak, este método é especialmente útil porque **contorna restrições de framing e cookies para um recurso alvo**. Versões mais recentes do navegador adicionaram recentemente meios para isolar manipuladores de janela. * **Requisições JavaScript**. O JavaScript permite enviar solicitações diretamente para recursos alvo. Existem duas maneiras diferentes para esse propósito: **XMLHttpRequests** e seu sucessor **Fetch API**. Em contraste com métodos de inclusão anteriores, um atacante tem controle refinado sobre a solicitação emitida, por exemplo, se um redirecionamento HTTP deve ser automaticamente seguido. ### Técnicas de Leak * **Manipulador de Eventos**. O manipulador de eventos pode ser visto como a técnica clássica de leak para XS-Leaks. Eles são uma fonte bem conhecida de várias informações. Por exemplo, o gatilho de **onload** indica um carregamento de recurso **bem-sucedido** em contraste com o evento onerror. * **Mensagens de Erro**. Além dos manipuladores de eventos, mensagens de erro podem ocorrer como **exceções JavaScript** e **páginas de erro especiais**. Mensagens de erro podem ser lançadas em diferentes etapas, por exemplo, diretamente pela técnica de leak. A técnica de leak pode usar informações adicionais **contidas diretamente** na **mensagem de erro**, ou distinguir entre a **aparência e ausência de uma mensagem de erro**. * **Limites Globais**. Todo computador tem seus limites físicos, assim como um navegador. Por exemplo, a quantidade de memória disponível limita as abas em execução de um navegador. O mesmo vale para outros limites do navegador que são aplicados para todo o navegador. Se um atacante pode determinar **quando o limite é atingido, isso pode ser usado como uma técnica de leak**. * **Estado Global**. Os navegadores têm **estados globais com os quais todas as páginas podem interagir**. Se essa interação for detectável a partir do site do atacante, ela pode ser usada como uma técnica de leak. Por exemplo, a interface **History** permite a manipulação das páginas visitadas em uma aba ou frame. Isso cria um estado global porque o **número de entradas** permite que um atacante tire conclusões sobre páginas cross-origin. * **API de Desempenho**. A API de Desempenho é usada para acessar as **informações de desempenho da página atual**. Suas entradas incluem dados detalhados de tempo de rede para o documento e cada recurso carregado pela página. Isso permite que um atacante tire **conclusões sobre recursos solicitados**. Por exemplo, identificamos casos em que os navegadores não criarão entradas de desempenho para algumas solicitações. * **Atributos Legíveis**. O HTML possui vários **atributos que são legíveis cross-origin**. Esse acesso de leitura pode ser usado como uma técnica de leak. Por exemplo, o código JavaScript pode ler o número de frames incluídos em uma página web cross-origin com a propriedade window.frame.length. #### **Técnicas Baseadas em Tempo** Algumas das seguintes técnicas vão usar o tempo como parte do processo para detectar diferenças nos possíveis estados das páginas web. Existem diferentes maneiras de medir o tempo em um navegador web. **Relógios**: A API [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) permite que desenvolvedores obtenham medições de tempo de alta resolução.\ Existem um número considerável de APIs que os atacantes podem abusar para criar relógios implícitos: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), animações CSS e outros.\ Para mais informações: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/). ## XSinator XSinator é uma ferramenta automática para **verificar navegadores contra vários XS-Leaks conhecidos** explicados em seu artigo: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf)\ Você pode acessar a ferramenta em [https://xsinator.com/](https://xsinator.com/) {% hint style="warning" %} **XS-Leaks Excluídos**: Tivemos que excluir XS-Leaks que dependem de **service workers**, pois interfeririam com outros leaks no XSinator. Além disso, optamos por **excluir XS-Leaks que dependem de má configuração e bugs em uma aplicação web específica**. Por exemplo, configurações incorretas de CrossOrigin Resource Sharing (CORS), vazamento de postMessage ou Cross-Site Scripting. Adicionalmente, excluímos XS-Leaks baseados em tempo, pois muitas vezes sofrem por serem lentos, ruidosos e imprecisos. {% endhint %}
\ Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir e **automatizar fluxos de trabalho** com as ferramentas comunitárias **mais avançadas** do mundo.\ Obtenha Acesso Hoje: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} ## Técnicas de Manipulador de Eventos ### Onload/Onerror * **Métodos de Inclusão**: Frames, Elementos HTML * **Diferença Detectável**: Código de Status * **Mais informações**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) * **Resumo**: se ao tentar carregar um recurso os eventos onerror/onload são acionados com o recurso sendo carregado com sucesso/insucesso, é possível descobrir o código de status. * **Exemplo de código**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](https://xsinator.com/testing.html#Event%20Handler%20Leak%20\(Script\)) {% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} [cookie-bomb-+-onerror-xs-leak.md](xs-search/cookie-bomb-+-onerror-xs-leak.md) {% endcontent-ref %} O exemplo de código tenta **carregar objetos de scripts do JS**, mas **outras tags** como objetos, folhas de estilo, imagens, áudios também podem ser usadas. Além disso, também é possível injetar a **tag diretamente** e declarar os eventos `onload` e `onerror` dentro da tag (em vez de injetá-la do JS). Também existe uma versão sem scripts deste ataque: ```html ``` Neste caso, se `example.com/404` não for encontrado, `attacker.com/?error` será carregado. ### Tempo de Carregamento Onload * **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 poderiam ser usados, como a [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) que pode identificar tarefas executadas 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 Onload + Tarefa Pesada Forçada Esta técnica é semelhante à anterior, mas o **atacante** também irá **forçar** alguma ação para 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 unload/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 poderiam 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 **`beforeunload`** é acionado quando o navegador **solicita uma nova navegação**, enquanto **`unload`** é acionado quando essa **navegação realmente ocorre**. Devido a esse comportamento, é possível calcular a diferença de tempo entre esses dois eventos e medir o **tempo que o navegador levou para completar a busca do recurso**. ### Tempo de Carregamento de Frame com Sandbox + onload * **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/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-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 poderiam ser usados. * **Exemplo de Código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) Se uma página não tiver [Proteções de Enquadramento](https://xsleaks.dev/docs/defenses/opt-in/xfo/) implementadas, um atacante pode medir quanto tempo leva para a página e todos os subrecursos carregarem pela rede. Por padrão, o manipulador `onload` para um iframe é invocado após todos os recursos terem sido carregados e todo o JavaScript ter terminado de executar. No entanto, um atacante pode eliminar o ruído da execução de scripts incluindo o atributo [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) na tag `