seguridad en el desarrollo de aplicaciones web php
DESCRIPTION
Platica impartida por Jesus Reyna e Iván Rico en el flisol 2011 en Mty N.L. MéxicoTRANSCRIPT
Seguridad en el Desarrollo de Aplicaciones Web PHP
Seguridad en el Desarrollo de Aplicaciones Web PHP
Iván Rico - @7th_signIván Rico - @7th_signJesus Reyna - @jgreynaJesus Reyna - @jgreynaPHPmx : http://phpmexico.mx/
Conceptos
Qué es la seguridad?
La seguridad es una medida, no una característica La seguridad es difícil de medirse, no tiene
unidades También es un problema que está creciendo y que
requiere una continua solución evolutiva Así como el diseño de una aplicación, la seguridad
debe de ser considerada todo el tiempo (especificaciones iniciales, implementación, pruebas y durante el mantenimiento)
Necesidades de Seguridad en una Aplicación Web
Que exista un ambiente seguro Hay que darle valor a la privacidad Hay que darle más valor a la información de los
clientes Debemos recordar, son los usuarios los que
harán uso del sistema Hay que hacer la experiencia del usuario
segura y mejorada Los usuarios pueden ser buenos, pero también
pueden ser malos
PHP en hechos
Es un lenguaje muy popular para el desarrollo de aplicaciones web
Sencillo de aprender y adoptar Popular entre los “newbies” Durante el desarrollo, regularmente se olvida
un pequeño gran aspecto, la seguridad. Se tiene la tendencia de “después lo hacemos”,
dando como resultado aplicaciones con severos hoyos de seguridad.
Importancia de la seguridad en PHP
PHP es y seguirá siendo extensamente usado para el desarrollo de Aplicaciones Web
PHP esta marcando camino en el desarrollo de aplicaciones empresariales y el mercado corporativo
Es muy efectivo, pero a menudo se pasan por alto medidas para prevenir usuarios maliciosos
Las aplicaciones web PHP a menudo terminan trabajando con datos extremadamente sensibles.
Seguridad en el ambiente
Aspectos a considerar
Quién debe de tener acceso físico a los servidores?
Quién debe de tener acceso mediante shell? Podrá el servidor web escribir en el sistema de
archivos? Es necesario tener lenguajes de programación
o servicios adicionales en el servidor? Los servicios de pueden dividir en varios
servidores?
Bloqueos básicos en el SO
Apagar servicios sin uso, actualizar los componentes del sistema, usar los archivos de configuraciones recomendadas.
Habilitar un analizador de logs (bitácoras) Habilitar un analizador de integridad del
sistema Configurar un firewall local con los puertos
estrictamente necesarios (web: 80, 443)
Configuración de Apache
Antes de realizar cambios, buscar problemas potenciales que puedan afectar en el contexto del servidor
Deshabilitar los módulos innecesarios Cambiar los directorios por defecto Cambiar los archivos índices por defecto Usar módulos que proporcionen seguridad
adicional a Apache como mod_dosevasive y mod_security
mod_dosevasive
Fácil de configurar Nos ayuda a evadir ataques DoS bloqueando
direcciones IP o URL temporalmente Podemos bloquear si:
Una solicitud hecha a la misma página X veces por segundo de desde un mismo origen
Mas de X solicitudes concurrentes por segundo son hechas
Se puede comunicar con un firewall o un router y ejecutar comandos
mod_security
Muy poderoso Es un firewall personal de nuestra aplicación Configuración detallada, requiere de muchas
pruebas Utilizar en la medida de lo posible cuando se
corran aplicaciones en el servidor Características:
Filtra las peticiones antes que apache Filtra incluso SSL Aplicación de reglas basadas en expresiones
regulares y capacidad de logs (bitácoras)
mod_ssl
Usarlo obligatoriamente Es sencillo de configurar Hace que la comunicación ente el servidor y el
cliente se haga de manera cifrada Se basa en el intercambio de certificados
digitales (PKI) Nos protege de ataques de sniffers y previene
el MITM Requiere que el certificado sea firmado por una
entidad certificadora ($)
Configuración de PHP
Nunca dejar las configuraciones por defecto en versiones menores a la 4.8
Utilizar siempre las nuevas versiones estables (Rama 5)
Ampliamente recomendable revisar las configuraciones por defecto, algunas vulnerabilidades pueden ser explotadas
Evitar en la medida de lo posible la ejecución de comandos del sistema operativo
Configuraciones recomendadas
display_errors = Off log_errors = On error_reporting = E_ALL session.gc_maxlifetime = 600 (10 mins) magic_quotes_gpc = Off register_globals = Off safe_mode = On safe_mode_gid = On
Configuraciones recomendadas
allow_url_fopen = Off allow_url_include = Off open_basedir = /ruta short_open_tag = Off
Seguridad en el desarrollo
Vulnerabilidades en desarrollos en PHP
Ejecución Remota de Código (Remote Code Execution)
Cross-site scripting (XSS) SQL Injection Ataques al sistema de archivos
Ejecución Remota de Código
Afecta a las aplicaciones que aceptan nombres de archivos por parte del usuario cuando el sitio web maneja el ingreso y la inclusión de archivos y URLs sin chequeo previo.
Las causas de este problemas son: Deficiente validacion antes de invocar los
archivos con fopen require include
Cross-site scripting (XSS)
Algunas recomendaciones
Verificar que todos los parámetros en la aplicación sean validados y/o
encodeados antes de ser incluídos en la página HTML
La mejor protección para XSS es una combinación de validación
“whitelist” y un encodeo apropiado de todos los datos de salida.
htmlspecialchars() para convertir los caracteres “, &, < y > en & “
< y >. (PHP tiene otra función htmlentities() que convierte todos los
caracteres que tienen entidades equivalentes HTML)
Cross-site scripting (XSS)
echo '<td>';
echo htmlspecialchars($unaFila['mensaje']);
echo '</td>'; ...
La aplicación no debería depender de register_globals
SQL Injection
Validar datos antes de usarlos en queries SQL dinámicos
Preferir validación positiva a validación de casos inválidos
Usar PDO (PHP Data Objects)
Usar declaraciones parametrizadas MySQLi’s
Al menos, usar funciones como mysql_real_escape_string()
OJO:
El uso de addslashes() no es suficiente.
magic quotes (eliminado en PHP6) da una falsa sensación de seguridad.
Ataques al sistema de archivos
Upload Injection de archivos locales Inclusión de archivo local (tal como
/etc/passwd, archivos de configuración, o logs) Manipulación de sesiones locales La mayoría de los administradores del sitio
corren PHP sin usuario (nobody) bajo Apache, las vulnerabilidades sobre el sistema de archivos local afectan a todos los usuarios dentro de un host simple.
¿Preguntas?
Iván Rico - @7th_signIván Rico - @7th_signJesus Reyna - @jgreynaJesus Reyna - @jgreynaPHPmx : http://phpmexico.mx/