# XS-Search/XS-Leaks
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:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
Aprende hacking en AWS desde cero hasta héroe conhtARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
## **Información Básica**
XS-Search es una técnica orientada a **exfiltrar información de origen cruzado** abusando de **ataques de canal lateral**.
Hay diferentes elementos en este tipo de ataque:
* **Web Vulnerable**: Es la web de la que queremos exfiltrar información.
* **Web del Atacante**: Es la web que el atacante crea conteniendo el exploit y a la que accede la víctima.
* **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 Leak**: 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.
### Diferencias Detectables
Para distinguir entre los 2 estados de la página vulnerable se pueden observar varias cosas:
* **Código de Estado**. Un atacante puede distinguir **diferentes códigos de estado de respuesta HTTP** de origen cruzado (por ejemplo, errores de servidor, errores de cliente o errores de autenticación).
* **Uso de API**. Esta diferencia detectable permite a un atacante detectar **el uso de APIs Web** a través de páginas, permitiéndole inferir si una página de origen cruzado está utilizando una API Web de JavaScript específica.
* **Redirecciones**. Es posible detectar si una aplicación web ha **navegado al usuario a una página diferente**. Esto no se limita a redirecciones HTTP, sino que también incluye redirecciones activadas por JavaScript o HTML.
* **Contenido de la Página**. Estas diferencias detectables aparecen en el cuerpo de la respuesta HTTP en sí o en sub-recursos 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.
* **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 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 directamente en la página del atacante. Si la página **no utiliza protección contra frames**, el código JavaScript puede acceder al objeto window del recurso enmarcado a través de la propiedad contentWindow.
* **Pop-ups**. El método **`window.open`** carga un recurso en una nueva pestaña o ventana del navegador. El método devuelve un **manejador de ventana** que el código JavaScript puede usar para acceder a métodos y propiedades, que cumplen con la SOP. Estos pop-ups a menudo se utilizan en el inicio de sesión único. Los navegadores modernos solo permiten pop-ups si son activados por ciertas interacciones del usuario. Para los ataques XS-Leak, este método es especialmente útil porque **evita las restricciones de framing y cookies para un recurso objetivo**. Las versiones más recientes de los navegadores agregaron recientemente medios para aislar los manejadores de ventana.
* **Solicitudes 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 Leak
* **Manejador de Eventos**. El manejador de eventos puede considerarse como la técnica de leak clásica para XS-Leaks. Son una fuente bien conocida de varias piezas de información. Por ejemplo, el disparo de **onload** indica una carga de recurso **exitosa** en contraste con el evento onerror.
* **Mensajes de Error**. Más allá 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 leak. La técnica de leak puede usar **información adicional** directamente **contenida** 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, lo mismo ocurre con 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 se puede usar como una técnica de leak**.
* **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 del atacante, se puede usar como una técnica de leak. Por ejemplo, la interfaz **History** permite la manipulación de las páginas visitadas en una pestaña o frame. Esto crea un estado global porque el **número de entradas** permite a un atacante sacar conclusiones sobre 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 tiempo 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 son legibles de origen cruzado**. Este acceso de lectura se puede utilizar como una técnica de leak. Por ejemplo, el código JavaScript puede leer el número de frames incluidos en una página web de origen cruzado con la propiedad window.frame.length.
#### **Técnicas Basadas en Tiempo**
Algunas de las siguientes técnicas van a usar 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 un número considerable de APIs 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 **comprobar navegadores contra varios XS-Leaks conocidos** explicados en su artículo: [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" %}
**XS-Leaks Excluidos**: Tuvimos que excluir XS-Leaks que dependen de **service workers** ya que interferirían con otros leaks en XSinator. Además, elegimos **excluir XS-Leaks que dependen de la mala configuración y errores en una aplicación web específica**. Por ejemplo, configuraciones erróneas de CrossOrigin Resource Sharing (CORS), fugas de postMessage o Cross-Site Scripting. Además, excluimos XS-Leaks basados en tiempo ya que a menudo sufren de ser lentos, ruidosos e inexactos.
{% endhint %}
\
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:
{% 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**: Frames, 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 al intentar cargar un recurso se activan los eventos onerror/onload cuando el recurso se carga con éxito/fracaso, es posible 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 scripts desde JS**, pero **otros tags** como objetos, hojas de estilo, imágenes, audios también podrían ser utilizados. Además, también es posible inyectar el **tag directamente** y declarar los eventos `onload` y `onerror` dentro del tag (en lugar de inyectarlo desde JS).
También hay una versión sin scripts de este ataque:
```html
```
En este caso, si `example.com/404` no se encuentra, se cargará `attacker.com/?error`.
### Tiempo de Carga Onload
* **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()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) se puede utilizar para medir cuánto tiempo toma realizar una solicitud. Sin embargo, se podrían usar otros relojes, como la [**API PerformanceLongTaskTiming**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) que puede identificar tareas que se ejecutan por más de 50 ms.
* **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 Onload + Tarea Pesada Forzada
Esta técnica es como 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/beforeunload
* **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 toma realizar una solicitud. Se podrían usar otros relojes.
* **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 toma obtener un recurso. Esto funciona porque **`beforeunload`** se activa cuando el navegador **solicita una nueva 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 Carga en Marco Aislado + onload
* **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()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) se puede utilizar para medir cuánto tiempo toma realizar una solicitud. Se podrían usar 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 [Protecciones de Enmarcado](https://xsleaks.dev/docs/defenses/opt-in/xfo/) implementadas, un atacante puede medir cuánto tiempo toma cargar la página y todos los subrecursos a través de la red. Por defecto, el manejador `onload` para un iframe se invoca después de que todos los recursos se han cargado y todo el JavaScript ha terminado de ejecutarse. Pero, 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 `