domingo, 6 de abril de 2014

[Parte 7] Seguridad en PHP

Autenticacion y autorizacion

La autenticacion es el acto de establecimiento o confirmacion de algo (o alguien) como autentico. La autenticacion de un objeto puede significar (pensar) la confirmacion de su procedencia, mientras que la autenticacion de una persona a menudo consiste en verificar su identidad. La autenticacion depende de uno o varios factores.

La autorizacion es parte del sistema operativo que protege recursos del sistema permitiendo que solo sean usados por aquellos consumidores a los que se les ha concedido autorizacion para ello. El proceso de autorizacion se utiliza para decidir si la persona, programa o dispositivo X tiene permiso para acceder al dato, funcionalidad o servicio Y.

En este caso podemos unir la autenticacion con la autorizacion de manera que podamos darle permisos a cierto usuario para acceder a ciertos recursos, siempre y que este autenticado como usuario con dichos privilegios en una aplicacion web, este tipo de aplicaciones tales como paneles administrativos, inicio de sesion, etc. Suelen ser un blanco para diferentes tipos de ataques.

Ataques de fuerza bruta

Un ataque de fuerza bruta es una manera de recuperar la clave probando todas las combinaciones posibles hasta encontrar aquella que permita el acceso, digamos que por ejemplo, tenemos una aplicacion web donde conocemos sus usuarios, pero no conocemos sus contraseñas, intentamos iniciar sesion un sin fin numero de veces con las mas posibles contraseñas hasta lograr dar con la que realmente es, asi finalmente, obteniendo el acceso.



Existen muchos programas famosos tal como THC-Hydra con el cual puedes realizar ataques por fuerza bruta en varios servicios, como puede ser: HTTP, FTP, SSH, TELNET, MYSQL, ETC...

Les adjunto un video en el cual se realiza este tipo de ataque utilizando Burp Suite:



Para protegernos de este tipo de ataques podemos suspender la cuenta del usuario por un tiempo estimado por tantos inicios de sesion fallidos, o tambien agregar un sistema de captcha a nuestro inicio de sesion, y tambien podriamos poner que al registrarse se utilizen letras mayusculas, numeros y caracteres extraños para que la contraseña sea segura.

Un ejemplo del inicio de sesion fallido y esperar un determinado tiempo podria ser el siguiente:



Olfateo de contraseñas

Este tipo de ataques lo habiamos comentado cuando hablamos sobre sesiones, donde se hablaba sobre MITM (hombre en el medio).

Los analizadores de paquetes tienen diversos usos, como monitorear redes para detectar y analizar fallos, o para realizar ingieneria inversa en protocolos de red. Tambien es habitual su uso para fines maliciosos, como robar contraseñas, interceptar correos electronicos, espiar conversaciones de chat, etc.

Existen varios analizadores de paquetes entre los mas famosos puedes encontrar Wireshark...

Puedes encontrarlo en su pagina oficial: http://www.wireshark.org/

O simplemente la Suite de Aircrack la cual puedes encontrar desde: http://www.aircrack-ng.org/

Para protegerse contra este tipo de ataques habiamos comentado en la parte 4 de seguridad en php el uso de SSL para poder mitigar este tipo de ataques.

Un ejemplo es usarlo simplemente en todas las urls que se envien por el metodo GET de tu sitio web. Un ejemplo:




Ataques de repeticion




Como vimos en la parte 2 de seguridad en php veiamos como con burp suite pro podiamos atrapar cabeceras http y realizar ataques de repeticion, con esto simplemente podemos poner los datos que se hayan atrapado en el olfateo de contraseñas o alguna cookie que haya sido atrapada y repetir el ataque, podemos usar un complemente como tal es el caso de live http headers que se encuentra para mozilla firefox.

Para evitar este tipo de ataques simplemente tenemos que tratar de realizar las otras partes de seguridad ya comentadas como es el uso de SSL, el uso correcto de sesiones, de ataques de fuerza bruta, prevenir el robo de cookies, etc.

Y otra medida de seguridad es usar un tiempo de expiracion de acceso a un recurso privado. Tal como en el uso de sesiones dar un tiempo de expiracion, y cuando alguien quiera realizar algun tipo de accion que considere que sea muy brusca por el momento, como por ejemplo, cambiar la contraseña, pedir de nuevo el uso de introduccion de contraseña real, de manera que el atacante no sabra la verdadera contraseña si hizo uso de alguna cookie.



Inicios de sesion persistentes

Un inicio de sesion persistente es una sesion que se mantiene registrada por mucho tiempo, digamos que hoy validas la sesion, mañana entras y sigues validado, entras dentro de una semana y sigues validado... 


Muchas paginas web incluyen este checkbox de recordarme, el cual les da una sesion un poco mas larga de lo normal...

Un usuario atacante puede realizar un ataque de repeticion de manera que obtenga la misma sesion que el usuario.


La manera mas erronea y mas comun en un inicio de sesion persistente es almacenar el nombre de usuario y contraseña en una cookie, ya que los datos son expuestos. La manera mas facil de evitar este error es crear un token valido para una sola autenticacion:


<?php
 $token = md5(uniqid(rand(),TRUE));
?>

Sin embargo, un enfoque mejor consiste en utilizar un identificador secundario es menos probable que sea predecible o descubierto. Consideremos una tabla que tiene 3 columnas identificador (identifier), token, tiempo de espera (timeout:

Como puedes ver mostramos una tabla usuarios la cual contiene las 3 columnas que indicamos anteriormente.

Al generar un identificador secundario junto al token, podemos crear una cookie que no revele ninguna credencial de autenticacion del usuario:


Asi cuando un usuario intenta hacer un inicio de sesion persistente, se verifican varias cosas:

 
Se deben cumplir tres cosas importantes a la implementacion de las cookies para evitar el incio de sesion persistente, las cuales son:

* Las cookies vencen en una semana (o menos)
* La cookie solo cuenta para una sola autenticacion (borrar y regenerar el token cada inicio de sesion correcto)
* Un tiempo de espera (timeout) de una semana o menos se aplica al servidor

Por ultimo para asegurarnos de que un usuario realmente se ha desconectado de la sesion:


Lo cual sobreescribe la cookie con un valor inutil haciendo que la sesion caduque.  

Referencias:

* Essential PHP Security
* Wireshark
* Aircrack
* Wikipedia
* Mozilla Foundation
* THC-Hydra
 

No hay comentarios:

Publicar un comentario en la entrada