Problemas de Seguridad Birt

4
Problemas de seguridad Birt 1. Control de sesiones 2. Url que da expuesta, servidor y parámetros Esconder el acceso directo al birt mediante programación web. Encriptar los parámetros. Soluciones Al empezar a trabajar con BIRT, me di cuenta que tiene un problema de seguridad cuando es utilizado desde otra plataforma que no sea JAVA. El problema es que dejamos la URL expuesta del BIRT, al igual que los parámetros que se envían (sean por el método GET o POST). Esta vulnerabilidad es fácilmente explotada por usuarios con conocimientos mínimos, aun y cuando el BIRT solo tenga permisos de lectura en la base de datos. Encontré la solución gracias a mis amigos Ddaz y el DrModding. No voy a hablar sobre como hacer un reporte o como utilizar BIRT, Javascript o PHP, hago el manual con la creencia de quien lo lea tenga conocimientos medios de estos lenguajes. Así que empezamos con la primera parte: Nota: Para este ejemplo utilizare la encriptacion de 64BYTES, no es la que recomiendo, pero para usar una formula de encriptacion, debe ser creada por cada programador por seguridad. Encriptando los parámetros en BIRT con Javascript Para empezar, podemos hacer la validación al recibir los parámetros, o al iniciar el DataSet. Este caso sera en el DataSet, para poder detener la conexión a la base de datos en caso de que un parámetro no pase la validación. Primero, debemos selecionar nuestro DataSet e irnos a la pestaña de Script.

Transcript of Problemas de Seguridad Birt

Page 1: Problemas de Seguridad Birt

Problemas de seguridad Birt

1. Control de sesiones2. Url que da expuesta, servidor y parámetros

Esconder el acceso directo al birt mediante programación web.

Encriptar los parámetros.

Soluciones

Al empezar a trabajar con BIRT, me di cuenta que tiene un problema de seguridad cuando es utilizado desde otra plataforma que no sea JAVA. El problema es que dejamos la URL expuesta del BIRT, al igual que los parámetros que se envían (sean por el método GET o POST). Esta vulnerabilidad es fácilmente explotada por usuarios con conocimientos mínimos, aun y cuando el BIRT solo tenga permisos de lectura en la base de datos. Encontré la solución gracias a mis amigos Ddaz y el DrModding.

No voy a hablar sobre como hacer un reporte o como utilizar BIRT, Javascript o PHP, hago el manual con la creencia de quien lo lea tenga conocimientos medios de estos lenguajes. Así que empezamos con la primera parte:

Nota: Para este ejemplo utilizare la encriptacion de 64BYTES, no es la que recomiendo, pero para usar una formula de encriptacion, debe ser creada por cada programador por seguridad.

Encriptando los parámetros en BIRT con Javascript

Para empezar, podemos hacer la validación al recibir los parámetros, o al iniciar el DataSet. Este caso sera en el DataSet, para poder detener la conexión a la base de datos en caso de que un parámetro no pase la validación.Primero, debemos selecionar nuestro DataSet e irnos a la pestaña de Script.

Page 2: Problemas de Seguridad Birt

Seleccionaremos el método “beforeOpen” y escribiremos la “desencriptacion” de los parámetros. Como mencione antes, al desencriptacion es de 64Bite, por lo cual quedaría de la siguiente forma:

var llave= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var salida = ""; var entrada = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0;

entrada = params["nombre_del_parametro_de_BIRT"]; entrada = entrada.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < entrada.length) { enc1 = llave.indexOf(entrada.charAt(i++)); enc2 = llave.indexOf(entrada.charAt(i++)); enc3 = llave.indexOf(entrada.charAt(i++)); enc4 = llave.indexOf(entrada.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; salida = salida + String.fromCharCode(chr1); if (enc3 != 64) { salida = salida + String.fromCharCode(chr2); } if (enc4 != 64) { salida = salida + String.fromCharCode(chr3); } } params["nombre_del_parametro_de_BIRT"] = salida;

Page 3: Problemas de Seguridad Birt

if(params["nombre_del_parametro_de_BIRT"].NaN){ this.queryText = ""; }

Si tenemos duda sobre los comandos que podemos utilizar, así como las variables; mientras se este escribiendo el Script, en la pestaña de Palette podremos ver las diferentes opciones y variables disponibles y su funcionamiento.

Se eligió el método “beforeOpen“, pues al final hay una comparación con el parámetro; si este no es numero (ya que requiero un ID integer), la sentencia SQL la deja vacía para evitar consumir recursos.

De esta manera podemos encriptar cada parámetro o solo los que se requieran. Esto nos daría la URL con los parámetros encriptados; pero esto no es suficiente hay que ocultar por completo al URL de BIRT para evitar ataques de carga entre otras cosas.

Ocultando la URL de BIRT a través de PHP

Esta parte es la mas fácil y en mi opinión la mas importante. Lo que debemos hacer es leer el archivo de BIRT y mostrarlo en PHP, creando un archivo propio por medio de los HEADER.

<?phpheader("Cache-Control: no-cache, must-revalidate");header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");// Para el formato PDF, utilizamos la ruta de BIRT$dest="http://127.0.0.1:80/birt-viewer/frameset?__report=report%nombre_del_reporte&__format=pdf";

$len=filesize($dest); //Esta opcion es solo si no se usa la cabecera para HTML

// Creamos la cabecera (en este caso para PDF)header("Content-type: application/pdf");header("Content-Length: $len");header("Content-Disposition: inline; filename=reporte.pdf");readfile($dest);?>

Como podemos ver, lo único que hacemos es leer el archivo de BIRT estando en el servidor y lo mostramos por medio de PHP. Esto oculta la dirección real del BIRT, dejando solo acceso a la dirección del PHP. Obviamente, podemos meter mas seguridad al archivo de PHP, creando accesos por IP, por tiempos, encriptamientos, etc.

El ejemplo, solo se refiere al archivo tipo PDF, pero pueden cambiarse las cabeceras para que pueda usarse los demás formatos. En caso de querer usar el BIRT-VIEWER como tal, la cabecera es HTML.

Últimos detalles de Seguridad

Ademas de estos dos métodos, se debe configurar el BIRT para que solo acepte peticiones del tipo LOCALHOST. También, puedes crear el archivo con PHP una vez leído de BIRT y enviarlo a la carpeta Temporal, para que de ahí se lea. Esto le agrega un plus de seguridad y rendimiento a la aplicación. Para la configuración del BIRT para peticiones LOCALHOST y el acceso a la carpeta Temporal del servidor, pueden dirigir sus dudas al DrModding.

Page 4: Problemas de Seguridad Birt