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 cliente–servidor. 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
Página anterior | Volver al principio del trabajo | Página siguiente |