jueves, febrero 05, 2009

RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (II de VI)

*************************************************************************************************
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (I/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (II/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (III/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (IV/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (V/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (VI/VI)
*************************************************************************************************

RFD en Microsoft SQL Server 2000 y 2005 mediante fuentes de datos infrecuentes

Microsoft SQL Server permite utilizar fuentes de datos externas, o lo que es lo mismo, orígenes de información fuera del motor Microsoft SQL Server a los que se pueda acceder mediante cualquier OLE DB Data Provider. Un OLE DB Data Provider es un manejador de una fuente de información que oferta un interfaz de acceso común OLE DB a cualquier aplicación que lo utilice. Estas fuentes externas pueden ser servidores de bases de datos remotos del mismo o de distintos fabricantes o repositorios de información que van desde ficheros Microsoft Excel, bases de datos Access, DBase, ficheros XML hasta ficheros de texto plano “txt” o separados por comas “csv”. De hecho, una fuente de datos externa podrá ser cualquier fuente de información accesible por un OLE DB Data Provider que el servidor tenga cargada y se convertirá en un OLE DB Data Source, es decir, en una fuente de datos externa accesible mediante un OLE DB Data Provider.

El proceso de agregar fuentes de datos externas es una tarea de administración que se ejecuta mediante el enlazado de estos orígenes. Este proceso se puede realizar utilizando la herramienta de administración o bien con el uso del procedimiento almacenado sp_addlinkedserver, sin embargo, Microsoft SQL Server permite realizar conexiones ad-hoc a fuentes de datos externas infrecuentes, es decir, a aquellos orígenes de datos a los que se accede en contadas ocasiones. Para ello el lenguaje Transact-SQL de Microsoft SQL Server cuenta con dos comandos distintos. La función OpenRowSet que va a permitir acceder a cualquier fuente externa que devuelva un conjunto de registros y la función OpenDataSource, que permite lanzar una consulta sobre una fuente de datos externa enlazada ad-hoc.

En un entorno vulnerable a SQL Injection se permitiría acceder a ficheros del servidor que pudieran ser accesibles por un OLE DB Data Provider, y extraerlo mediante una técnica de booleanización. Por ejemplo, para extraer los datos de un fichero “c:\dir\target.txt” en el servidor de bases de datos dónde se ejecuta el motor Microsoft SQL Server utilizado por una aplicación web vulnerable y explotable por Blind SQL Injection podríamos utilizar el un proceso de booleanización sobre la siguiente inyección:

http://server/app.cod?param=1 and 256 > (ASCII(Substr(select * from OpenRowset('MSDASQL', 'Driver = {Microsoft Text Driver (*.txt; *.csv)};DefaultDir=C:\External;','select top 1 * from c:\dir\target.txt’),1,1))

En este ejemplo la inyección carga la primera fila del fichero target.txt, se queda con el valor ASCII de la primera letra y lo compara con el valor 256. Obviamente es una comparación que siempre dará TRUE, pero ilustra cómo se debe realizar el proceso de booleanización. Una vez descubierto el valor de la primera letra, el proceso se repetiría para las siguientes letras de la primera fila del fichero hasta que se llegará al final de la línea dónde se debería repetir el mismo proceso para las siguientes líneas del fichero hasta obtenerse el fichero completo.

En este caso, el driver Microsoft Text sólo permite acceder a ficheros con extensiones “txt”, “csv” o “tab” por lo que nunca se podría acceder con OpenRowSet u OpenDataSource a ficheros log, bak, old, o cualquier extensión distinta. Sin embargo sí es posible acceder a datos almacenados en ficheros Microsoft Office “mdb”, “xls”, o cualquier otro formato para el que el servidor tenga cargado un OLE DB Data Provider. Por ejemplo, para acceder a los datos de un fichero Microsoft Excel o a en un fichero Access almacenado en el servidor se podría realizar consultas como las siguientes:

SELECT * FROM OPENROWSET ('Microsoft.Jet.OLEDB.4.0',’Excel 8.0; DATABASE=c:\Excel.xls','Select * from [Libro1$]')

SELECT * FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Excel.xls"; User ID=Admin; Password=;Extended properties=Excel 8.0')...Libro1

SELECT * FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0','Data Source="c:\ACCESS.mdb"; User ID=Admin; Password=')...Tabla1

SELECT * FROM OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'c:\Access.mdb';'admin';'', Tabla1)


En todos estos casos, como se puede apreciar en las consultas, no es un acceso directo al fichero sino a los datos almacenados en él y por tanto, es necesario conocer información de la estructura de los datos. En los ejemplos se muestran datos de usuarios y contraseñas, pero estos no serían necesarios si, como sucede en la gran mayoría de las ocasiones , los ficheros de Microsoft Access y Microsoft Excel no tiene habilitados explícitamente un usuario y una contraseña.

Restricciones y permisos para uso de fuentes de datos infrecuentes

En los ejemplos de la sección anterior, para poder trabajar con OPENDATASOURCE y OPENROWSET es necesario que la clave de registro DisallowAdhocAccess del proveedor que se va a utilizar este fijado a cero.

Las claves de registro donde se configuran los proveedores, entre ellos el proveedor Microsoft.Jet.OLEDB.4.0 visto en los ejemplos, se encuentran en la rama de registro, si se trata de una instancia sin nombre:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers

O en caso de que se trate de instancias con nombre en:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\\Providers

Si la clave de registro no existe, el comportamiento varía según los privilegios del usuario que se conecta a la base de datos ya que si el usuario posee el rol “Server Administrators” tendrá permitido el acceso mientras que si por el contrario el usuario no posee este role tendrá denegado el acceso.

Por defecto el proveedor Microsoft.Jet.OLEDB.4.0 no establece la clave de registro DisallowAdhocAccess y por lo tanto impedirá el acceso a fuentes de datos externas salvo que el usuario posea el rol “Server Administrators”.

Estas son las únicas restricciones a la hora de utilizar OPENDATASOURCE y OPENROWSET, los permisos de acceso sobre los ficheros Microsoft Excel o Access vendrán determinados por los permisos del usuario que se le pase al proveedor OLE DB.

En Microsoft SQL Server 2005 además, el acceso a fuentes de datos externos esta desactivado por defecto como parte de la configuración de Seguridad, para modificar esta configuración una administrador puede utilizar el procedimiento almacenado sp_configure o la herramienta de administración Surface Area Configuration for Features y habilitar las consultas Ad hoc


Activación de fuentes de datos infrecuentes en Microsoft SQL Server 2005

Extracción de ficheros

Si se cumplen todos los requisitos necesarios del entorno bastaría aplicar un proceso de booleanización como el descrito en el apartado 3 mediante la inyección de una llamada al fichero que se quiere acceder como si fuera una fuente de datos infrecuentes. Así, la inyección SQL quedaría de la siguiente forma:

http://server/app.cod?param=1 and 256 > (ASCII(Substr(select * from OpenRowset('MSDASQL', 'Driver = {Microsoft Text Driver (*.txt; *.csv)};DefaultDir=C:\;','select top 1 * from c:\dir\target.txt’),1,1))

Como se puede ver se está accediendo al fichero “c:\dir\target.txt”. Este será cargado entero como una única cadena alfanumérica que va a ser recorrida durante el proceso de booleanización con la función substring. Cada carácter va a ser convertido a su valor ASCII y comparado con un índice para averiguar el valor correcto. Una vez llegado al final del substring se habrá terminado de acceder al fichero completo.

*************************************************************************************************
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (I/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (II/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (III/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (IV/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (V/VI)
RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (VI/VI)
*************************************************************************************************

3 comentarios:

  1. Great job!

    Era más de mySQL, ahora me estás picando con el MS SQL. Tendré que echarle un vistazo para seguir tu blog ;)

    Un saludo!!

    ResponderEliminar
  2. Hoy en http://freeyourmindofthenwo.blogspot.com/ un vídeo sobre el Tratado de Lisboa, clave para entender su relación con la Constitución Europea, que es lo mismo en esencia, solo que el tratado ha bastado con que lo ratifiquen ellos, no han convocado un Referendum¡¡Nos la han colado!!

    Tambien una Noticia del diário LibertadDigital, sobre la llegada del amero.¡¡El amero llega a los medios oficiales!!

    Entra a verlo!:

    http://freeyourmindofthenwo.blogspot.com/
    http://freeyourmindofthenwo.blogspot.com/

    ResponderEliminar
  3. Genial el artículo. Pregunta, ¿conoces algún sistema con interfaz web para hacer testeos de conexión, simular usuarios anvegando un sitio, etcétera, para GNU/Linux? Como el Webload y el OpenMTA, pero con interfaz web.

    Muy agradecido, desde ya.

    ResponderEliminar