domingo, 29 de noviembre de 2009

Inyección de código

Voy a mostrar un ejemplo de como mediante inyección de código podemos consultar registros de una tabla distinta a la que tiene el bloque como origen de consulta.

Para ver el ejemplo hacemos un form asociado a la tabla DEPT (tabla típica de los ejemplos de Oracle):


SQL> DESC DEPT;
 Nombre              ¿Nulo?   Tipo
 ------------------- -------- ------------------
 DEPTNO                       NUMBER(2)
 DNAME                        VARCHAR2(14)
 LOC                          VARCHAR2(13)

Pantalla con los datos de la tabla:


Ahora vamos a ver como con ese bloque mostrar el contenido de USER_TAB_COLUMS, para ello entramos en modo de entrada consulta (pulsando F7) y en cualquiera de los campos ponemos ":" (dos puntos) y ejecutamos consulta, y tendremos la siguiente pantalla:


El objetivo de esa ventana es que el usuario pueda introducir una condición avanzada, como podría ser un AND EXISTS, un BETWEEN, ..., pero la consulta Oracle Forms la envía a la base de datos tal cual ha sido escrita por el usuario, por lo que podemos introducir lo siguiente:

1=2) UNION ALL SELECT rownum, table_name, column_name FROM user_tab_columns --

El 1=2 es para evitar los registros de la tabla DEPT, luego se añade una UNION ALL para sacar los registros de la tabla que queramos, y la consulta la terminamos con -- ya que Forms a la consulta que introduce el usuario la mete entre paréntesis, de esta forma comentamos el último parénteseis.

El resultado será el siguiente:


Este funcionamiento se puede deshabilitar, evitando que al introducir ":" en modo de entrada de consulta en un campo de forma que no se abra al ventana en donde introducir una condición adicional, para ello en Forms6 en cliente servidor se puede introducir la siguiente entrada en el regedit:

FORMS60_RESTRICT_ENTER_QUERY con el valor 1

En Forms 10g para activar o desactivarlo hay que editar el archivo al que apunta la variable envFile del archivo de configuración formsweb.cfg y modificar / añadir la variable:


FORMS_RESTRICT_ENTER_QUERY=TRUE

  • TRUE: Está desactivado (opción recomendable).
  • FALSE: Está activado, se puede inyectar código.
NOTA: Corregida esta entrada, estaba al revés

Para más información se puede consultar la nota 163305.1 del metalink. También en http://www.red-database-security.com/wp/sql_injection_forms_us.pdf se puede obtener más información.

sábado, 28 de noviembre de 2009

Asignar una función la tecla escape en Forms10g

Una utilidad de la tecla ESC (Escape) y muy utilizada en muchas aplicaciones es la de cerrar la ventana abierta. Esta operación se puede configurar en Forms 10g editando el archivo frmweb.res y añadiendo la siguiente línea:

27 : 0 : "Escape" : 32 : "Salir"
  • 27: es el identificador "Java function number" asignado a la tecla escape.
  • 0: Indica el "Java modifiers number" es decir, qué combinación de teclas más la Escape se pulsarán para ejecutar el evento, el 0 quiere decir que no se utilizará en conjunto con otra tecla, si se pusiese 1 para ejecutar el evento habría que pulsar Mayúsculas+Esc, con 2 haríamos referencia a la tecla "Control", con 8 a la tecla "Alt". .
  • "Escape": Es un texto asignado por el usuario, no afecta al funcionamiento.
  • 32: es el identificador "Forms function number" que indentifica la operación que debe se debe de ejecutar en Forms. El 32 indica que se ejecutará KEY-EXIT.
  • "Salir": Es un texto asignado por el usuario, no afecta al funcionamiento.
El archivo fmrweb.res se encuentra en $ORACLE_HOME/forms/admin/resource/

En caso de configurar el servidor de aplicaciones en UTF8 se utiliza el archivo fmrweb_utf8.res.

Se considera que el servidor de aplicaciones está en UTF8 cuando en el archivo indicado en la entrada envFile del archivo formsweb.cfg tiene definida la siguiente variable:

NLS_LANG=Spanish_Spain.UTF8