Descargo de responsabilidad: soy un programador informático, no soy un analista de seguridad ni nada relacionado con la seguridad. No tengo ninguna experiencia en el mundo de la criptografía, así que tengan paciencia, por favor.
Situación: Me dieron la tarea de integrar el sitio de un cliente con un sitio de alojamiento de datos. Mientras trabajaba en eso, me topé con una consulta que volcaba los datos de todos los usuarios. Para realizar esta consulta, el usuario tiene que 'autenticarse' para obtener una sesión y usar ese código de sesión para realizar esta consulta, que luego verifica que el usuario tenga privilegios de administrador antes de completar la consulta y responder.
Pero aún así ... eso me parece algo horrible. Especialmente porque estos son algunos de los datos que se devuelven si la consulta se ejecuta correctamente:
"username": "[email protected]",
"firstname": "Test",
"lastname": "Name",
"userpassword": "$1$te000000$qMpAriadAHuRyDkK58YKS0"
Se devolvieron más datos que son horribles de exponer, pero esa no es mi principal preocupación.
Claramente, ninguna persona ha sido nombrada "Nombre de prueba", y "testemail.blerg" no es un dominio registrado, y mucho menos "blerg" es un posible dominio de nivel superior. Incluso si lo fuera, esa cuenta se ha eliminado del sitio de alojamiento de datos y no se puede iniciar sesión. La contraseña que se usó es débil, de prueba de caso, y no está en uso por nadie.
¿Es posible para mí la fuerza bruta / la tabla del arco iris (aunque no tengo experiencia, sé algunas palabras de destello: P) o algo para obtener la contraseña de eso? Lo poco (creo) que sé es que la primera parte del userpassword
es la sal MD5, pero no sé nada más.
Si alguien puede explicar lo fácil que es, puedo demostrarle a mi jefe que este sitio es completamente horrible y convencer a nuestro cliente para que migre desde este sitio de alojamiento de datos.
Hay más que sé sobre la salazón (es decir, cómo se obtiene la sal, qué lenguaje / función está usando, etc.), pero me gustaría ver con qué facilidad alguien que no tiene acceso a esa información puede resolverlo Otra cosa con la que puedo ir a mi jefe, con suerte.
EDITAR: Parece que hay una pequeña confusión relacionada con mi intencionalidad de ser vago en la descripción, parcialmente con el propósito de evitar cualquier indicación de qué CRM es, por razones legales / etc. También me doy cuenta de que llamarlo 'alojamiento de datos' era potencialmente engañoso, así que es malo. Esperemos que esto aclare:
El trabajo que está haciendo nuestro equipo es crear un sitio web básico para que una empresa muestre sus productos. La única interacción que tengo con el CRM es:
- Cuando una persona completa el formulario de Contacto, enviamos
POST
al objeto CRM unContacts
con la información del usuario. - Haga un
GET
en una lista deDealers
que venda sus productos para mostrar.
Comencé con el # 2, la llamada a la API GET
, donde descubrí que puedo consultar la tabla Users
. No he creado la API, solo he estado haciendo solicitudes de ella.
La llamada GET
requiere un parámetro query=
donde el valor es una declaración SELECT
en el lenguaje de consulta del sistema, que luego se traduce a SQL (probablemente previene ataques SQLI, pero no sé cómo se interpreta / se traduce a SQL, así que no estoy tocando eso con un polo de 10 pies). Al cambiar de SELECT * FROM Dealers;
a SELECT * FROM Users;
en la consulta, pude ver los datos de todos los usuarios.
La forma en que el CRM maneja a los usuarios es con un portal en su sitio. Se crea un usuario en el portal, donde hay una casilla de verificación "Es administrador". Esto se puede editar en cualquier momento a través del portal. Este es el proceso para realizar solicitudes de API:
-
Un usuario realiza una solicitud al CRM, que contiene el nombre de usuario, para un token.
-
El token se concatena con la clave de acceso "secreta" para ese usuario, la cadena resultante es un hash MD5 y luego se envía de vuelta para solicitar un token de sesión.
-
Este token de sesión se incluye con cada solicitud, como parámetro de cadena de consulta, para "verificar" que la solicitud está "autorizada".
Uno de los problemas es que si un usuario 'administrador' realiza una solicitud de la tabla Users
, la respuesta es una lista de todos los usuarios con la información que enumeré anteriormente así como el token de acceso "secreto" del usuario (y otra información). Así que es incluso peor que solo exponer una contraseña, es prácticamente otorgar acceso a cualquier persona mediante la suplantación de identidad a cualquiera.