Voy a ampliar el artículo que hice de auditiríasciudadanas
Firefox ofrece herramientas avanzadas en su consola de desarrollo para inspeccionar y modificar llamadas a APIs. Lo curioso del asunto es que el token básico, ese que te dan como usuario anónimo, no tiene demasiadas restricciones a la hora de realizar ciertas llamadas. Esto deja claro que el sistema de permisos de la API es, cuanto menos, cuestionable.
Por ejemplo, esta es la llamada que permite acceder a la documentación Swagger:
curl 'xfztookxklscvnctqcog.supabase.co/rest/v1/' --compressed -H 'Accept: /' -H 'Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Referer: auditoriasciudadanas.netlify.app/' -H 'accept-profile: public' -H 'apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InhmenRvb2t4a2xzY3ZuY3RxY29nIiwicm9sZSI6ImFub24iLCJpYXQiOjE3Mzg4MzAwOTIsImV4cCI6MjA1NDQwNjA5Mn0.lLgof7_zr3l_y_6MOSD-hpslEg40zgfpwvs4bGHGdhQ' -H 'authorization: Bearer [TOKEN DE SESIÓN]' -H 'x-client-info: supabase-js-web/2.48.1' -H 'Origin: auditoriasciudadanas.netlify.app' -H 'Connection: keep-alive' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: cross-site' -H 'Priority: u=4' -H 'TE: trailers'
No he tenido que profundizar demasiado para encontrar cosas dignas de un stand-up comedy. La documentación está hecha con Swagger y se puede configurar mediante un archivo YML para limitar el acceso a ciertos endpoints (EP) según el token de usuario. En este caso, parece que alguien decidió ignorar esa funcionalidad.
Hallazgos curiosos:
Estos endpoints están en la parte pública y no deberían:
- /rpc/insert_sample_proposals: Carga propuestas de ejemplo.
- /rpc/set_admin_password: Cambia la contraseña del administrador (¿es en serio?).
- /rpc/check_admin_credentials: Verifica credenciales de administrador.
- /rpc/create_admin_session: Parece diseñado para permitir a usuarios normales escalar a administrador.
- /admin_users: Lista usuarios administradores con contraseñas cifradas.
- /rpc/generate_random_nickname y /rpc/generate_random_nickname_extra: Para generar apodos aleatorios. Sí, ternura infinita.
Swagger incluso te da instrucciones detalladas para hacer llamadas POST, describiendo los campos necesarios y mostrando ejemplos de respuesta. Por ejemplo, al pedir el endpoint admin_users, se obtiene algo como esto:
[{"id":"9c8feed4-9fe3-4685-8260-5706a8d2a86b","email":"[email protected]","password_hash":"$2a$06$yeB3HsA65hAUp0aeYwpdNeJPID1OLCBE7BUVoiaE0tzlraWOm.lhu","created_at":"2025-02-12T11:17:31.90657+00:00","last_login":"2025-02-12T11:22:45.55577+00:00"}]
Al menos no están almacenando contraseñas en texto plano... qué consuelo más barato.
Y para rematar, en el endpoint proposal_deletions se pueden consultar propuestas borradas. Por ejemplo:
{"action_type":"delete","deleted_proposal":"Ayudas por violencia de género","deleted_by":"Anónimo","deleted_at":"2025-02-06T20:51:44.106982+00:00}
Ejemplos de nicks aleatorios:
"Funcionario401Zaragoza".
"Contribuyente190Sevilla"
"Funcionario572Vigo"
"Positivo######Net"
Conclusión:
Esto parece una clase práctica de “Cómo no diseñar una API”. Entre los permisos descontrolados y la documentación pública indiscriminada, es un terreno fértil para los más curiosos... o los malintencionados.