Cross-Site Scripting (XSS Almacenado)

En la solicitud POST analizada, observamos que se está enviando una petición al endpoint /System/guardar.php para crear un nuevo usuario en el sistema. Esta petición contiene varios parámetros que probablemente corresponden a los datos que se capturan desde un formulario de registro en la aplicación web. A continuación, se presenta un análisis general de los parámetros:

Parámetros Clave:

  • Usuario: El correo electrónico del usuario que se está creando (eliasib@spartan.com).

  • nombre_user: Nombre del usuario (eliasib).

  • apellido_user: Apellido del usuario (gerardo).

  • identi_user: Un identificador único (probablemente número de identificación o similar: 3104121).

  • pass_user: La contraseña del usuario en texto claro (P@ssword123). Este es un punto importante a considerar desde una perspectiva de seguridad, ya que la contraseña está siendo enviada sin cifrar dentro de la petición HTTP.

  • rol_user: Este parámetro parece estar relacionado con el rol o privilegios del usuario dentro del sistema (rol_user=0). Este valor numérico podría representar diferentes niveles de acceso, donde 0 podría ser un rol básico o sin privilegios elevados.

El parámetro rol_user es especialmente interesante. Al ser parte de los datos enviados para la creación de un nuevo usuario, existe la posibilidad de que manipulando este valor podamos obtener un escalamiento de privilegios. Si el sistema no valida adecuadamente este parámetro, podríamos probar diferentes valores, como 1 o admin, para intentar asignar al usuario creado un rol más privilegiado, como administrador o superusuario.

Aunque no profundizaremos en este momento en la explotación de esta vulnerabilidad potencial, en sesiones posteriores podríamos enfocarnos en cómo probar diferentes valores en este parámetro para evaluar si es posible modificar los privilegios del usuario y obtener un acceso no autorizado a funciones más críticas del sistema.

Introducción al Cross-Site Scripting (XSS)

El Cross-Site Scripting (XSS) es una vulnerabilidad común en aplicaciones web que permite a un atacante inyectar código malicioso (generalmente scripts JavaScript) en las páginas web vistas por otros usuarios. Este tipo de ataque puede ser utilizado para robar cookies de sesión, realizar acciones en nombre de otro usuario o ejecutar scripts maliciosos en el navegador de la víctima.

Existen varios tipos de XSS, pero nos enfocaremos en XSS persistente, que ocurre cuando la entrada maliciosa es almacenada en el servidor y luego se muestra a otros usuarios de la aplicación, incluidos los administradores. Este tipo de vulnerabilidad es especialmente peligroso porque afecta a cualquier usuario que visite la página vulnerable.

Evaluación de la Petición de Creación de Usuarios

En la petición POST de creación de usuarios analizada previamente, observamos que uno de los parámetros enviados al servidor es el campo nombre_user, que captura el nombre del usuario a crear. Este es un ejemplo típico de un campo de entrada que podría ser explotado para un ataque XSS si el servidor no implementa las validaciones y filtrados adecuados.

En este caso, el valor del parámetro nombre_user (eliasib) será almacenado en la base de datos del servidor y, posteriormente, mostrado en el DOM (Document Object Model) de las páginas web cuando el usuario inicie sesión o cuando un administrador acceda al panel correspondiente. Esto significa que, si el valor ingresado en nombre_user contiene código malicioso, este será ejecutado en el navegador de cualquier usuario que vea esa información.

Ejemplo de Ataque XSS Persistente

Imaginemos que, en lugar de ingresar un nombre legítimo como eliasib, un atacante envía la siguiente carga maliciosa en el campo nombre_user:

<script>alert('XSS');</script>

La nueva petición se vería de la siguiente manera:

Si el servidor no escapa o valida correctamente los datos ingresados en el campo nombre_user, este código será almacenado en la base de datos y se mostrará en cualquier página que utilice este dato, como por ejemplo el perfil del usuario o un panel administrativo que cargue el nombre del usuario recién creado.

Comportamiento en el DOM

Cuando un usuario legítimo o un administrador acceda al sistema, el valor de nombre_user será cargado y renderizado en el DOM del navegador sin ser modificado. Esto provocará la ejecución del código JavaScript inyectado, en este caso, mostrando una alerta de XSS:

El escenario más peligroso para un XSS persistente ocurre cuando la información inyectada en el campo nombre_user es mostrada no solo al propio usuario, sino también en paneles administrativos u otras páginas con altos privilegios. Por ejemplo, si un administrador accede a una página donde se muestran los nombres de los usuarios creados, el código malicioso inyectado se ejecutará en su navegador con sus privilegios.

Esto podría permitir al atacante ejecutar acciones administrativas sin necesidad de autenticar o realizar solicitudes manuales, aprovechándose del XSS para escalar sus privilegios dentro del sistema.

Last updated