Desarrollo de sitios web con PHP y MySQL Tema 7: Seguridad José Mariano González Romano

Slides:



Advertisements
Presentaciones similares
Presentación – Web Attack
Advertisements

1 | Web Attacks Documentación – Web Attack. 2 | Web Attacks Seguridad en Aplicaciones Web Protocolo HTTP Vulnerabilidad XSS Vulnerabilidad CSRF Path Traversal.
Curso de PHP Tema 5: Sesiones.
1 | Web Attacks Documentación – Web Attack. 2 | Web Attacks Seguridad en Aplicaciones Web Protocolo HTTP Vulnerabilidad XSS Vulnerabilidad CSRF Path Traversal.
MY NCBI (módulo 4.5). MODULO 4.5 PubMed/ ¿Cómo utilizar MY NCBI? Instrucciones – Esta parte del: Esta parte del curso es una presentación PowerPoint que.
Internet y tecnologías web
El mecanismo básico de interacción entre el usuario y un sitio web esta dado por el uso de formularios html. El server envía un formulario que el browser.
integridad referencial
Lenguaje PHP Capítulo 4.
CI-2413 Desarrollo de Aplicaciones para Internet
CGI I La mayor parte de los elementos HTML de que disponemos permite al visitante visualizar los contenidos de un sitio, pero no interactuar con él. Dicho.
ADMINISTRACION DE REDES SECUENCIA DE COMANDOS EN SITIOS CRUZADOS(XSS)
Errores comunes al desarrollar websites
M.C. Rafael A. García Rosas.
Acceso a bases de datos MySQL en PHP
Tema: Técnicas Básicas Excel (III) Trucos, opciones y personalización de Excel Índice: 1 Vínculos absolutos y relativos, conectando datos de Excel con.
Desarrollo de sitios web con PHP y MySQL Tema 3: Formularios José Mariano González Romano
"java del lado del servidor" Servlet y JSP Java Server Pages.
SISTEMA DE NACIMIENTOS MANUAL DEL USUARIO. El objetivo del presente manual es servir de guía al usuario final para interactuar con el Sistema, permitiéndole.
OBJETO REQUEST. El objeto Request Por qué el objeto request Funcionamiento Colecciones: – Transferencia de variables por URL –Transferencia de variables.
Subir Ficheros al Servidor con PHP José Sánchez Galvañ.
Curso de PHP Tema 3: Formularios.
Curso de PHP Tema 6: Seguridad.
Tema 2: Lenguaje PHP básico
Seguridad Web. Agenda 1.Introducción 2.Aspectos Básicos 3.Top Ten 4.Ethical Hacking 5.Conclusiones 6.Preguntas y Respuestas.
HINARI – Acceso a los artículos: Problemas y Soluciones.
TECNOLOGÍA IDC Internet Database Connector Trinitario Gómez López.
Controlde acceso mediante sesiones índice 1. Introducción 2. Comenzar sesión Control de acceso mediante sesiones 3. Estructura de página 4. Autentificación.
ADMINISTRACION DE REDES TEMA REDIRECCIONES Y REENVÍOS NO VALIDADOS
Taller 5: Trabajo con Plantillas y uso de tecnología Ajax.
Desarrollo de sitios web con PHP y MySQL Tema 5: Sesiones José Mariano González Romano
Personalización en diseño visual y comportamiento de la plantilla
Declaración de Operaciones
TRABAJO DE SISTEMAS R EFERENCIA D IRECTA I NSEGURA A O BJETOS REALIZADO POR : DEISY MOSQUERA KARINA CHAVERRA.
ADMINISTRACION DE REDES SECUNECIA DE COMANDOS EN SITIOS CRUZADOS(XSS) DIEGO ALEXANDER MADRID DUQUE GABRIEL ANDRES AGUIRRE JARAMILLO INSTITUTO TECNOLOGICO.
Ingeniero Anyelo Quintero
Como empezar en Access 2000 Abrir Access 2000 Pulsamos INICIO
Almacenar variables en cookies en PHP
Los Diez Riesgos Más Importantes en Aplicaciones WEB Top A1-Inyección Oscar William Monsalve Luis Alberto Suarez Jorge Eliecer Betancur Diana Marcela.
WEB VULNERABLE DVWA Universidad de Almería
The OWASP Foundation OWASP AppSec Aguascalientes 2010 Guía de Desarrollo Seguro Francisco Aldrete Miembro de OWASP capítulo Aguascalientes.
Introducción a las redes e Internet Unidad 7: Páginas web dinámicas Clase 1 Unidad 7: Páginas web dinámicas Clase 1.
Bases de datos en la Web n Las bases de datos permiten almacenar de una forma estructurada y eficiente toda la información de un sitio web n Ventajas –Proporcionar.
ASP.NET es una nueva y potente tecnología para escribir páginas web dinámica. Es una importante evolución respecto a las antiguas páginas ASP de Microsoft.
OWASP - A6 Open Web Application Security Project Riesgo por: Configuración Defectuosa de Seguridad Guillermo David Vélez Álvarez C.C. 71' 763,346.
Diego Pastor Ralde. Client-side Vulnerabilities  Web Browsers  Office Software  Clients  Media Players.
5. Sistemas de archivos avanzados1 Tema 5: Sistemas de Archivos Avanzados Resumen: –Sistema de archivos distribuido –File Replication Service.
Ing. Elkin José Carrillo Arias
Uso de las Sesiones Temas: Creación de sesiones Lectura de sesiones Borrado de sesiones.
ATAQUES POR INYECCION DE CODIGO SQL
Desarrollo de sitios web con PHP y MySQL
UD 1: “Adopción de pautas de seguridad informática” Análisis de las principales vulnerabilidades de un sistema informático. Luis Alfonso Sánchez Brazales.
introducción al lenguaje
CREAR UNA WEB Documento extraído de Sector PC On Line
REFERENCIA DIRECTA INSEGURA A OBJETOS
Seguridad DNS. Javier Rodríguez Granados.
S EGURIDAD DNS - V ULNERABILIDADES, AMENAZAS Y ATAQUES. - M ECANISMOS DE SEGURIDAD. Luis Villalta Márquez.
Introducción a ataques de tipo inyección: Inyección SQL
S EGURIDAD Y A LTA D ISPONIBILIDAD Nombre: Adrián de la Torre López 24/09/ Adrián de la Torre López.
File Transfer Protocol.
Se producen cuando una aplicación recibe datos no confiables y estos no han sido validados adecuadamente antes de procesarlos, lo cual puede llevar a que.
Tema 11 Bases de Datos y el Lenguaje SQL
Análisis de las principales vulnerabilidades de un sistema informático. Gabriel Montañés León.
Práctica Profesional PHP.
Secuencia de Comandos en Sitios Cruzados XSS
Hackear un Sitio Web. Claudio
A NÁLISIS DE LAS PRINCIPALES VULNERABILIDADES DE UN SISTEMA INFORMÁTICO Luis Villalta Márquez.
WINDOWS SERVER 2008 r2 ADMINISTRACION DE RECURSOS: Con el Administrador de recursos del sistema de Windows del sistema operativo Windows Server® 2008 R2,
DLM Transact SQL Sesión I Introducción al SQL Server Uso de las herramientas de consultas del Transact SQL.
Php y mysql índice 1. Conexión 6. Ejercicio 5. Insertar un registro 2. Operaciones básicas 3. Seleccionar BD 4. Crear una BD P h p y m y s q l Índice 1.
Transcripción de la presentación:

Desarrollo de sitios web con PHP y MySQL Tema 7: Seguridad José Mariano González Romano

Tema 7: Seguridad 1. Seguridad en las aplicaciones web 2. Seguridad en PHP 3. Variables globales 4. Nombres de ficheros 5. Subida de ficheros 6. Bibliotecas 7. Formularios 8. Inyección SQL

Seguridad en las aplicaciones web n ¿Cuánta seguridad es necesaria? –La seguridad supone un coste económico y de eficiencia. Hay que disponer de la adecuada, ni más ni menos n Reglas: –El riesgo cero no es práctico –Hay diversas formas de mitigar el riesgo –No se puede gastar un millón para proteger un céntimo

Seguridad en las aplicaciones web n Amenazas más importantes: Top 10 –The Open Web Application Security Project (OWASP) The Ten Most Critical Web Application Security Vulnerabilities (2007) 1.Cross Site Scripting (XSS) 2.Injection Flaws 3.Malicious File Execution 4.Insecure Direct Object Reference 5.Cross Site Request Forgery (CSRF) 6.Information Leakage and Improper Error Handling 7.Broken Authentication and Session Management 8.Insecure Cryptographic Storage 9.Insecure Communications 10.Failure to Restrict URL Access

Seguridad en las aplicaciones web n Seguridad en el cliente –Código móvil n Seguridad en el servidor –Servidor web, servidor de bases de datos, lenguajes de servidor n Seguridad en la aplicación –Control de acceso –Validación de datos de entrada –Programación segura n Seguridad en la comunicación –Certificados digitales, SSL

Seguridad en PHP n Primera recomendación: –Disponer siempre de versiones actualizadas de Apache y PHP n Aspectos de PHP que pueden dar lugar a vulnerabilidades: –Variables globales –Nombres de ficheros –Subida de ficheros –Bibliotecas –Datos enviados desde formularios

Variables globales n Cuando register_globals está activado en el fichero php.ini, PHP crea automáticamente variables globales a partir de los datos de los formularios y de las cookies n Esto puede dar lugar a problemas como en el ejemplo siguiente: <?PHP if (comprueba_privilegios()) $superuser = true;... ?>

Variables globales n Una llamada a este script de la forma pagina.php?superuser=1 permitiría obtener privilegios de superusuario n Para resolver este problema existen tres soluciones: –Deshabilitar register_globals en el fichero php.ini –Inicializar las variables –Establecer el orden de las variables en PHP

Variables globales n Deshabilitar register_globals en el fichero php.ini –La directiva register_globals del fichero php.ini establece si se admite o no la creación automática de variables globales –A partir de PHP el valor por defecto de esta directiva es off, que es el valor recomendable

Variables globales n Inicializar las variables –El problema anterior se soluciona dando un valor inicial a la variable $superuser: <?PHP $superuser = false; if (comprueba_privilegios()) $superuser = true;... ?>

Variables globales n Inicializar las variables –Es recomendable inicializar todas las variables antes de usarlas. Se puede usar la directiva error_reporting=E_ALL en php.ini para que se muestre un aviso cuando se use una variable que no haya sido previamente inicializada –En un entorno de producción debe evitarse la aparición de mensajes de aviso o error. Para ello se utilizan las siguientes directivas en php.ini: display_errors = off log_errors = on error_log = /var/log/php_errors.log –Los errores irán al fichero especificado en lugar de mostrarse en la pantalla

Variables globales n Establecer el orden de las variables en PHP –PHP crea automáticamente variables globales a partir del entorno (E), las cookies (C), la información del servidor (S) y los parámetros GET (G) y POST (P) –La directiva variables_order controla el orden de estas variables. El valor por defecto es “EGPCS” –Permitir la creación de variables globales desde parámetros GET y POST y desde cookies es potencialmente peligroso. Un posible valor para variables_order que evita esto es “ES” –En tal caso para acceder a los parámetros de los formularios y a las cookies se deben utilizar los arrays globales $_REQUEST, $_GET, $_POST y $_COOKIES

Variables globales n Establecer el orden de las variables en PHP –Si se modifican las directivas register_globals y/o variables_order es preciso revisar los scripts existentes para adaptarlos a las nuevas circunstancias –Una forma puede ser la siguiente: $edad = $_REQUEST[‘edad’];...

Nombres de ficheros n Es relativamente fácil construir un nombre de fichero que se refiera a algo distinto a lo que se pretende n Sea el siguiente código: include (“/usr/local/lib/bienvenida/$username”); n Este código pretende mostrar un mensaje de bienvenida personalizado para el usuario. Aparentemente no es peligroso, pero ¿qué ocurriría si el usuario introduce como nombre la cadena “../../../../etc/passwd”? –Se mostraría el fichero de passwords del sistema

Nombres de ficheros n Además hay que tener en cuenta que las funciones de manejo de ficheros como include() o require() admiten nombres de ficheros remotos, lo que podría provocar la ejecución de código maligno cargado de otro servidor. Sea, por ejemplo, el código include ($libdir. “/conecta.php”); n Si un atacante modifica el valor de la variable $libdir a, pongamos por caso, “ y coloca en la raíz del mismo un fichero de nombre conecta.php, su código sería ejecutado n Se puede desactivar la funcionalidad de acceso a ficheros remotos con la siguiente directiva en php.ini: allow_url_fopen = off

Nombres de ficheros n Para chequear nombres de ficheros se utilizan las funciones realpath() y basename(). La primera convierte direcciones relativas en absolutas y la segunda toma una ruta y devuelve la parte correspondiente al nombre del fichero. Ejemplo: $file = $_POST[‘username’]; $file2 = basename (realpath($file)); if ($file2 != $file) die (“$file no es un username válido”); include (“/usr/local/lib/bienvenida/$file”);

Nombres de ficheros n Otra defensa contra los nombres de ficheros incorrectos es la directiva de php.ini open_basedir: open_basedir = /alguna/ruta n PHP limitará las operaciones sobre ficheros al directorio especificado y sus subdirectorios: include (“/alguna/ruta/lib.inc”);// permitido include (“/otra/ruta/lib.inc”);// da error

Subida de ficheros n La subida de ficheros permite a un usuario enviar cualquier fichero al servidor, lo cual encierra un gran peligro ya que un atacante puede subir un código maligno y luego ejecutarlo, causando más daño que cuando se incluye el código desde un servidor remoto n Como recomendación general, debe evitarse utilizar el nombre enviado por el navegador (podría ser, por ejemplo, /etc/passwd). Es conveniente generar un nombre único para el fichero subido

Subida de ficheros n Otro peligro es el tamaño de los ficheros. Aunque se limite el tamaño máximo en el formulario, los ficheros se reciben automáticamente y luego se comprueba su tamaño n Es posible que un usuario intente provocar un ataque de denegación de servicio enviando varios ficheros de gran tamaño a la vez y llenando el sistema de ficheros utilizado por PHP para almacenarlos n Para evitar esto se puede utilizar la directiva post_max_size de php.ini. El valor por defecto suele ser más elevado de lo necesario n El campo oculto MAX_FILE_SIZE en los formularios es conveniente porque evita que comience la subida de un fichero si supera el tamaño permitido, pero puede saltarse con facilidad, por lo que no es suficiente. La directiva de php.ini sí lo es

Bibliotecas n Es conveniente almacenar los ficheros de biblioteca fuera de la raíz de la web para evitar que puedan ser accedidos por su URL n En tal caso debe hacerse saber a PHP la ubicación de los ficheros indicando la ruta completa en los include() y require() o bien mediante la directiva include_path en php.ini include_path = “.:/usr/local/php:/usr/local/lib/myapp” n Esto es particularmente importante cuando en el código de la biblioteca aparecen passwords, como es el caso de las funciones de conexión con bases de datos

Formularios n Es recomendable validar todos los datos provenientes de formularios para asegurarse de que los valores recibidos son los esperados n En general, cualquier información proveniente del exterior debe contemplarse como posiblemente contaminada y debe ser verificada antes de ser utilizada n Sea el siguiente ejemplo: print (“Nombre: “. $nombre); print (“Comentario: “. $comentario);

Formularios n Si el autor del comentario introdujo algún código HTML en el texto del mismo, el código será interpretado y sus efectos podrían ser graves n Para evitar esto se puede utilizar la función htmlspecialchars(), que impide que se interpreten los caracteres especiales de HTML (, &) n El código quedaría de la siguiente manera : print (“Nombre: “. $nombre); print (“Comentario: “. htmlspecialchars($comentario));

Inyección SQL n Inyección –Consiste en inyectar en la aplicación datos introducidos por el usuario. Esto es muy habitual y de por sí no es peligroso –Ejemplo: sea la instrucción sql= "SELECT * FROM noticias WHERE id = $id"; –Pulsando en el artículo de interés para el usuario se convierte en: sql= "SELECT * FROM noticias WHERE id = 228";

Inyección SQL n Inyección SQL –Consiste en inyectar un mandato dentro de una consulta SQL. Sea la consulta: $consulta = “SELECT titulo FROM libros WHERE codigo = $codigo”; –siendo $codigo un valor introducido desde un formulario. Si el valor es ‘23’ la consulta será: SELECT titulo FROM libros WHERE codigo = 23 –Si el valor es ’23; DROP TABLE users’ la consulta es: SELECT titulo FROM libros WHERE codigo = 23; DROP TABLE users –que destruiría la tabla de usuarios de MySQL

Inyección SQL n Inyección SQL –Sea ahora el siguiente código muy habitual en una aplicación Web: $consulta = “SELECT id FROM usuarios WHERE username = ‘$username’ AND password = ‘$password’”; –Si se introducen los valores juan como username y Ag3n.da como password, la consulta queda: SELECT id FROM usuarios WHERE username = ‘juan’ AND password = ‘Ag3n.da’

Inyección SQL n Inyección SQL –Se puede saltar la comprobación del password introduciendo el valor juan’-- como username o el valor ‘ OR ‘’=’ como password. Las consultas que quedarían en ambos casos son, respectivamente: SELECT id FROM usuarios WHERE username = ‘juan’--‘ AND password = ‘’ SELECT id FROM usuarios WHERE username = ‘juan’ AND password = ‘’ OR ‘’=’’ –En el primer caso nótese que -- es un comentario de línea en MySQL y provoca que se ignore todo lo que viene tras él en la línea

Inyección SQL n Inyección SQL –La inyección SQL puede utilizarse para: •Cambiar valores de las consultas •Concatenar varias consultas •Añadir llamadas a función y procedimientos almacenados a una consulta  Para evitar la inyección SQL es muy importante validar los valores que se han de integrar en la consulta SQL. En el primer caso, por ejemplo, $codigo debe ser un valor entero

Resumen n De todo lo anterior podemos concluir las recomendaciones siguientes: –Validar todos los datos de entrada de la aplicación •Aceptar únicamente datos válidos conocidos •Rechazar datos no válidos conocidos •Sanear todos los datos –Configurar adecuadamente PHP a través del fichero php.ini –Seguir unas buenas prácticas en la programación n Hay que tener en cuenta que cualquier cambio en la configuración de PHP afectará a los scripts de todos los usuarios y posiblemente a algunas herramientas, lo cual debe ser tenido en cuenta y estudiarse sus consecuencias antes de proceder a realizarlos