*************************************************************************************************
Serialized SQL Injection (Parte I de VI)
Serialized SQL Injection (Parte II de VI)
Serialized SQL Injection (Parte III de VI)
Serialized SQL Injection (Parte IV de VI)
Serialized SQL Injection (Parte V de VI)
Serialized SQL Injection (Parte VI de VI)
*************************************************************************************************
Introducción
Sobre SQL Injection se ha escrito mucho, pero aun así continúan saliendo nuevos entornos, nuevas posibilidades o nuevos riesgos asociados a esta técnica de inyección. El presente artículo va dedicado a la extracción de datos mediante la serialización de datos en la respuesta.
La idea de esta técnica viene determinada por el siguiente entorno: Imaginemos una aplicación vulnerable a SQL injection en la que se puede poner un Union para que imprima un campo, pero sólo un campo.
La pregunta es: ¿cómo se accede a toda la base de datos de forma rápida y en pocas inyecciones? Hasta el momento la respuesta era ir sacando poco a poco toda la información, campo a campo. A Dani Kachakil se le ocurrió que se podría mejorar esto en Microsoft SQL Server serializando los resultados de la consulta a un string XML con la función For XML. Palako la adaptó para MySQL utilizando Concat y Group_Contact y Alex con XMLForest, XMLElement y SYS_XMLAGG la portó a Oracle. Además, cuando se hizo pública esta técnica pudimos ver como Alexander Kornbrust hacía algo similar en los mensajes de error de Oracle. Vamos a verlo por partes.
Microsoft SQL Server 2000, 2005 y 2008: Claúsula Fox XML
En Microsoft SQL Server 2000 existe la claúsula FOR XML para que el programador pueda recuperar todos los resultados obtenidos tras la ejecución de una consulta SQL como un documento XML. Esta claúsula ha sido mejorada y mantenida en SQL Server 2005 y 2008. Este documento XML devuelto tiene la característica de ser tratado como una única cadena de string, con lo cual es a efectos finales un único registro de un único campo.
Supongamos una tabla T1 con las columnas A y B. Si se ejecuta un Select * from T1 la consulta devolverá 2 registros con 2 campos cada registro. Esto, lógicamente, no sería estructuralmente correcto en una sentencia de tipo UNION. En nuestro entorno tenemos una aplicación que sólo procesa un registro, para sacar información de un empleado. El parámetro vulnerable es id.
Imagen 1: Portal vulnerable a SQL Injection
Si hacemos una inyección con la claúsula UNION vemos que podemos imprimir un dato en el campo Description.
Imagen 2: Inyección UNION funcionando para imprimir un dato
Con este entorno, si intentamos realizar ahora una inyección que devuelva más de un registro obtendremos un error y ningún dato.
Imagen 3: Error intentando acceder a los nombre de los usuarios
Volviendo al ejemplo anterior de la tabla T1 con dos campos y dos registros, si ejecutaramos la misma inyección aplicando la claúsula FOR XML, es decir, de la forma Select * from T1 for xml raw, la respuesta estará formada por 1 registro de 1 campo de tipo string. Ese campo estará formado por un documento XML que representa los dos registros con sus dos columnas. En el ejemplo de extraer la lista de todos los usuarios que falla en la Imagen 3, veremos cómo se ejecuta en la siguiente imagen.
Imagen 4: Inyección for xml raw
Como se puede apreciar, los datos, al estar en formato XML no pueden ser vistos en la renderización de la página, pero si miramos al código fuente se puede acceder a toda la información en formato XML.
Imagen 5: Lista de nombre de usuarios
*************************************************************************************************
Serialized SQL Injection (Parte I de VI)
Serialized SQL Injection (Parte II de VI)
Serialized SQL Injection (Parte III de VI)
Serialized SQL Injection (Parte IV de VI)
Serialized SQL Injection (Parte V de VI)
Serialized SQL Injection (Parte VI de VI)
*************************************************************************************************
Serialized SQL Injection (Parte I de VI)
Serialized SQL Injection (Parte II de VI)
Serialized SQL Injection (Parte III de VI)
Serialized SQL Injection (Parte IV de VI)
Serialized SQL Injection (Parte V de VI)
Serialized SQL Injection (Parte VI de VI)
*************************************************************************************************
Introducción
Sobre SQL Injection se ha escrito mucho, pero aun así continúan saliendo nuevos entornos, nuevas posibilidades o nuevos riesgos asociados a esta técnica de inyección. El presente artículo va dedicado a la extracción de datos mediante la serialización de datos en la respuesta.
La idea de esta técnica viene determinada por el siguiente entorno: Imaginemos una aplicación vulnerable a SQL injection en la que se puede poner un Union para que imprima un campo, pero sólo un campo.
La pregunta es: ¿cómo se accede a toda la base de datos de forma rápida y en pocas inyecciones? Hasta el momento la respuesta era ir sacando poco a poco toda la información, campo a campo. A Dani Kachakil se le ocurrió que se podría mejorar esto en Microsoft SQL Server serializando los resultados de la consulta a un string XML con la función For XML. Palako la adaptó para MySQL utilizando Concat y Group_Contact y Alex con XMLForest, XMLElement y SYS_XMLAGG la portó a Oracle. Además, cuando se hizo pública esta técnica pudimos ver como Alexander Kornbrust hacía algo similar en los mensajes de error de Oracle. Vamos a verlo por partes.
Microsoft SQL Server 2000, 2005 y 2008: Claúsula Fox XML
En Microsoft SQL Server 2000 existe la claúsula FOR XML para que el programador pueda recuperar todos los resultados obtenidos tras la ejecución de una consulta SQL como un documento XML. Esta claúsula ha sido mejorada y mantenida en SQL Server 2005 y 2008. Este documento XML devuelto tiene la característica de ser tratado como una única cadena de string, con lo cual es a efectos finales un único registro de un único campo.
Supongamos una tabla T1 con las columnas A y B. Si se ejecuta un Select * from T1 la consulta devolverá 2 registros con 2 campos cada registro. Esto, lógicamente, no sería estructuralmente correcto en una sentencia de tipo UNION. En nuestro entorno tenemos una aplicación que sólo procesa un registro, para sacar información de un empleado. El parámetro vulnerable es id.
Imagen 1: Portal vulnerable a SQL Injection
Si hacemos una inyección con la claúsula UNION vemos que podemos imprimir un dato en el campo Description.
Imagen 2: Inyección UNION funcionando para imprimir un dato
Con este entorno, si intentamos realizar ahora una inyección que devuelva más de un registro obtendremos un error y ningún dato.
Imagen 3: Error intentando acceder a los nombre de los usuarios
Volviendo al ejemplo anterior de la tabla T1 con dos campos y dos registros, si ejecutaramos la misma inyección aplicando la claúsula FOR XML, es decir, de la forma Select * from T1 for xml raw, la respuesta estará formada por 1 registro de 1 campo de tipo string. Ese campo estará formado por un documento XML que representa los dos registros con sus dos columnas. En el ejemplo de extraer la lista de todos los usuarios que falla en la Imagen 3, veremos cómo se ejecuta en la siguiente imagen.
Imagen 4: Inyección for xml raw
Como se puede apreciar, los datos, al estar en formato XML no pueden ser vistos en la renderización de la página, pero si miramos al código fuente se puede acceder a toda la información en formato XML.
Imagen 5: Lista de nombre de usuarios
*************************************************************************************************
Serialized SQL Injection (Parte I de VI)
Serialized SQL Injection (Parte II de VI)
Serialized SQL Injection (Parte III de VI)
Serialized SQL Injection (Parte IV de VI)
Serialized SQL Injection (Parte V de VI)
Serialized SQL Injection (Parte VI de VI)
*************************************************************************************************
Aprendo más aquí que en clases de la facultad, parece triste decirlo pero es así... :-/
ResponderEliminarGracias por estos artículos técnicos que me imagino que lleva mucho tiempo elaborarlos.
ResponderEliminarTonio, si aquí aprendes más que en la facultad, pues apuntate a su FTSAI, aprenderás mucho más:)
ResponderEliminarMuy bueno el artículo.
@tonio: eso es totalmente comprensible, muchos profesores siguen viviendo en la era del cretácico y de ahí no les saca ni Dios, no se actualizan, parece que no les guste dar clases, etc.
ResponderEliminarWelcome to the real world :)
Hola, muy interesante esta serie que inicias, al igual que las anteriores.
ResponderEliminarSabes lo que hecho de menos en tu blog? Algunas entradas con recomendaciones sobre que hacer en caso de que un fallo de seguridad de este tipo salga a la luz. ¿Como podemos detectar que lo estamos sufriendo? ¿Como debemos actuar una vez descubierto?
Un saludo y gracias por tus post.
Mpoley Menciona que para (una opción de) aprender más hay que apuntarse a la "FTSAI" del maligno...
ResponderEliminarPero qué es "FTSAI" y cómo puedo apuntarme?
Saludos y gracias!
Bytes!
@TuxRacer, el FTSAI es un curso que damos en Madrid, Zaragoza y próximamente en Barcelona y Pamplona....
ResponderEliminarOops... gracias mi estimado Chema por explicarme qué es FTSAI, lástima grande hombre que yo vivo al otro lado del charco (El Salvador, Centroamerica), a menos que tengas una edición digital de FTSAI ;) pero de igual forma, muchas gracias!
ResponderEliminarSeguiremos aprendiendo más de tus artículos que cuelgas en el blog.
Un Saludo!