55
Seguridad Web con PHP Seguridad Web con PHP “Cómo desarrollar una aplicación segura”

Seminario Seguridad con PHP

Embed Size (px)

DESCRIPTION

PPT de seminario de Seguridad con PHP, dictado el 18 de Junio de 2013 por Nazareno Lorenzo. Incluye: SQL Injection XSS File Uploads LFI/RFI CSRF Hashing y Encriptación

Citation preview

Page 1: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

“Cómo desarrollar una aplicación segura”

Page 2: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

• ¿Necesita mi aplicación ser segura?• ¿Es mi aplicación 100% segura?

• ¿Cuándo una aplicación es segura?

Seguridad

Page 3: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Ejemplos

Page 4: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Ejemplos

Page 5: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

SQL Injection

Page 6: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

SQL Injection

• Qué es una SQL injection?• Cómo funcionan?

SELECT id FROM users WHERE user='$user' AND pass='$pass'

SELECT id FROM users WHERE user='vader' AND pass='darkside'

SELECT id FROM users WHERE user='' or 1=1 #' AND pass='test'

Page 7: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Nuestra aplicaciónTabla ‘users’

Page 8: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 9: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

SQL Injection

• Cómo evitarlas?• Escapar caracteres

• Parameterized Queries

• Database Access Abstraction Layer• PDO• AdoDB

Page 10: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 11: Seminario Seguridad con PHP

Seguridad Web con PHP

Un poco de humor

Seguridad Web con PHP

Fuente: xkcd.com/327/

Page 12: Seminario Seguridad con PHP

Seguridad Web con PHP

Un poco de humor

Seguridad Web con PHP

Page 13: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

XSS:Cross Site Scripting

Page 14: Seminario Seguridad con PHP

Seguridad Web con PHP

XSS: Cross Site Scripting

Seguridad Web con PHP

Consiste en inyectar código HTML/JavaScript en un sitio

sobre el que no tenemos control.

• Existen dos grandes tipos: Persistente y No Persistente.

• Pueden permitir mostrar información falsa, manipular un formulario, o incluso robar las cookies del usuario.

Page 15: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

XSS: Cross Site Scripting

• Como funciona?

Estás Buscando <strong>'<?php echo $_GET['q']; ?>'</strong>

Estás Buscando <strong>'test'</strong>

Estás Buscando <strong>'<span style="color:red;">test</span>'</strong>

Page 16: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 17: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

XSS: Cross Site Scripting

• Cómo evitarlas?• Eliminar todo tag HTML

• Permitir una White-List de elementos• NO Permitir una White-List de elementos

• Convertir caracteres peligrosos

• Implementar BBCode o similar

• Usar una librería preparada para esto• HTMLPurifier ( http://www.htmlpurifier.org )

Page 18: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 19: Seminario Seguridad con PHP

Seguridad Web con PHP

XSS: Cross Site Scripting

Seguridad Web con PHP

Texto a inyectar

Código final

• XSS in Javascript

Page 20: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 21: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

File Uploads

Page 22: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

File Uploads

• Cuál es el riesgo?Las vulnerabilidades en uploads de archivos permiten a un atacante subir un archivo de un tipo no permitido en un servidor, pudiendo

llegar a ejecutarlo. La validación del tipo de archivo es el paso clave, y suele realizarse de diferentes maneras:

• Chequeando $_FILES['archivo']['type']:• Está solución es peligrosa y poco efectiva. El valor es seteado por el CLIENTE al enviar el archivo, por lo tanto, es completamente manipulable.

• Revisando si es una imagen real con getimagesize() o funciones similares:

• Este método es ligeramente mas seguro, pero igualmente puede manipularse utilizando una imagen con código escondido.

Page 23: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 24: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

File Uploads

• Entonces… Cual es la forma segura?Hay varios métodos que aseguran que el archivo no se ejecute. Si bien

debería bastar con solo uno, es recomendable aplicar todos para sumar capas extras de seguridad.

• Generar el nombre del archivo a mano, asegurandose de que la extensión sea simple, y sea un tipo de archivo no ejecutable (No PHP, Py, CGI)

• Desde un archivo .htaccess, prohibir la ejecución de scripts en el directorio.

• Desde los permisos CHMOD del archivo subido, eliminar los permisos de ejecución.

Page 25: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

LFI / RFI:File

Inclusions

Page 26: Seminario Seguridad con PHP

Seguridad Web con PHP

LFI / RFI: File Inclusion

Seguridad Web con PHP

Los ataques de File Inclusion permiten que un atacante obtenga acceso o ejecute un archivo al que no debería tener acceso.

• LFI (Local File Inclusion) cuando se logra incluir o ejecutar un archivo que está en el mismo servidor del sitio web.

• RFI (Remote File Inclusion) cuando se incluye o ejecuta un archivo publico que se encuentra en un servidor externo.

Pueden distinguirse varios tipos:

Page 27: Seminario Seguridad con PHP

Seguridad Web con PHP

LFI / RFI: File Inclusion

Seguridad Web con PHP

• LFI: Local File InclusionPermite ver información sensible del servidor. Puede suceder con un script que abre un archivo, por ejemplo, con “fopen()”; o cuando el script está incluyendo y ejecutando otro con “include()”, “require()” o similares.

Código vulnerable:

Código Ejecutado:

Page 28: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 29: Seminario Seguridad con PHP

Seguridad Web con PHP

LFI / RFI: File Inclusion

Seguridad Web con PHP

• RFI: Remote File Inclusion

Código vulnerable:

Es similar a la LFI, pero provoca la inclusión de archivos externos al servidor. Mayormente es útil en caso de que se presente con la función “include()” o similares.

Page 30: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 31: Seminario Seguridad con PHP

Seguridad Web con PHP

LFI / RFI: File Inclusion

Seguridad Web con PHP

• RFI: Remote File Inclusion

Forzar la extensión puede ser útil.

Sin embargo, dependiendo del sistema de archivos del servidor usando caracteres extraños sigue siendo vulnerable. Si se combina con una buena validación del nombre, se evitan la mayoría de los problemas.

La forma mas segura es replantear la lógica, de forma tal que nunca se deba incluir una URL obtenida del usuario, sin previamente revisar contra una lista de archivos permitidos.

Page 32: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

CSRF: Cross Site Request

Forgery

Page 33: Seminario Seguridad con PHP

Seguridad Web con PHP

CSRF: Cross Site Request Forgery

Seguridad Web con PHP

• Qué es?

• Se basa en la ejecución involuntaria de acciones en el navegador de cliente.

• Permite realizar requests desde el navegador de usuario, manteniendo su sesión y cookies.

• Muy común y uno de los problemas mas dificiles de solucionar

Page 34: Seminario Seguridad con PHP

Seguridad Web con PHP

CSRF: Cross Site Request Forgery

Seguridad Web con PHP

• Cómo explotarlo?

• La forma más simple y primitiva, es forzar al usuario mediante ingeniería social a ingresar a una URL específica.

• Una forma ligeramente mas avanzada es hacerlo abrir alguna página (o email) que contenga lo siguiente:

• Existen muchas mas formas: • Hacer al usuario abrir un sitio con un código javascript malicioso• Pedir que el usuario complete un formulario

Page 35: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 36: Seminario Seguridad con PHP

Seguridad Web con PHP

CSRF: Cross Site Request Forgery

Seguridad Web con PHP

• Cómo Solucionarlo?

• Evitar usar parametros GET para acciones que provoquen cambios persistentes elimina algunos de los riesgos, pero no todos

• La técnica mas efectiva es el uso de “Tokens”

Page 37: Seminario Seguridad con PHP

Seguridad Web con PHP

CSRF: Cross Site Request Forgery

Seguridad Web con PHP

• Tokens?

• Los tokens son claves únicas generadas para identificar al usuario • La forma mas común de implementarlo es generando una clave aleatoria, guardando una copia en una SESSION, y enviando otra a través de un campo oculto en todos los formularios

• Luego, la aplicación valida y exige que ambos tokens coincidan para poder realizar una operación.

Page 38: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 39: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Buenas Prácticas

Page 40: Seminario Seguridad con PHP

Seguridad Web con PHP

Hashes

Seguridad Web con PHP

• Qué son?

• Las funciones hash transforman una cadena de cualquier cantidad de caracteres en una de un ancho fijo.

• Hay diversos tipos de hashes, pero los mas utilizados en Seguridad informática son aquellos uni-direccionales. De estas, las dos funciones mas comunes son MD5 y SHA1.

• Un mismo input va a dar siempre el mismo output.

test -> 098f6bcd4621d373cade4e832627b4f6

Test -> 0cbc6611f5540bd0809a388dc95a615b

Page 41: Seminario Seguridad con PHP

Seguridad Web con PHP

Hashes

Seguridad Web con PHP

• ¿Para qué sirven?

• Los hashes permiten almacenar contraseñas en una base de datos, de forma tal que si alguien obtuviese acceso, no pueda obtener la contraseña original, solo su hash.

• La implementación desde PHP es muy sencilla:

• Debemos almacenar el hash al registrar al usuario, y cada vez que necesitemos verificarlo, comparar los hashes.

Page 42: Seminario Seguridad con PHP

Seguridad Web con PHP

Hashes

Seguridad Web con PHP

• Salts

• Con el tiempo surgieron bases de datos de hashes (rainbow tables) y sus frases originales, permitiendo buscar un hash y obtener la contraseña.• Para evitar esto, se utilizan los Salts. Son cadenas que se juntan con aquella que se desea hashear para generar un hash distinto y único.

Page 43: Seminario Seguridad con PHP

Seguridad Web con PHPSeguridad Web con PHP

Demo

Page 44: Seminario Seguridad con PHP

Seguridad Web con PHP

Encriptación

Seguridad Web con PHP

• Qué es y para qué sirve?

• Se llama encriptación a las técnicas que buscan hacer ininteligible una información a intrusos (Lectores no autorizados).

• En seguridad informática, generalmente se utiliza una clave, necesaria tanto para Encriptar como para luego Desencriptar el mensaje.

• Es útil para almacenar información sensible y transmitirla por medios no seguros.

Page 45: Seminario Seguridad con PHP

Seguridad Web con PHP

Encriptación

Seguridad Web con PHP

• Cómo se aplican?

• Hay muchos métodos de implementación distintos. La clase mcrypt agrupa la mayoría de los métodos recomendados:

Page 46: Seminario Seguridad con PHP

Seguridad Web con PHP

Exposición Innecesaria

Seguridad Web con PHP

• Se llama así a la mala práctica de mostrar errores o información del sistema a los usuarios.

• Es correcto mostrarlos durante las etapas de desarrollo, pero en Producción deberian esconderse al usuario.

• Si es posible, es conveniente guardarlos en un log.

Page 47: Seminario Seguridad con PHP

Seguridad Web con PHP

Exposición Innecesaria

Seguridad Web con PHP

• PHP permite configurar varias opciones con respecto a los errores

• display_errors define si los mensajes de error se van a imprimir al usuario o no. En producción debería tener el valor “0” y en desarrollo “1”

• error_reporting establece que nivel de errores quiere tenerse en cuenta; pudiendo configurarse para que solo muestre errores graves (“E_ERROR | E_PARSE”) o todo tipo de advertencia (“E_ALL”).• error_log define el nombre del archivo donde se guardan los logs de errores.

Page 48: Seminario Seguridad con PHP

Seguridad Web con PHP

Exposición Innecesaria

Seguridad Web con PHP

• PHP permite configurar varias opciones con respecto a los errores en el php.ini, o utilizando ini_set().

• display_errors define si los mensajes de error se van a imprimir al usuario o no. En producción debería tener el valor 0 y en desarrollo 1.

• error_reporting establece que nivel de errores quiere tenerse en cuenta; pudiendo configurarse para que solo muestre errores graves (“E_ERROR | E_PARSE”) o todo tipo de advertencia (“E_ALL”).• error_log define el nombre del archivo donde se guardan los logs de errores, en caso de que log_errors sea igual a 1.

• mysqli->error nunca debería ser impreso en producción. Puede logearse con error_log().

Page 49: Seminario Seguridad con PHP

Seguridad Web con PHP

Exposición Innecesaria

Seguridad Web con PHP

• APACHE por defecto incluye en los headers su versión, y la de PHP.

• Se debe editar el httpd.conf/apache2.conf e incluir las siguientes lineas:ServerTokens Prod ServerSignature Off

• En el php.ini o a través de ini_set() debe desactivarse expose_php:expose_php = off

Page 50: Seminario Seguridad con PHP

Seguridad Web con PHP

Exposición Innecesaria

Seguridad Web con PHP

• APACHE puede mostrar un listado de archivos presentes en una carpeta si no existe un index

• Puede configurarse desde el httpd.conf/apache2.conf, desde el virtualhost, o bien desde el .htaccess

• Debe incluirse la linea:Options -Indexes

Y en caso de que estén presentes algunas de las siguientes, eliminarlas:Options +Indexes IndexIgnore *

Page 51: Seminario Seguridad con PHP

Seguridad Web con PHP

Otras configuraciónes de PHP

Seguridad Web con PHP

register_globals permite que toda variable POST, GET y REQUEST se registren como variables globales. Es decir, que en lugar de acceder desde $_POST[‘variable’] podemos acceder desde $variable.

• Esto es muy peligroso! El siguiente código es vulnerable con register_globals = on, si el usuario envia por algun medio la variable userCorrecto:

Page 52: Seminario Seguridad con PHP

Seguridad Web con PHP

Otras configuraciónes de PHP

Seguridad Web con PHP

magic_quotes_gpc escapa automáticamente toda variable enviada por GET, POST o COOKIE. Es recomendable configurarlo en off, y escapar las variables manualmente en el momento de ingresarlas a una DB:

• Hace que el código sea portable de un servidor a otro, sin generar vulnerabilidades.

• Evita tener las barras en las validaciones previas a la subida (Largo del string, caracteres prohibidos, etc)

• Acostumbra al programador a ser consciente y estar atento a otras posibles fuentes (Además de GPC) por las que puede surgir una vulnerabilidad

Page 53: Seminario Seguridad con PHP

Seguridad Web con PHP

Otras configuraciónes de PHP

Seguridad Web con PHP

allow_url_include y allow_url_fopen establecen si las funciones include y fopen pueden abrir urls externas, o solamente paths a archivos locales.

• Desactivarlas da grandes ventajas en seguridad, evitando RFI.

• En algunos casos, es útil usar fopen para abrir urls externas, y con estas opciones en OFF, es imposible. Debe recurrirse a alguna librería adicional como CURL.

Page 54: Seminario Seguridad con PHP

Seguridad Web con PHP

Preguntas · Dudas · Información

Page 55: Seminario Seguridad con PHP

Seguridad Web con PHP

MUCHAS GRACIAS!

Nazareno Lorenzo

Full Stack Web Developer

[email protected]

www.nazarenolorenzo.com.ar

Argentina, Buenos Aires

Todas las marcas, logos e isologos utilizados en la presentación son propiedad de sus respectivos propietarios