martes, marzo 03, 2009

Serialized SQL Injection (Parte II 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)
*************************************************************************************************

Opciones de For XML en SQL Server

Las opciones que se pueden utilizar con For XML son las siguientes:

- RAW: Construye el árbol XML de la respuesta devolviendo un único elemento por cada fila obtenida en con la consulta select. Las columnas aparecerán como atributos del elemento devuleto.

- AUTO: Produce el anidamiento de los elementos en el documento XML devulento según sea la construcción de la consulta SQL lanzada.

- EXPLICT: Proporciona más control sobre la generación del XML, pudiendo decidir que anidar y que tomar como atributos.

- PATH: Utilizada con el modo AUTO proporciona la flexibilidad del modo EXPLICT de una manera más sencillo. Esta opción sólo a partir de SQL Server 2005.

- XMLSCHEMA: Saca la información de los campos que conforman la tabla.

• BINARY BASE64: Codifica datos binarios en formato base64.

En nuestro ejemplo, y con la automatización por medio de herramientas que vamos a ver más adelntate sólo vamos a recuperar el contenido de tablas simples de forma completo, es decir, no vamos a realizar consultas select multi tabla con joins por lo que será suficiente con el modo RAW.

Datos Binarios

Es importante tener en cuenta que, a la hora de recuperar datos binarios como imágenes o SID de cuentas, es necesario que esos datos sean recodificados a un formato transferible en modo texto. Para eso, SQL Server oferta la opción binary base64. Esto devolverá cualquier dato binario en formato BASE 64.

Así, por ejemplo, si se quiere obtener toda la información de las cuentas de usuario se podría lanzar una consulta del tipo:


Imagen 6: Select * from sysusers for xml auto, binary base64

Y en el código fuente podremos accede a todos los datos de todos los usuarios:


Imagen 7: Lista de registros de la tabla sysusers

RFD FOR XML: Devolviendo ficheros del sistema

Si unimos las técnicas de serialización a las técnicas de RFD se pueden hacer cosas muy curiosas. Así, si se quisiera traer un fichero completo del sistema con la opción openrowset bulk vista en el artículo sobre RFD, se podría lanzar una inyección de este tipo:

Select * from Openrowset (Bulk ‘c:\windows\repair\sam’, SINGLE_CLOB) as F for xml raw, binary base64


Imagen 8: Inyección para obtener la SAM del sistema

Con lo que se obtendría el fichero completo en base64 en una única inyección como se puede ver en la siguiente imagen dónde la SAM de un sistema Windows está escrita en base64 en el código fuente de la página.


Imagen 9 :La sam en base64 en el código fuente

Conclusiones sobre SQL Server y For XML

En SQL Server se puede utilizar el carácter comodín para acceder a todas las columnas del sistema. Como veremos más adelante esto no va a ser posible en Oracle y MySQL con lo que se tendrá que realizar una consulta previa al diccionario de datos para conocer los nombres de las columnas asociados a las tablas antes de extraer los datos.

Como se va mostrar la información utilizando el operador unión, el tamaño máximo del documento xml que se puede obtener con la inyección Select está limitado al tamaño máximo que puede tener una columna en SQL Server, es decir, 8000 caracteres, con lo que habrá que segmentar los datos en caso de querer extraer consultas de tamaños superiores.

*************************************************************************************************
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)
*************************************************************************************************

3 comentarios:

Unknown dijo...

Chema, el tamaño máximo de una columna alfanumérica a partir de la versión 2005 de SQL Server ya no está limitado a 8000 caracteres, sino que puede llegar a tener 2GB, por lo que la limitación a la que haces referencia no aplica...

Anónimo dijo...

Totalmente de acuerdo con el comentario anterior. Afortunadamente, no hay límite de 8000 caracteres. En todo caso, siempre es recomendable forzar una conversión a nvarchar(MAX).

Saludos!

Chema Alonso dijo...

Cierto, pero en la versión 2000 dónde también hay for XML sí.

Saludos!

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares