Ya vimos la primera parte de este tutorial, ahora vamos a expandirlo y enfocarnos en buscar formas de inseguridad y seguridad en la temática XSS.
Un XSS es un tipo de vulnerabilidad surgida como consecuencia de errores de filtrado de las entradas del usuario en aplicaciones web.
Estos ataques se aprovechan de la confianza del usuario en la aplicación, el atacante inyecta código JavaScript en nuestra web.
¿Qué se puede lograr mediante un ataque XSS?
Existen dos tipos de ataques que se pueden realizar con XSS los cuales son:
Persistentes
Son “menos” frecuentes, son datos introducidos por el usuario y son almacenados de manera PERSISTENTE (db) y utilizados para generar una página HTML.
Reflejados
Son los más frecuentes, son datos introducidos por el usuario y son utilizados INMEDIATAMENTE para generar una página HTML.
un pequeño ejemplo sería con la utilización de un formulario como este:
ejemplo1.php ejemplo1-2.php En el ejemplo1.php se presenta una encuesta, luego de seleccionar alguna opción, los datos son enviados a la página “ejemplo12.php” , en donde se los imprime.
Este simple ejemplo permite inyectar código XSS, debido a que la variable no está filtrada, un ejemplo de inyección podría ser:
Digamos que el usuario necesita rellenar un formulario, para que luego esta información se guarde en una base de datos ó archivo.
Y tenemos algo como lo siguiente:
formularioxss.php Ahora debemos procesar esos datos que se van a introducir para eso tenemos:
guardar.php El php es vulnerable ya que no tiene ningún filtro de seguridad para evitar inyecciones y al introducir código malicioso en vez de datos ocurriría fallos en la página.
Ahora vamos y abrimos el archivo "almacen.html" y podemos observar que se dejo pasar el código malicioso:
Ahora debemos aplicar seguridad, hagamoslo editando el archivo "guardar.php" y dejándolo de esta forma: Y ahora el resultado sería:
La variable predefinida $_GET se utiliza para recoger los valores en un formulario con method="get".
Ejemplo
Cuando el usuario hace clic en el botón "Enviar", la URL enviada al servidor podría ser algo como esto: El "validar.php" puede utilizar la variable $_GET para recoger los datos del formulario (los nombres de los campos del formulario será automáticamente las claves de la matriz $_GET):
validar.php El método de inyección de este ejemplo es el siguiente: Y el resultado sería:
Aplicando la seguridad de htmlspecialchars() la estructura php sería así: Y el resultado libre de cualquier peligro sería así:
También aprovecho para exponer lo peligroso que es utilizar la variable $PHP_SELF, entonces tenemos un ejemplo como este: La url para atacar la vulnerabilidad sería así:
XSS - Cross Site Scripting
Estos ataques se aprovechan de la confianza del usuario en la aplicación, el atacante inyecta código JavaScript en nuestra web.
¿Qué se puede lograr mediante un ataque XSS?
- Robar las cookies de un usuario y entrar en su lugar.
- Mostrar una página falsa de login en tu web (phishing).
- Llevar a cabo cualquier acción como si fuera otro usuario.
- Malograr y modificar la página vulnerable.
Dos tipos de ataques XSS
Existen dos tipos de ataques que se pueden realizar con XSS los cuales son:
Persistentes
Son “menos” frecuentes, son datos introducidos por el usuario y son almacenados de manera PERSISTENTE (db) y utilizados para generar una página HTML.
Reflejados
Son los más frecuentes, son datos introducidos por el usuario y son utilizados INMEDIATAMENTE para generar una página HTML.
Ejemplo XSS
un pequeño ejemplo sería con la utilización de un formulario como este:
ejemplo1.php ejemplo1-2.php En el ejemplo1.php se presenta una encuesta, luego de seleccionar alguna opción, los datos son enviados a la página “ejemplo12.php” , en donde se los imprime.
Este simple ejemplo permite inyectar código XSS, debido a que la variable no está filtrada, un ejemplo de inyección podría ser:
Otro ejemplo XSS
Digamos que el usuario necesita rellenar un formulario, para que luego esta información se guarde en una base de datos ó archivo.
Y tenemos algo como lo siguiente:
formularioxss.php Ahora debemos procesar esos datos que se van a introducir para eso tenemos:
guardar.php El php es vulnerable ya que no tiene ningún filtro de seguridad para evitar inyecciones y al introducir código malicioso en vez de datos ocurriría fallos en la página.
Ahora vamos y abrimos el archivo "almacen.html" y podemos observar que se dejo pasar el código malicioso:
Ahora debemos aplicar seguridad, hagamoslo editando el archivo "guardar.php" y dejándolo de esta forma: Y ahora el resultado sería:
La variable $_GET
La variable predefinida $_GET se utiliza para recoger los valores en un formulario con method="get".
Ejemplo
Cuando el usuario hace clic en el botón "Enviar", la URL enviada al servidor podría ser algo como esto: El "validar.php" puede utilizar la variable $_GET para recoger los datos del formulario (los nombres de los campos del formulario será automáticamente las claves de la matriz $_GET):
validar.php El método de inyección de este ejemplo es el siguiente: Y el resultado sería:
Aplicando la seguridad de htmlspecialchars() la estructura php sería así: Y el resultado libre de cualquier peligro sería así:
$PHP_SELF
También aprovecho para exponer lo peligroso que es utilizar la variable $PHP_SELF, entonces tenemos un ejemplo como este: La url para atacar la vulnerabilidad sería así: