Una sola letra en mayúscula en la ruta de una URL a veces te cuela por una capa de autorización que bloquea la versión en minúsculas. Lo descubrí por accidente hace años y desde entonces es una comprobación de un segundo cada vez que me devuelven 401 o 403. La tasa de acierto es baja. Cuando entra, es un bypass limpio a algo que debería haber estado cerrado.
El planteamiento es cualquier endpoint que te devuelva 401 o 403. Pongamos /api/getUsers. El endpoint existe, la capa de autorización te bloquea.
Prueba a cambiar algunas letras a mayúsculas. En lugar de /api/getUsers, prueba /aPi/getUsers o /Api/getUsers. Varía un poco.
# Bloqueado por la capa de autorización
$ curl -i https://target.example.com/api/getUsers
HTTP/1.1 403 Forbidden
# Mismo endpoint, una letra en mayúscula, la autorización no coincide
$ curl -i https://target.example.com/aPi/getUsers
HTTP/1.1 200 OK
Content-Type: application/json
[{"id":1,"email":"admin@..."}, ...]A veces funciona. La comprobación de autorización no se activa y, de repente, estás dentro.
¿Por qué ocurre esto? En mi experiencia, generalmente se reduce a dos cosas:
Primero, los desarrolladores escriben manualmente filtros de autorización sensibles a mayúsculas. Codifican rutas específicas en su capa de seguridad sin tener en cuenta las variaciones de capitalización. El filtro busca /api/getUsers exactamente, y cuando envías /aPi/getUsers, no coincide. La petición se cuela.
Segundo, los proxies inversos pueden reenviar rutas mal configuradas al backend sin pasar por las mismas comprobaciones de seguridad. El proxy normaliza o pasa la ruta de forma distinta a lo que espera la capa de autorización, creando un hueco en la cobertura.
Es un caso extremo. En nueve años buscando bugs en programas de bug bounty lo he visto entrar menos de diez veces. Esas diez veces son suficientes para que la comprobación valga la pena.
Tarda segundos. Cuando estás en un 401 o 403 y vas a pasar al siguiente endpoint, prueba primero unas cuantas variaciones de mayúsculas. Cuando funciona, el hueco está entre dos capas que no se ponen de acuerdo en si /api/getUsers y /aPi/getUsers son la misma ruta.
La autorización debería ser insensible a mayúsculas. Las rutas deberían normalizarse antes de llegar a cualquier capa de seguridad. En la práctica las configuraciones cambian, el código sale con prisas y una de las dos capas acaba haciendo comparación exacta sobre un valor que la otra ya ha mutado.
