JF0x0r's Blog
PortfolioBug Hunter ProfileGithub
  • Whoami
  • Aprender Go
    • 🐺¿Qué es GO 🦊
    • 🧠Packages
    • 🎃Modules
    • 🐢Variable - Tipos de Datos
    • 🧌Operadores Matematicos - Lógicos
    • 🥥Flujo If, For, While, Switch
    • 🌼Struct - Methods vs Functions
    • 📽️POO (Programming Oriented Object)
    • 🐯Interface - Interfaces
    • 🎱Punteros * &
    • 🐸Vectores/Arrays, Slices y Maps
    • 🫀El uso de Make en channels, slices, maps
    • 🧛‍♀️Errores en Go - Uso de err ≠ nil
    • 👁️GO Defer
    • 🦷GO Panic
    • 🦋GO Recover
    • 🐦Structs
    • 🐔WaitGroups Go
  • Pentester Lab
  • Guía de Estudio Hacking
  • Bug Bounty
    • 🍓Adobe
    • 🚀Nasa VDP
    • 🧀Figma
      • 🐙User Enumeration via Authentication Flow - Email Exposure
    • 🫐Syfe
    • 🍉Etoro
    • 🥭Glance Networks
  • PortSwigger WebAcademy
    • Server Side Topics
      • SQL Injection
        • 🐔Laboratorio: Inyección SQL ciega
        • 🍫Laboratorio: Datos Ocultos - Aprendiz
        • 🦍Laboratorio: Omitir inicio de sesión Bypass
        • 🔏Laboratorio: Calcular numero Columnas con UNION
        • 🪖Laboratorio: ataque UNION de inyección SQL , búsqueda de una columna que contiene texto
        • 🐧Laboratorio: ataque UNION de inyección SQL , recuperando datos de otras tablas
        • 🧛Laboratorio: ataque UNION de inyección SQL , recuperando múltiples valores en una sola columna
        • 🐬Laboratorio: Inyección SQL con errores condicionales
        • 🐈‍⬛Laboratorio: Inyección SQL basada en errores visibles
        • 💃Laboratorio: Inyección SQL ciega con retrasos de tiempo
        • 🐆Laboratorio: Inyección SQL ciega con retardos de tiempo y recuperación de información
        • 👑Laboratorio: Inyección SQL ciega con interacción fuera de banda
        • 🏞️Laboratorio: ataque de inyección SQL, consulta del tipo y versión de la base de datos en Oracle
        • 🪻Laboratorio: ataque SQLi, consulta del tipo y versión de la base de datos en MySQL y Microsoft
        • 💀Laboratorio: ataque de inyección SQL, enumerando el contenido de la base de datos en bases de datos
        • 🧀Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
      • Authentication
        • 🐟Laboratorio: Enumeracion de usernames via diferentes responses
        • 👩‍🦽Laboratorio: enumeración de nombres de usuario a través de respuestas sutilmente diferentes
        • ™️Laboratorio: enumeración de nombres de usuario mediante tiempos de respuesta
        • 🦷Laboratorio: protección de fuerza bruta rota, bloqueo de IP
        • 🧢Laboratorio: enumeración de nombres de usuario mediante bloqueo de cuenta
        • 🦠Laboratorio: protección de fuerza bruta rota, múltiples credenciales por solicitud
        • 🐛Laboratorio: bypass simple 2FA
        • 🐯Laboratorio: lógica rota 2FA
        • 👓Laboratorio: 2FA bypass usando un ataque por fuerza bruta
        • 👽Lab: Brute-forcing a stay-logged-in cookie
        • 🦋Laboratorio: Offline password cracking
        • 🧌Laboratorio: Password reset broken logic
        • 👁️Laboratorio: Basic password reset poisoning
        • 👂Laboratorio: Password reset poisoning via middleware
        • 🥻Laboratorio: Fuerza bruta de contraseña mediante cambio de contraseña
        • 🫁Laboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantes
      • Path Traversal
        • 🛻Laboratorio: File path traversal, simple case
        • 🦅Laboratorio: File path traversal, traversal sequences blocked with absolute path bypass
        • 🦉Laboratorio: recorrido de ruta de archivo , secuencias transversales eliminadas de forma no recursiv
        • 🍊Laboratorio: File path traversal, traversal sequences stripped with superfluous URL-decode
        • 🕷️Laboratorio: File path traversal, validation of file extension with null byte bypass
      • Command Injection OS
        • 🖥️Laboratorio: OS command injection, simple case
        • 🐹Laboratorio: Blind OS command injection with time delays
        • 👹Blind OS command injection with output redirection
        • 🧛‍♂️Laboratorio: Inyección ciega de comandos del SO con exfiltración de datos fuera de banda
        • 🦟Laboratorio: Inyección ciega de comandos del sistema operativo con interacción fuera de banda
      • Business Logic Vulnerabilities
        • 🧝‍♂️Laboratorio: Confianza excesiva en los controles del lado del cliente
        • 🧙‍♂️Laboratorio: Vulnerabilidad lógica de alto nivel
        • 🤩Laboratorio: Vulnerabilidad falla lógica de bajo nivel
        • 🎻Laboratorio: Manejo inconsistente de entradas excepcionales
        • 🏓Laboratorio: Inconsistent security controls
        • 🥭Laboratorio: Aislamiento débil en terminales de doble uso
        • 🧑‍✈️Laboratorio: Validación de flujo de trabajo insuficiente
        • 📀Laboratorio: Omisión de autenticación a través de una máquina de estado defectuosa
        • 🐦‍⬛Laboratorio: Aplicación defectuosa de las reglas comerciales
        • 🌵Laboratorio: falla en la lógica del dinero infinito
        • 🥑Laboratorio: omisión de autenticación mediante Oracle de cifrado
        • 🧊Lab: Bypassing access controls using email address parsing discrepancies
      • Information Disclosure Vulnerabilities
        • 🧟Laboratorio: Divulgación de información en mensajes de error
        • 🌵Laboratorio: divulgación de información en la página de depuración
        • 🍅Laboratorio: Divulgación del código fuente a través de archivos de respaldo
        • 🤿Laboratorio: omisión de autenticación mediante divulgación de información
        • 🏑Laboratorio: Divulgación de información en el historial de control de versiones
      • SSRF - Server-Side Request Forgery
        • 🧅Laboratorio: SSRF básico frente a otro sistema back-end
        • 🐮Laboratorio: SSRF con filtro de entrada basado en lista negra
        • 🌶️Laboratorio: SSRF con filtro de entrada basado en lista blanca
        • 💽Laboratorio: SSRF with filter bypass via open redirection vulnerability
        • ☎️Laboratorio: SSRF ciega con detección fuera de banda
        • 🥬Laboratorio: SSRF ciega con explotación Shellshock
        • 🐦Laboratorio: SSRF básico contra el servidor local
      • Acess Control
        • 🍑Laboratorio: funcionalidad de administración desprotegida
        • 🍉Laboratorio: funcionalidad de administración desprotegida con URL impredecible
        • 🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
        • 🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
        • 🐴Laboratorio: el control de acceso basado en URL se puede eludir
        • 🍋Laboratorio: El control de acceso basado en métodos se puede eludir
        • 🎾Laboratorio: ID de usuario controlado por parámetro de solicitud
        • 🧆Laboratorio: ID de usuario controlado por parámetro de solicitud, con ID de usuario impredecibles
        • 🦑Laboratorio: ID de usuario controlado por parámetro de solicitud con fuga de datos en redirección
        • 😎Laboratorio: ID de usuario controlado por parámetro de solicitud con divulgación de contraseña
        • 🍗Laboratorio: Referencias directas a objetos inseguros
        • 🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
        • ⛄Laboratorio: Control de acceso basado en referentes
      • File Upload Vulnerabilities
        • 🛼Laboratorio: ejecución remota de código mediante carga de shell web
        • 🥦Laboratorio: carga de shell web mediante omisión de restricción de tipo de contenido
        • ⛵Laboratorio: carga de shell web mediante recorrido de ruta
        • 🛝Laboratorio: carga de shell web mediante omisión de la lista negra de extensiones
        • ⚾Laboratorio: carga de shell web a través de una extensión de archivo ofuscada
        • 🪖Laboratorio: carga de shell web mediante condición de carrera
      • Web Cache Deception
        • 🧀Laboratorio: Explotación del mapeo de rutas para el engaño de caché web
        • 🍨Laboratorio: Explotación de delimitadores de ruta para el engaño de caché web (v2)
        • 🪇Laboratorio: Explotación de la normalización del servidor de origen para el engaño de la caché web
        • 🍺Laboratorio: Explotación de la normalización del servidor de caché para el engaño de la caché web
        • ⚽Laboratorio: Explotación de reglas de caché de coincidencia exacta para el engaño de caché web
      • API Testing
        • 🥨Laboratorio: Explotación de un punto final de API mediante documentación
        • 🛝Laboratorio: Cómo encontrar y explotar un punto final de API no utilizado
        • 🧤Laboratorio: Explotación de una vulnerabilidad de asignación masiva
        • 🍒Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una cadena de co
        • 🥕Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL REST
      • XXE Injection - XML Entity
        • 🏸Laboratorio: Exploiting XXE using external entities to retrieve files
        • 🥾Laboratorio: Exploiting XXE to perform SSRF attacks
        • 🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
        • 🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
        • 🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • 👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
        • 🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
        • 🫀Laboratorio: Exploiting XInclude to retrieve files
        • 👁️Laboratorio: Exploiting XXE via image file upload
      • Race Conditions
        • 🗣️Mutexes Golang
        • ⛸️Laboratorio: Limit overrun race conditions
        • 👽Laboratorio: Bypassing rate limits via race conditions
        • 👩‍🦯Laboratorio: Multi-endpoint race conditions
        • 🧢Laboratorio: Single-Endpoint Race Conditions
        • 🐛Laboratorio: Partial Construction Race Condition
        • 🔩Laboratorio: Exploiting time-sensitive vulnerabilities
      • No-SQL Injection
        • 🪱Laboratorio: Detecting NoSQL injection
        • 💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
        • 🪖Laboratorio: Exploiting NoSQL injection to extract data
        • 🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields
    • Client Side Topics
      • Cross-site scripting (XSS)
        • XSS Reflected
          • ⛑️Laboratorio: XSS reflejado en contexto HTML sin nada codificado
        • XSS Based DOM
          • 🍖Laboratorio: DOM XSS en document.write, el receptor usando la fuente location.search
        • XSS Stored
          • 🪢Laboratorio: Stored XSS into HTML context with nothing encoded
          • 🥌Laboratorio: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded
    • Advanced Topics
      • 0Auth
      • Insecure Deserialization
        • 🧀Laboratorio: Modificar objetos en serie
        • 🧅Laboratorio: Modificar los tipos de datos en serie
        • 🎋Laboratorio: Usando funcionalidad de la aplicación para explotar la desserialización insegura
        • 🎯Laboratorio: Inyección arbitraria de objetos en PHP
        • 🍿Laboratorio: Inyección arbitraria de objetos en PHP
        • 🕸️Laboratorio: Exploiting Java deserialization with Apache Commons
        • 🥷Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain
        • 🏈Laboratorio: Exploiting Ruby deserialization using a documented gadget chain
        • 🎄Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
        • 👨‍🦽Laboratorio: Desarrollo una cadena de gadget personalizada para la deserialización de PHP
  • Hacking Certifications
    • ACP - APISec University
      • 🌍API Security Fundamentals 2025
      • 🫀OWASP API Security Top 10 and Beyond!
      • 🏓API Authentication
      • 🥥API Documentation Best Practices
      • 🌲Securing API Servers
Powered by GitBook
On this page
  • Scripts entre sitios almacenados
  • ¿Qué son los scripts entre sitios almacenados?
  • Impacto de los ataques XSS almacenados
  • XSS almacenado en diferentes contextos
  • Los puntos de salida de los ataques XSS almacenados son todas las posibles respuestas HTTP que se devuelven a cualquier tipo de usuario de la aplicación en cualquier situación.
  1. PortSwigger WebAcademy
  2. Client Side Topics
  3. Cross-site scripting (XSS)

XSS Stored

Scripts entre sitios almacenados

El XSS almacenado (también conocido como XSS persistente o de segundo orden) surge cuando una aplicación recibe datos de una fuente no confiable e incluye esos datos dentro de sus respuestas HTTP posteriores de manera insegura.

Los datos en cuestión pueden enviarse a la aplicación a través de solicitudes HTTP; por ejemplo, comentarios en una publicación de blog, apodos de usuarios en una sala de chat o detalles de contacto en un pedido de un cliente. En otros casos, los datos pueden llegar de otras fuentes no confiables; por ejemplo, una aplicación de correo web que muestra mensajes recibidos a través de SMTP, una aplicación de marketing que muestra publicaciones en redes sociales o una aplicación de monitoreo de red que muestra datos de paquetes del tráfico de red.

A continuación se muestra un ejemplo sencillo de una vulnerabilidad XSS almacenada. Una aplicación de foro de mensajes permite a los usuarios enviar mensajes que se muestran a otros usuarios:

<p>Hello, this is my message!</p>

La aplicación no realiza ningún otro procesamiento de los datos, por lo que un atacante puede enviar fácilmente un mensaje que ataque a otros usuarios:

<p><script>/* Bad stuff here... */</script></p>

¿Qué son los scripts entre sitios almacenados?

Los scripts entre sitios almacenados (también conocidos como XSS de segundo orden o persistentes) surgen cuando una aplicación recibe datos de una fuente que no es confiable e incluye esos datos dentro de sus respuestas HTTP posteriores de manera insegura.

Supongamos que un sitio web permite a los usuarios enviar comentarios en publicaciones de blogs, que se muestran a otros usuarios. Los usuarios envían comentarios mediante una solicitud HTTP como la siguiente:

POST /post/comment HTTP/1.1
Host: vulnerable-website.com
Content-Length: 100

postId=3&comment=This+post+was+extremely+helpful.&name=Carlos+Montoya&email=carlos%40normal-user.net

Una vez enviado este comentario, cualquier usuario que visite la publicación del blog recibirá lo siguiente dentro de la respuesta de la aplicación:

<p>This post was extremely helpful.</p>

Suponiendo que la aplicación no realiza ningún otro procesamiento de los datos, un atacante puede enviar un comentario malicioso como este:

<script>/* Bad stuff here... */</script>

Dentro de la solicitud del atacante, este comentario estaría codificado en URL como:

comment=%3Cscript%3E%2F*%2BBad%2Bstuff%2Bhere...%2B*%2F%3C%2Fscript%3E

Cualquier usuario que visite la publicación del blog ahora recibirá lo siguiente dentro de la respuesta de la aplicación:

<p><script>/* Bad stuff here... */</script></p>

El script proporcionado por el atacante se ejecutará luego en el navegador del usuario víctima, en el contexto de su sesión con la aplicación.

Impacto de los ataques XSS almacenados

Si un atacante puede controlar un script que se ejecuta en el navegador de la víctima, por lo general puede comprometer por completo a ese usuario. El atacante puede llevar a cabo cualquiera de las acciones que se aplican al impacto de las vulnerabilidades XSS reflejadas .

En términos de explotabilidad, la diferencia clave entre XSS reflejado y almacenado es que una vulnerabilidad XSS almacenada permite ataques que están contenidos dentro de la propia aplicación. El atacante no necesita encontrar una forma externa de inducir a otros usuarios a realizar una solicitud particular que contenga su exploit. En lugar de eso, el atacante coloca su exploit en la propia aplicación y simplemente espera a que los usuarios lo encuentren.

La naturaleza autónoma de los exploits de secuencias de comandos entre sitios almacenados es particularmente relevante en situaciones en las que una vulnerabilidad XSS solo afecta a los usuarios que están conectados a la aplicación. Si el XSS se refleja, entonces el ataque debe tener un momento fortuito: un usuario que se vea inducido a realizar la solicitud del atacante en un momento en el que no esté conectado no se verá comprometido. Por el contrario, si el XSS se almacena, entonces se garantiza que el usuario estará conectado en el momento en que se encuentre con el exploit.

XSS almacenado en diferentes contextos

Existen muchas variedades diferentes de secuencias de comandos entre sitios almacenadas. La ubicación de los datos almacenados dentro de la respuesta de la aplicación determina qué tipo de carga útil se requiere para explotarla y también puede afectar el impacto de la vulnerabilidad.

Además, si la aplicación realiza alguna validación u otro procesamiento de los datos antes de almacenarlos, o en el momento en que los datos almacenados se incorporan a las respuestas, esto generalmente afectará qué tipo de carga útil XSS se necesita.

Los puntos de salida de los ataques XSS almacenados son todas las posibles respuestas HTTP que se devuelven a cualquier tipo de usuario de la aplicación en cualquier situación.

El primer paso para comprobar las vulnerabilidades XSS almacenadas es localizar los vínculos entre los puntos de entrada y salida, por los que los datos enviados a un punto de entrada se emiten desde un punto de salida. Las razones por las que esto puede resultar complicado son las siguientes:

  • En principio, los datos enviados a cualquier punto de entrada podrían emitirse desde cualquier punto de salida. Por ejemplo, los nombres de usuario proporcionados por el usuario podrían aparecer en un registro de auditoría poco claro que solo es visible para algunos usuarios de la aplicación.

  • Los datos que la aplicación almacena actualmente suelen ser vulnerables a que se sobrescriban debido a otras acciones que se realizan dentro de la aplicación. Por ejemplo, una función de búsqueda puede mostrar una lista de búsquedas recientes, que se reemplazan rápidamente a medida que los usuarios realizan otras búsquedas.

Para identificar de forma exhaustiva los vínculos entre los puntos de entrada y salida, sería necesario probar cada permutación por separado, enviar un valor específico al punto de entrada, navegar directamente al punto de salida y determinar si el valor aparece allí. Sin embargo, este enfoque no es práctico en una aplicación con más de unas pocas páginas.

En cambio, un enfoque más realista consiste en trabajar sistemáticamente a través de los puntos de entrada de datos, enviando un valor específico a cada uno de ellos y monitoreando las respuestas de la aplicación para detectar casos en los que aparezca el valor enviado. Se puede prestar especial atención a las funciones relevantes de la aplicación, como los comentarios en las publicaciones de blogs. Cuando se observa el valor enviado en una respuesta, es necesario determinar si los datos se almacenan en realidad en diferentes solicitudes, en lugar de simplemente reflejarse en la respuesta inmediata.

Cuando haya identificado vínculos entre los puntos de entrada y salida en el procesamiento de la aplicación, cada vínculo debe probarse específicamente para detectar si existe una vulnerabilidad XSS almacenada. Esto implica determinar el contexto dentro de la respuesta donde aparecen los datos almacenados y probar cargas útiles XSS candidatas adecuadas que sean aplicables a ese contexto. En este punto, la metodología de prueba es en líneas generales la misma que para encontrar vulnerabilidades XSS reflejadas .

https://portswigger.net/web-security/cross-site-scripting/contexts

Cross-site scripting contexts | Web Security Academy

Hacer uso de la codificación HTML

Cuando el contexto XSS es algún JavaScript existente dentro de un atributo de etiqueta entre comillas, como un controlador de eventos, es posible utilizar la codificación HTML para evitar algunos filtros de entrada.

Cuando el navegador haya analizado las etiquetas y atributos HTML dentro de una respuesta, realizará una decodificación HTML de los valores de los atributos de las etiquetas antes de que se procesen más. Si la aplicación del lado del servidor bloquea o desinfecta ciertos caracteres que son necesarios para una explotación XSS exitosa, a menudo puede omitir la validación de entrada codificando esos caracteres en HTML.

Por ejemplo, si el contexto XSS es el siguiente:

<a href="#" onclick="... var input='controllable data here'; ...">

y la aplicación bloquea o escapa de los caracteres de comillas simples, puede usar la siguiente carga útil para salir de la cadena de JavaScript y ejecutar su propio script:

&apos;-alert(document.domain)-&apos;

La &apos;secuencia es una entidad HTML que representa un apóstrofo o una comilla simple. Debido a que el navegador decodifica en HTML el valor del onclickatributo antes de que se interprete el código JavaScript, las entidades se decodifican como comillas, que se convierten en delimitadores de cadena, y por lo tanto el ataque tiene éxito.

PreviousLaboratorio: DOM XSS en document.write, el receptor usando la fuente location.searchNextLaboratorio: Stored XSS into HTML context with nothing encoded

Last updated 7 months ago