Saltar al contenido
HACKME

Nivel 2 · 2A Permisos y roles · Lección 2 de 2

Todo lo del navegador se puede cambiar

2 min de lectura · Gratis · Desde cero

Todo lo que viene del navegador lo puede escribir la persona que lo usa: botones escondidos, datos en la dirección, campos del formulario, el almacenamiento local. Esconder un botón de "Borrar usuarios" no protege nada, porque el atacante manda el pedido directamente, sin pasar por el botón.

El fallo más común: el curioso de los números

Si la dirección dice /pedido/1042 y el servidor no comprueba de quién es ese pedido, alguien cambia el número por 1043 y ve el de otra persona. Se llama IDOR (referencia directa insegura a un objeto) y es uno de los fallos más frecuentes.

Otro fallo distinto es decidir permisos con un dato que manda el navegador, como ?es_admin=false: cambiarlo a true es lo primero que prueba un atacante. Eso no es un IDOR: se llama escalada de privilegios, porque la persona se da a sí misma más permisos de los que tiene.

Lo que hace un buen guardia

Cada vez que llega un pedido, el servidor sigue siempre el mismo orden: identifica quién sos con tu sesión, revisa qué rol y permisos tenés, comprueba que el dato pedido sea tuyo o que tengas permiso sobre él, y recién ahí hace la acción o devuelve el dato. Saltearse un paso es abrir un agujero.

Para ir más a fondo

El IDOR en código

// MAL: devuelve el pedido que pida la dirección, sea de quien sea
app.get("/pedido/:id", async (pedido) => {
  return await buscarPedido(pedido.params.id);
});

// BIEN: solo lo devuelve si es de la persona que lo pide
app.get("/pedido/:id", async (pedido) => {
  const p = await buscarPedido(pedido.params.id);
  if (!p || p.usuarioId !== pedido.usuario.id) return noEncontrado();
  return p;
});
Qué hace este código:
  • En la versión mala, cambiar el número de la dirección muestra pedidos de otras personas.
  • En la buena, el servidor compara el dueño del pedido con la persona que está logueada.
  • Devolvé "no encontrado" tanto si no existe como si es ajeno: así no le confirmás a nadie qué números existen.

Preguntas de repaso

Una web esconde el botón "Borrar usuarios" a quienes no son administradores, pero el servidor no revisa nada. ¿Es seguro?

Respuesta: No: cualquiera puede mandar el pedido sin usar el botón. Ocultar algo en la pantalla no es proteger. La comprobación tiene que hacerla el servidor en cada pedido.

En la dirección /factura/1042 cambiás el número por 1043 y ves la factura de otra persona. ¿Qué fallo es?

Respuesta: Un IDOR: el servidor no comprueba de quién es el dato. El servidor debe comprobar que el dato pedido sea de quien lo pide, no confiar en el número de la dirección.

¿Dónde deben controlarse siempre los permisos?

Respuesta: En el servidor. Lo que corre en el navegador lo puede alterar quien lo usa. El servidor es el único lugar de confianza.