domingo, 26 de noviembre de 2017

Fucking to your bullshit code

Que una aplicación web funcione, no significa que esté bien programada ni que sea segura ni mucho menos. Una aplicación web puede funcionar de maravilla pero ser altamente insegura. Su solución suele ser bastante sencilla, y lleva menos de 1 minuto; no obstante, pocos programadores lo tienen en cuenta, por lo que si se sumasen pequeños fallos de configuración, el resultado podría ser un owned total de la organización por no pararse un minuto.


No suele ser frecuente que suba una entrada en la que además os deje algún código de programación que me haya fabricado para mostrar un ejemplo de lo que estoy diciendo o que me sirva para una PoC pequeña. Hoy estáis de suerte ya que vi algunas cosas que me gustaron muy poco.

Exponiendo el problema

Mi pareja necesitaba tener una página web, y claro, con un novio informático...se lo pidió a otro, vamos, lo que se llaman cuernos informáticos por la cara. Pero a mí me vino genial eso, ya que estaba bastante ocupado y así tenía menos tareas de las que encargarme. El problema vino cuando le pedí la web porque quería probar cómo quedó.


Como no os puedo mostrar esa web original, yo me he fabricado rápidamente una de prueba y que se pareciera bastante a la aplicación web original. La página, en su ventana inicial no tenía mucho misterio, una zona de registro y login sencillito. Yo hice la prueba y registré un usuario con una contraseña cualquiera, que en este caso para este usuario, la contraseña era test.




El formulario es muy sencillo, ya que establezco la conexión con un include y recibo los parámetros del usuario. Nada más recibir la contraseña, yo la cifro con MD5, compruebo que ese usuario no exista ya y sino existe, hago un INSERT INTO y fuera. No tiene mucho misterio, y si sabéis un poco de PHP, vosotros mismos os podéis crear este pequeño lab.

¿Dónde está el problema?

El problema reside en que la contraseña se ha cifrado con un algoritmo inseguro, con MD5, por lo que el atacante, si pudiese llegar hasta la Base de Datos, no le resultaría muy complicado, averiguar la contraseña. Pero ¿Es común que se utilice MD5 para cifrar datos en aplicaciones web?


Para responderme a este pregunta me cree una dork sencillita, y tras ver que me devolvía bastantes resultados, solamente tenía que pasarme por cada resultado y ver cuál era la aplicación web "más divertida".


Por lo que se aprecia, es bastante común encontrarse con developers que utilizan la función md5(), una función de cifrado de datos, no muy seguro.

PoC 1: Sacando la contraseña cifrada

Por si fuese poco, si te daba por jugar con la URL de la web y querías quitar todo lo que había entre barras en [WEB]/home/, te dabas cuenta de que estaba utilizando XAMPP con la configuración por defecto sin contraseña ni nada, por lo que cualquiera podía acceder a PhpMyAdmin si así le parecía oportuno.


Ya estaba mal el cifrar la contraseña con MD5, pero esto ya se llevaba la palma. Esto es un ejemplo típico del por qué que una aplicación web funcione, no significa que esté bien hecha.


Por supuesto solamente tenías que jugar un poco con las sentencias sql y veías todos los usuarios. Yo estuve metiendo unos cuantos usuarios de prueba para que la tabla tuviese varios registros. Incluso deshabilité la comprobación de si existe el usuario por un momento.


Y ya sólo tendíamos que coger el Hash del usuario test@demo.com por ejemplo, y si lo pasamos por una herramienta online, vemos que nos devuelve que el valor es test, por lo que ya sabemos la password de este usuario y sin mucho esfuerzo.

PoC 2: Mejorando la seguridad de la web con un poco de sal

La solución a esto es muy sencilla, ya que basta con cambiar el algoritmo de cifrado de la contraseña y utilizar un BLOWFISH como puede ser la función password_hash().


Y es que esto funciona de la siguiente manera. Al principio nos mete un $2y$ que corresponde con el algoritmo. Posteriormente le añadiremos unas opciones y acto seguido, le añadimos "sal" para engordar el hash y hacer que sea más complicado de obtener. Finalmente, se añade el hash, el cual ya estará perfectamente cifrado.


Esto en el código se traduce en una línea sencilla y que no tardas ni un minuto en escribir. Solamente se debe tener en cuenta que va a recibir los datos a cifrar-la password en este caso- y el método que se va a usar. Lo podemos poner por defecto y no preocuparnos de tener que añadir nosotros el nuestro.


Para mostrar cómo la seguridad del sitio ha mejorado, crearé un nuevo usuario. Recuerdo que el XAMPP sigue sin contraseña, por lo que el atacante aún podría acceder y borrar las bases de datos, por lo que hemos mejorado la seguridad del almacenamiento de las credenciales, pero no la seguridad genérica de la web como es que el administrador tenga una contraseña.




En nuestra tabla seguimos viendo que tenemos acceso y que podemos leer perfectamente los usuarios, pero las contraseñas están cifradas. Si nos vamos al último usuario que hemos creado, testSalt@demo.com y copiamos el hash de su contraseña, para empezar ya vemos que es un hash de na longitud mayor y que sigue el formato mencionado anteriormente, pero ¿podremos sacar el valor del hash?


Como vemos, no nos muestra el valor del hash, por lo que ya hemos mejorado un poco más la seguridad ya que ni teniendo acceso a la Base de datos, consigue leer datos sensibles. Cierto es que podría borrar todas las bases de datos, pero para eso la solución es poner una contraseña y a ser posible un 2FA.

Tenemos que entender que podemos tener fallos de seguridad, pero que hay que intentar no tenerlos y que si los tenemos y cualquiera consigue acceso, al menos que tenga el menor privilegio posible y pueda leer el menor número de datos sensibles, así pues, con una solución de menos de 1 minuto, nos hemos quitado de muchos problemas.

¿Hackeamos el Mundo?





No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...

Entrada destacada

El server me sabe a poco.

Soy un fanático del Rock y de Debian . (Creo que voy a inventar Rockbian, que suena bien y todo xD) Llevaba tiempo queriendo unir estos 2 c...