viernes, febrero 20, 2009

RFD [Remote File Downloading] en aplicaciones web con Blind SQL Injection (V 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)
*************************************************************************************************

Remote File Downloading in MySQL

En las versiones de MySQL tenemos, al igual que en los motores de bases de datos de Microsoft SQL Server las dos opciones, es decir, acceder directamente al fichero en cada consulta o volcar el fichero en un tabla temporal.

Load_File: Acceso directo a fichero como cadena de bytes

La función Load_File permite acceder, en una consulta directamente a un fichero en el sistema de archivos y devuelve una cadena de bytes con el contenido del fichero. Bastaría con lanzar un comando de la forma:

Select Load_file(‘/etc/passwd’)

Con este comando se podría leer el fichero /etc/passwd que sería devuelto como una cadena de caracteres. Para evitar el problema de las aplicaciones web con filtrado de comillas se puede escribir el nombre del fichero en hexadecimal.

El límite de descarga del fichero está marcado por el valor de la constante max_allowed_packet en el motor de la base de datos y puede ser utilizada desde versiones 3.23 en adelante.

Este método está implementado en las SQLbfTools, en el comando mysqlget. Como se puede ver en la imagen, basta con configurar la URL vulnerable, cual es el fichero que se desea descargar y la keyword que aparece en las paginas True de las inyecciones a ciegas.


Descargando un /etc/passwd a través de Internet con mysqlget

Carga de fichero en tabla temporal

La otra opción, es decir, cargar el fichero en una tabla y leerlo de allí, puede ser realizada de dos formas. La primera opción sería utilizar la misma función Load_File para cargar el fichero en una columna de una tabla de la siguiente forma:

UPDATE tabla SET columna=LOAD_FILE('/tmp/file’) WHERE id=1;

Esta opción no parece añadir una mejora sustancial respecto al método anterior y más cuando aun es necesario un mayor número de privilegios en la creación de una tabla con dos columnas, la inserción de una fila con valor null para el campo blob y la actualización de la misma con el fichero.

La otra alternativa sería utilizar la función Load data infile en las versiones de MySQL 5. Esta función es la utilizada por la utilidad mysqlimport para volcar ficheros de texto dentro de tablas de la base datos. A diferencia de de Load_File no vale nada más que para ficheros de texto, pero no está limitada a max_allowed_packed por fichero sino por línea. Es decir, un fichero muy grande de texto podrá ser cargado con facilidad dentro de la base de datos. Los pasos serían:

Crear una tabla temporal con una columna para las líneas del archivo de texto.

; Create table temporal (datos varchar(max_allowed_packed))

Cargar el fichero de texto en ella

; Load data infile 'c:\\boot.ini' into table temporal

Poner una columna única para descargar el fichero cómodamente.

; alter table temporal add column num integer auto_increment unique key

Calcular el número de filas con booleanización y blind SQL Injection

and contador>(select count(num) from temporal)

Calcular la longitud de cada fila con booleanización y blind SQL Injection

and contador>(select length(datos) from temporal where num = numerodefila)

Boleanizar cada uno de los valores de cada fila

and contador>(select ASCII(substring(datos,posicion,1)) from temporal where num = numerofila)

Borrar tabla temporal

; Drop table temporal

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

1 comentario:

miguel dijo...

El mayor y más común inconveninente con el load_file() de MySQL es que se requiere del privilegio File_priv para que funcione, y este no se concede por defecto, por no hablar de que el resultado de esta función es null tanto si no se tiene el privilegio como si no existe el archivo o no se puede acceder a él... no hay más errores. MySQL poco a poco ha ido "recortando" los mensajes de error que suelta, y eso duele... ;)

Entrada destacada

Infraestructuras Críticas y Sistemas Industriales: Auditorías de Seguridad y Fortificación de @0xWord

Desde hoy está disponible a la venta un nuevo libro de 0xWord centrado en la seguridad de los Sistemas Industriales y las Infraestructuras...

Entradas populares