martes, febrero 10, 2009

RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (IV 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 2005 & 2008 mediante opciones de carga masiva

Una de las mejoras de transact-sql introducidas en Microsoft SQL Server 2005 es la posibilidad de realizar importaciones masivas llamando a OPENROWSET y especificando la opción BULK. De este modo se puede conseguir lo mismo que se obtiene al utilizar bulk insert (también disponible en SQL Server 2005 y 2008 de forma habitual), pero sin necesidad de utilizar tablas temporales donde almacenar el contenido de los ficheros. La sintaxis básica de la instrucción sería la siguiente:

INSERT ... SELECT * FROM OPENROWSET(BULK...)

Así, si se quiere leer el contenido de un fichero se utilizaría una sentencia transact-sql como la siguiente:

SELECT * FROM OPENROWSET(BULK 'c:\file.txt', SINGLE_CLOB) As Datos

Al utilizar la opción bulk se especifica el fichero a leer y opcionalmente se especifica el tipo de columna donde se va a colocar el dato leído, los posibles valores son:

- SINGLE_BLOB: Especifica que los datos se van a almacenar en una columna varbinary(max)

- SINGLE_CLOB: Para especificar que los datos ASCII se almacenan en una columna varchar(max)

- SINGLE_NCLOB: Para datos UNICODE que serán importados a una columna nvarchar(max)

La definición de tipos varbinay(max), varchar(max) y nvarchar(max) es una novedad de Microsoft SQL Server 2005, y se utiliza para permitir el almacenamiento de grandes cantidades de datos, la longitud de estos tipos de datos van desde 1 byte hasta los 2 GB.

En SQL Server 2005 es posible descargar tanto ficheros de texto como ficheros binarios, para cargar ficheros binarios se utilizará la opción bulk con el valor SINGLE_BLOB y para ficheros de texto se puede utilizar el valor SINGLE_CLOB

Restricciones y permisos

Al igual que sucede en Microsoft SQL Server 2000 para poder realizar importaciones masivas es necesario tener el rol de Servidor bulkadmin, como no es necesario crear tablas en la base de datos no es necesario tener ningún role especial a nivel de base de datos.

En cuanto a los ficheros a los cuales se puede tener acceso, Microsoft SQL Server 2005 soluciona los problemas que presentaba Microsoft SQL Server 2000 y versiones anteriores. En esta versión el acceso depende de cómo se haya iniciado la sesión en el Servidor Microsoft SQL Server.

- Si se ha utilizado un inicio de sesión SQL Server, se utilizara el perfil de seguridad de la cuenta de proceso de SQL Server, y por lo tanto se tendrá acceso a los ficheros que esta cuenta pueda leer.

- Si se ha utilizado un inicio de sesión mediante la autenticación de Windows, el usuario solo tiene acceso para aquellos archivos para los que la cuenta del usuario tiene permiso, independientemente de los permisos que tenga la cuenta de proceso SQL Server. Para ello se utilizan las credenciales del usuario, a esto se le denomina suplantación o delegación.

Proceso de la extracción del fichero

En primer paso lógico a seguir es calcular el tamaño en bytes del fichero, para calcularlo es necesario cargar el contenido del fichero usando OPENROWSET(BULK …) y utilizar la función DATALENGTH, para inferir mediante búsqueda binaria el tamaño del mismo. Una posible sentencia a inyectar en un servidor vulnerable para calcular el tamaño sería:

http://server/app.cor?param=1 and DATALENGTH((SELECT * FROM OPENROWSET(BULK 'c:\Helloworld.exe', SINGLE_BLOB) As Datos)) > 255 --

Una vez determinado el tamaño del fichero, el proceso de booleanizacion queda reducido a consultas que recuperan los diferentes bytes e infieren su valor, una posible sentencia a utilizar sería:

http://server/app.cod?param=1 AND 256 > ASCII(SUBSTRING ((SELECT * FROM OPENROWSET(BULK 'c:\Helloworld.exe', SINGLE_BLOB) As Datos), 1, 1))—

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

2 comentarios:

  1. Qué alguien le diga algo, que luego se nos queja de que nadie dice nada en los posts técnicos.

    ResponderEliminar
  2. Muy buena entrada, muy util, Gacias

    ResponderEliminar