Descargar

Seguridad en desarrollo de aplicaciones Web (página 2)

Enviado por Sebastian Lopez


Partes: 1, 2

No mantiene por sí mismo el estado de la sesión – un atacante no tiene que emular mecanismos de mantenimiento de sesión, basta con emitir un request para lograr el cometido. Mecanismos como el uso de cookies permiten simular una sesión virtual intercambiando información adicional en cada request/response, pero no son efectivas si no se las implementa bien, e introducen problemas adicionales de seguridad y privacidad.

Existen muchas excepciones y variantes adicionales a estos elementos; en particular se utiliza ampliamente SSL como protocolo de encriptación a nivel de transporte en las comunicaciones clienteservidor. Como explicaremos a continuación, esto está lejos de resolver todas las vulnerabilidades de la aplicación.

Mitos sobre la seguridad web

El usuario solamente enviará entradas esperadas – HTML admite el uso de tags que manipulan la entradas a la aplicación, por ejemplo si la aplicación utiliza campos ocultos para enviar información sensible estos pueden ser fácilmente manipulados desde el cliente.

La validación se puede realizarse únicamente del lado del cliente con JavaScript – si no se efectúa niguna validación del lado del servidor, cualquier atacante que evite esta validación (para nada difícil de lograr) tendrá acceso total a toda la aplicación.

El uso de firewalls es suficiente – como explicamos anteriormente, si el firewall tiene que habilitar los puertos 80 y/o 443 para que la aplicación sea accesible al exterior, no podrá hacer nada para detectar entradas maliciosas del cliente, y por supuesto no es protección contra ataques internos.

El uso de SSL es una solución suficiente – SSL simplemente cubre el request/response HTTP dificultando la intercepcion del tráfico entre cliente y servidor, pero no agrega seguridad al servidor ni evita el envío de código malicioso desde el cliente.

Amenazas comunes

Los múltiples ataques externos a los que puede estar expuesto un sitio web son usualmente clasificados en 6 categorías principales. Indicaremos cada una y los tipos de ataques más típicos que incluyen, y a continuación describiremos en mayor detalle cuatro de ellos.

Autenticación: son las que explotan el método de validación de la identidad de un usuario, servicio o aplicación

Fuerza Bruta

Autenticación insuficiente

Débil validación de recuperación de Password

Autorización: explotan el mecanismo de un sitio web de determinar si un usuario o servicio tiene los permisos necesarios para ejecutar una acción.

Predicción de Credenciales o Sesión

Autorización insuficiente

Expiración de Sesión insuficiente

Fijado de Sesión

Ataques Lógicos : explotan la lógica de la aplicación (el flujo procedural utilizado por la aplicación para efectuar cierta acción.

Abuso de funcionalidad

Denial of Service

Insuficiente Anti-Automatismo

Insuficiente validación de procesos

Manipulación de entradas (URL, campos)

Ataques al cliente : atacan al usuario de la aplicación.

Content Spoofing

Cross-Site Scripting

Ejecución de comandos : ataques diseñados para ejecutar comandos remotos en el servidor.

Buffer Overflow

Format String

LDAP Injection

Ejecucuón de Comandos (OS Commanding)

SQL Injection

SSI Injection

XPath Injection

Robo de Información : ataques que apuntan a adquirir información específica sobre el sitio web.

Indexado de directorio

Caminos transversales

Predicción de ubicación de recursos

Escape de información

Los ataques que vamos a describir son SQL Injection, Manipulación de entradas, Ejecución de Comandos, y Cross Site Scripting

SQL Injection

SQL Injection es una vulnerabilidad que afecta aplicaciones a nivel de base de datos. Dicha vulnerabilidad consiste en enviar instrucciones SQL adicionales a partir de parámetros entrada ingresados por el usuario.

Al "inyectar" el código SQL malicioso dentro de estos campos, el código "invasor" se ejecuta dentro del código SQL propio de la aplicación para alterar su funcionamiento normal, de acuerdo con el propósito del atacante.

SQL Injection es un problema de seguridad que debe ser tomado en cuenta por el programador para prevenirlo. La vulnerabilidad ocurre cuando la aplicación ejecuta una sentencia SQL que utiliza el valor de campos de entrada sin validarlos correctamente.

Permiten al atacante saltar restricciones de acceso, elevar privilegios del usuario, extracción de información de la base de datos, ejecución de comandos dentro del servidor. Incluso es posible destruir parte la base de datos de la aplicación (por ejemplo insertando una sentencia Drop Table).

Ejemplo

Consideremos un simple form de autenticación de usuario contra base de datos

Username: Administrador

Password: xxxxxxx

El form anterior ejecuta la siguiente consulta SQL:

Select idusuario from tabla_usuarios

Where nombre_usuario="$usuario"

And clave="$clave"

Si en lugar del password esperado se ingresa lo siguiente

Username: Administrador

Password: " or "1"="1

La consulta que realmente se ejecuta es la siguiente:

Select idusuario from tabla_usuarios

Where nombre_usuario="Administrador"

And clave="" or "1"="1";

Contramedidas

Los riesgos de SQL Injection pueden superarse relativamente fácil con cambios de programación simples, que sin embargo requieren considerable disciplina de los programadores para aplicar los métodos siguientes para cada procedimiento y función accesibles de la red.

Variables de alcance: La más poderosa protección contra el SQL Injection es utilizar solamente variables de alcance para imposibilitar la concatenación de instrucciones SQL donde puedan aplicarse variables en las instrucciones anexadas.

Validación de la entrada: es necesaria una validación fuerte en lado de servidor para entrada de usuario, validación de datos filtrar la entrada del usuario de caracteres SQL, verificar tanto el tamaño como el tipo de los datos y sintaxis de las entradas de usuario. Este punto se aplica a muchos ataques similares, en particular lo reafirmaremos para los próximos ataques analizados.

Mensajes de error: Los mensajes de error a menudo revelan demasiada información que puede ser útil al atacante (nombres de tablas, campos, vistas); por lo tanto no se deberá exponer al usuario final los mensajes de error devueltos por el gestor de la base de datos.

Los mensajes de errores de la base de datos deberían ser notificados solamente a los administradores de la aplicación.

Manipulación de parámetros

Es un conjunto de técnicas que atacan la lògica de negocio de la aplicación, tomando ventaja del uso de campos ocultos o fijos para la transferencia de información sensible entre browser y servidor. En particular, tags ocultos en un form, cookies o parámetros anexados a la URL son fácilmente modificables por un atacante.

Vamos a analizar dos tipos en particular: manipulación de campos ocultos y manipulación de URL

Manipulación de campos ocultos

Cualquiera de los valores que se almacenan en los campos de un form pueden ser manipulados por un atacante. En particular los campos ocultos son usualmente atractivos para su manipulación ya que muchos desarrolladores los utilizan para información confidencial de estatus de algún objeto sobre el que se está trabajando.

La manipulación de estos campos es tan simple como salvar la página, editar el valor de estos campos en su código HTML y recargarla en el browser.

Ejemplo

Un form de orden de productos incluye el siguiente campo oculto

Basta con modificar este campo para que, a menos que exista una validación posterior del lado del servidor, la aplicación cobre por el artículo el precio dispuesto por el usuario.

Manipulación de URL

Los forms HTML envían sus resultados usando uno de dos métodos posibles: GET o POST. Si el método es GET, todos los parámetros del form y sus valores correspondientes aparecen en cadena de búsqueda del siguiente URL que el usuario ve. Esta cadena puede ser fácilmente manipulable

Ejemplo 1

Un sitio web permite a un usuario autenticado seleccionar una de sus cuentas a partir de un combo, y debitar un monto fijo de esa cuenta. Cuando se presiona Submit en el browser, se solicita la siguiente URL:

http://www.mydomain.com/example.asp?accountnumber=12345&debitamount=1

Un usuario malicioso puede modificar los parámetros de la URL (accountnumber and debitamount), para debitar otra cuenta:

http://www.mydomain.com/example.asp?accountnumber=67891&creditamount=9999

Existen otros parámetros URL que podrian ser modificados, tales como atributos y módulos internos. Los atributos son parámetros únicos que caracterizan el comportamiento de la página que se envía.

Ejemplo 2

Una aplicación web para compartir contenidos permite únicamente al creador del mismo modificarlo, y chequea si el usuario que accede una entrada es el autor o no. Un usuario normal solicitaría el siguiente link:

http://www.mydomain.com/getpage.asp?id=77492&mode=readonly

Un usuario malicioso puede modificar el parámetro mode a readwrite para obtener permisos indebidos sobre el contenido.

Ejecución de comandos

Las técnicas de manipulación de entrada vistas son sólo algunas que llevan a la posibilidad de ejecutar remotamente comandos del Sistema Operativo de la víctima.

Determinados caracteres especiales pueden ser interpretados por scripts de validación poco seguros como una instrucción al SO de esperar un comando arbitrario a continuación. En particular, el punto y coma o la barra | son en Unix caracteres que permiten encadenar comandos. Por tanto incluir en el campo de entrada un ; seguido del comando que se desea ejecutar puede tener éxito si el mecanismo de validación no es lo bastante robusto.

Ejemplo

La aplicación recibe un número de 8 dígitos cuando el usuario selecciona una opción de menú. El form HTML llama a un script escrito en comandos de Shell pasándole por parámetro este número. El código HTML desplegado por el browser tiene esta forma:

Jones Energy Services Co.

el atacante guarda este form en su máquina y lo modifica agregándole un comando arbitrario:

Jones Energy Services Co.

el atacante abre su copia del form desde su máquina y selecciona la opción correspondiente.

el script pasa el número normalmente, y pasa al siguiente comando en la cadena, que es ejecutado en el servidor y abre una terminal en el mismo dándole al atacante completo acceso.

Contramedidas

En la mayoría de los ataques de inyección de comandos, es necesario tener conciencia de que todo dato hacia y desde un browser puede ser modificado. Por ende, la validación propiamente dicha de cada dato de entrada debe darse en el servidor, fuera del control del usuario.

Adicionalmente el servidor debería además configurarse para requerir una autenticación debida al nivel del directorio para cada archivo en el mismo. Aún así esta solución no es perfecta, por lo que es conveniente que el usuario utilizado por la aplicación sobre el servidor tenga los permisos mínimos necesarios, para minimizar el posible impacto.

Cross Site Scripting (XSS)

Esta amenaza surge de los riesgos inherentes de permitir a un servidor web enviar código ejecutable (en cualquier lenguaje de scripting embebido en HTML) a un browser. Cuando a un script de una página se le permite acceder a datos de otra página u objeto, existe la posibilidad de que un sitio web malicioso, lo utilice para obtener información confidencial.

El cross site scripting, aprovecha las vulnerabilidades en los mecanismos de validación de interaccion entre paginas y objetos y en lenguajes scripting que ejecutan en el cliente.

Existe tres tipos conocidos que vulnerabilidades que implican

Tipo 1 – XSS local

En esta categoría el problema reside en el propio script del lado del ciente de la página. Por ejemplo si un fragmento de JavaScript accede un parámetro de un request HTML y lo utiliza para escribir HTML en su propia página, no codificándolo como entidades HTML, se presenta la vulnerabilidad. Estos datos serán reinterpretados por los browsers como HTML, que podría incluir código adicional (maligno).

Tipo 2 – XSS reflejado

Este es el tipo más común, también es conocido como no-persistente. La vulnerabilidad se presenta cuando los datos provistos por el cliente es utilizada inmediatamente por scripts del lado del servidor para generar la página de resultados. Si datos no validados provistos por el cliente son incluidos en la página de resultados sin una codificación apropiada, es posible insertar codígo desde el lado del cliente. Basta con un poco de ingeniería social para llevar a un usuario desprevenido a seguir un link malicioso que inserte este código en la página de resultados, obteniendose acceso total a su contenido.

Tipo 3 – XSS persistente

Este tipo incluye los ataques más poderosos. La vulnerabilidad existe cuando los datos provistos por el cliente a la aplicación es almacenada persistentemente en el servidor, y accesible a varios usuarios del sitio sin codificación de entidades HTML – por ejemplo message boards. El atacante puede insertar un script una única vez, y con esto le basta para alcanzar a un gran número de usuarios, sin requerir mucho esfuerzo de ingeniería social. Los métodos de inserción son variados y no es necesario utilizar la aplicación misma para explotar la vulnerabilidad.

Ejemplos

Presentaremos un ejemplo de cada uno de los tipos mencionados anteriormente.

Ejemplo1 – XSS local

Atacante envía a usuario, via email u otro mecanismo, la URL de una página fraudulenta.

Usuario cliquea en el link

Un código JavaScript en la página abre una página HTML vulnerable local a la máquina del usuario.

La página HTML es obligada a ejecutar código JavaScript en la localidad de la máquina del usuario

El atacante puede ahora ejecutar comandos en la máquina del usuario con los permisos de éste.

Ejemplo 2 – XSS reflejado

El usuario visita frecuentemente un website particular. El servidor de este sitio le permite al usuario loguearse con un ID/pswd propio y almacena información confidencial (tarjeta de crédito).

El atacante verifica una vulnerabilidad de XSS reflejada en el servidor.

El atacante genera una URL y la envía al usuario simulando ser el servidor del sitio (mediante spoofing).

El usuario visita esta URL estando logueado en el servidor.

Un script maligno embebido en la URL se ejecuta en el browser del usuario tal como si proviniera del servidor, obteniendo información confidencial del usuario y enviandola al servidor web del atacante.

Ejemplo 3 – XSS persistente

El servidor de un sitio web permite a sus usuarios publicar mensajes y otros contenidos en el mismo para acceso de otros miembros.

El atacante detecta una vulnerabilidad de XSS persistente en el servidor.

El atacante postea un mensaje con un script insertado, asegurándose que muchos otros usuarios del sitio querrán leerlo por cualquier motivo.

Mediante el simple acceso al mensaje, el script insertado puede hacer que cookies de sesión u otra información de autenticación podría enviarse al servidor web del atacante.

El atacante podria ahora loguearse como otros usuarios al sitio

Contramedidas

Preferentemente no debería permitirse código HTML en los campos de entrada, en caso de que se necesitara, deberían de validarse los tags, descartando aquellos que pudieran ser peligrosos, adicionalmente también se deben descartar caracteres potencialmente peligrosos como -,",",?,&,<,>,etc.

Puntos importantes en una auditoria de aplicaciones Web

Con las amenazas y controles concretos analizados en la sección anterior en mente, surge la cuestión de qué es lo que debería considerarse a la hora de auditar la seguridad de una aplicación web. Con esto no nos referimos únicamente a una auditoría oficial externa, sino también a elementos que un administrador de seguridad de una empresa debería considerar para determinar las vulnerabilidades de sus sistemas, tanto potenciales (en etapa de desarrollo) como actuales en producción.

Existen muchas guías y "checklists" elaborados por empresas y organizaciones sobre este tema, generales o enfocadas a la seguridad lógica o algún otro aspecto en particular, así como específicas a alguna plataforma o no. En particular hemos optado por destacar los siguientes aspectos:

Fase de Requerimientos

Deben analizarse los requerimientos de usuario y debe verificarse que se incluyan los siguientes elementos:

Los recursos y valores (assets) involucrados deben estar debidamente identificados

Cómo y en qué condiciones se usará la aplicación

Usuarios, roles y permisos deben estar definidos, especificando claramente requerimientos de autenticación y autorización

Cuestiones de seguridad legales y relativas al negocio – traza de auditoría, firmas digitales, nivel de encriptación, bitácoras y soporte para no-repudio, etc.

Controles de autenticación

Si la autenticación en mediante un form, asegurar que los forms sensitivos estén protegidos.

Asegurar que el código incluye líneas para reenviar al usuario al form de login si la autenticación falla.

Asegurar que la información de autenticación del usuario se almacene en variables de sesión.

Control de caracteres especiales

La codificación del set de caracteres de cada página debe ser determinada explícitamente por el servidor web.

Durante el desarrollo se deben definir procesos de identificación y filtrado de caracteres especiales. Esto debería incluir caracteres tales como: ?<, ?> , ?& , ?" " , tabulaciones, %, paréntesis, _ , /, etc

Los elementos dinámicos de salida deben estar codificados, y en particular deben codificarse URL"s y páginas HTML.

También deben examinarse cuidadosamente las cookies aceptadas y revisarse las técnicas de filtrado que aseguren que no se almacene contenido peligroso en ellas.

Control de Logs

La aplicación debe generar archivos de log y la información relativa al acceso a cada recurso debe quedar registrada en los mismos con detalle suficiente para ser útiles.

Ej. deben registrarse intentos de login fallidos, creación de conexiones de BD, operaciones rechazadas, etc.

Fase de Testing

Durante el testeo de la aplicación deben utilizarse scanners de seguridad de aplicación tales como AppScan de Sanctum, Retina de eEye, o Web Inspect de SPI Dynamics.

El desarrollador debe considerar en su totalidad las implicaciones de los datos de entrada en términos de URL, métodos, cookies, headers y campos HTTP. Durante el testing deberán analizarse la mayor cantidad de escenarios posibles, y en particular situaciones tales como: si el cliente modifica la URL podría acceder a la sesión de otro usuario?

También deben testearse casos como campos de entrada que pudieran desbordar un buffer, o inyectar una sentencia SQL.

Documentación

Además de la información necesaria para otras áreas, la documentación deberá incluir:

•configuración recomendada de servidor y aplicación

•permisos sobre cada recurso

•especificación de recursos sensibles involucrados

procedimientos adecuados para operar y efectuar cambios.

Mensajes de error

Es necesario verificar que los mensajes de error de la aplicación no proporcionen información sensible que pudieran utilizarse para vulnerarla, por ejemplo:

•rutas físicas

arquitectura de la plataforma

tablas de la Base de Datos

La configuración del servidor relativa a errores debe ser revisada y conocerse con exactitud como los errores son manejados.

Bajo IIS por ejemplo, debe optarse por mensajes de error genéricos al cliente en lugar de mensajes detallados de ASP.

Control de tags maliciosos

Debe existir un proceso para que los desarrolladores aseguren que las páginas generadas dinámicamente no contengan tags indeseables.

Los desarrolladores deben también restringir las variables a los caracteres explícitamente permitidos y hacer que esas variables sean chequeadas durante la generación de la página de salida.

Encriptación (SSL)

Si bien se lo comentó como insuficiente para proteger un sitio por sí misma, sigue siendo necesaria la encriptación para la transferencia de Ids y passwords a través de internet.

Logins de aplicación

El código no debe ejecutarse en el servidor de aplicación con el usuario root/administrador, así como no debe acceder a la BD con la cuenta de administrador (ej usuario sa en SQLserver) .

ASP/JSP

La información sensible sobre credenciales (username/password) para acceder a directorios de membresías y Bases de Datos no debe estar escrita en el código de la página (hardcoded).

Controles específicos de Java

Verificar que se utilizan los paquetes jave.security, java.security.acl and java.security.interfaces para habilitar permisos y agregar usuarios. En el archivo java.security properties debería incluirse la línea

Package.access=Package#1 [,Package#2,…,Package#n] , para proteger el acceso a cada paquete. El security manager debe habilitarse si está disponible.

Utilizar el parámetro –Djava.security.debug=help en el inicio para que la salida incluya información de acces y seguridad relevante.

La clase SecureRandom debería utilizarse para generar números aleatorios.

Chequear el classpath para evitar acceso a clases innecesarias.

Revisar los componentes (EJB u otros) y asegurar que el descriptor de cada uno contiene el código que asegura que únicamente el administrador tiene acceso a métodos restringidos.

Revisar los archivos de propiedades del servidor J2EE para verificar que sólo administradores autorizados están incluidos en el grupo admin.

Controles específicos de Perl

Los scripts de Perl deben ejecutarse en modo Tainted (parámetro –T). En este modo se asume que toda la entrada del cliente es "contaminada" y potencialmente dañina a menos que explícitamente el programador la autorize.

Puede ejecutarse un script para verificar que una variable contiene datos inseguros, y la presencia de los mismos debe convertir a toda la expresión que los contenga como insegura.

Los chequeos de "contaminación" de archivos deben efectuarse sobre los nombres de archivo suministrados por el usuario.

Cuando se utiliza un fork a un proceso hijo debe utilizarse la sintaxis abierta que conecta al hijo directamente con el padre y le asigna menos privilegios con respecto a éste.

Conclusiones

Hemos analizado simplemente algunos de los múltiples aspectos relativos a la seguridad en las aplicaciones web. Aunque claramente se cubrió una pequeña parte del tema, fue suficiente para comprobar lo fácilmente que puede ser vulnerada una aplicación cuando no se le asigna una prioridad adecuada a los controles de seguridad en las distintas etapas de desarrollo.

La presente realidad de la industria atenta contra la posibilidad de implementar estos controles en forma adecuada, en particular la creciente complejidad y variedad de tecnologías incrementa de la misma forma la variedad de puntos vulnerables y técnicas de ataque.

Muchas de las vulnerabilidades que se pueden presentar son propias de la plataforma sobre la que se desarrolla la aplicación (Sistema Operativo, software de base, herramientas de desarrollo), otras son negligencia por parte de jefes de proyecto, arquitectos, diseñadores, programadores, administradores y usuarios del sistema.

Vimos varias medidas de control, que deben ser implementadas en el marco de políticas de seguridad establecidas, ejecutadas en varias fases distintas del ciclo de vida de la aplicación, y controladas por un auditor, que permiten disminuir considerablemente los riesgos e impacto de estas amenazas vistas, aunque difícilmente sea posible asegurar la invulnerabilidad de una aplicación.

Bibliografía

Hacking Exposed Web Applications

Joel Scambray and Mike Shema 

McGraw-Hill/Osborne © 2002

XSS, Ejecución de parámetros, SQL Injection

Improving Web Application Security: Threats and Countermeasures

Microsoft Corporation 

Microsoft Press © 2003

Introducción, tipos de amenazas, mitos sobre seguridad

Auditing Web Applications

Nilesh Chaudhari

www.paladion.net/pdf/WebAppSec-ISACA-08-29.ppt

Amenazas inherentes, SQL Injection

Web Applications Checklist

Krishni Naidu

www.sans.org/score/checklists/WebApplicationChecklist.doc

Puntos de auditoría

 

 

 

 

Autor:

Sebastián Lopez

Universidad Católica del Uruguay

Facultad de Ingeniería y Tecnologías

Ingeniería en Informática

Octubre 2006

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente