domingo, marzo 15, 2009

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

Serialized SQL Injection en MySQL

A pesar de que con este método se consigue el mismo objetivo que con For XML en Microsoft SQL Server, este sistema no permite el uso del operador comodín “*”. Es necesario por tanto averiguar primero las columnas de los campos de las tablas que se desean descargar. En motores con versiones 5 o 6 habrá que lanzar previamente una consulta al diccionario de datos o poner la consulta manualmente.

Palako desarrolló una sript en Perl que permite realizar cualquier consulta contra motores de MySQL. En este caso la herramienta simula la línea de comandos del cliente MySQL pero sin soporte para *.


MySQL Injector en Perl

Otra característica a tener en cuenta es que la instrucción Group_concat trunca el resultado al número de caracteres máximos fijados por la variable global “group_concat_max_len”. Dicha variable toma valor por defecto el valor 1024 que sería el límite máximo del documento XML que se puede devolver en cada consulta. Por supuesto esta variable puede modificarse pero sin superar el valor de la variable “max_allowed_packet” que por defecto está limitada a 16M.

Debido a que es necesario montar el XML manualmente en la misma cadena de inyección y teniendo en consideración que el ataque se va a realizar vía Web es necesario formatear adecuadamente la cadena para evitar la protección frente a ataques Cross-Site Scriting (XSS) que pueda tener el servidor web.

Como última consideración respecto a este método hay que tener presente que será necesario utilizar la función CASTR (column as char) en los campos a recupera para poder volcar los valores de aquellos campos binarios como secuencias de caracteres.
Resumiendo, para hacer este método hay que:

- Construir manualmente el árbol XML
- Codificarlo para evitar detecciones XSS
- Codificar valores binarios a char
- Como no hay soporte para * hay que consultar primero el diccionario de datos
- Tener en cuenta el tamaño máximo del documento

Por lo que es altamente recomendable automatizar este proceso con una pequeña herramienta que realice todas estas tareas. Palako se construyo una versión en COCOA para tener un interfaz cómodo. En este entorno, es suficiente en la cadena de inyección marcar con el patrón [SQL] dónde se tiene que inyectar la cadena que serialice la extracción de datos.


MySQL Injector versión COCOA en modo Browsing


MySQL Injector versión COCOA en modo sentencia SQL

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

No hay comentarios:

Publicar un comentario