Creo que ya sé por qué me contrataron.
Puedo llamar al cliente «cliente de colonia industrial» o «cliente gruyere», porque tiene muchísimos agujeros en su historia y en eso que llaman infraestructura. Grave. Toda una sección de infraestructura está en Windows 7.
- Me leí todos los manuales unos 40, más o menos decentes. Solo que con leyes de Puerto Rico y nivel parvulitos uno.
- Un servidor reporta 8 TB de disco. Un análisis me muestra que son 1.5 TB que jamás se han respaldado, atributo «A», y 711 mil archivos. Puede tronar.
- Una «licenciada en sistemas» que piensa que Bootstrap es para cifrar información. Creo que solo estuvo en un bootcamp. No tiene numero de cédula en el registro de cédulas profesionales. Su github es de un bootcamp, de hace cinco dias, con un sitio web básico y cosas así.
- Me pasaron el código fuente de PHP: 3.63 GB por Teams. Un repositorio corrupto y antiguo, solo 6.2 MB de información PHP, que llama a un Flask mal configurado, con Axios, y el código real son 6.2 MB.
- No nos han dado el contrato a los que entramos el mismpo dia, ni el contrato o convenio de confidencialidad. Supe que a uno de los tres(redes) ya le empezaron a regatear el sueldo. La tercera es la de soport tecnico, licenciada con dos licenciaturas inexistentes y que piensa cifrar por Bootstrap.
- La programadora de Python no estudió sistemas. Lleva poco más de un año.
- El jefe de sistemas lleva menos de un año en el puesto.
Pero además.
Python tiene un token que no expira ni se invalida, y eso convierte todo lo anterior en una cadena completa de explotación:
El hallazgo, en concreto:
-
Sobrevive al logout : el logout es cosmético. Borra la sesión del lado del cliente (o de PHP) pero el token en Python sigue siendo válido. Cualquiera que lo haya capturado / captura trivialmente en la red) puede seguir usándolo después de que el usuario «cerró sesión».
-
No está atado a la IP : un token robado sirve desde cualquier lugar. Sumado a lo anterior, un atacante con el token tiene acceso indefinido desde cualquier red.
-
No expira por tiempo : cuatro horas después, o cuatro días, sigue vivo. No hay ventana de exposición limitada; la exposición es permanente hasta que se reinicie el servicio o se rote el secreto.
-
Y encima el PHP confía en variables de sesión y campos hidden : o sea, el token en Python probablemente se emite a partir de datos que el cliente controla. La cadena completa es: cliente controla identidad → PHP no revalida → Python emite token sin TTL ni binding → token eterno y portable.
-
Contraseñas reversibles, no hash : el sistema puede recuperar la contraseña en claro. Eso significa que la contraseña (o su cifrado) está en la BD, y quien tenga acceso a la BD y a la clave puede leerlas todas. No hay forma de que esto sea aceptable para credenciales de usuario.
Siendo sinceros, ya sé para qué me contrataron. Vamos a ver. Este proyecto puede que no sea a largo plazo por el desastre que veo, pero de que se puede arreglar, se puede.
Es mi segundo dia y llevo unas 80 hojas de documentación de hallazgos.
Literalmente ese sistema casi casi se documenta solo.