Reports
CRÍTICA[SQL INJECTION]#2958619

Inyección SQL en el identificador de cliente de la ruta URL de un servicio de seguro de dispositivos de MTN

Una comilla en el customerId que viaja dentro de la ruta de la URL bastaba para romper la consulta SQL de un servicio de seguro de dispositivos de MTN, con riesgo de volcar la base de datos de usuarios.

Resumen
Resumen en castellano de un reporte público, no una traducción literal. El código y los comandos se mantienen como en el original.

Resumen

El fallo estaba en una aplicación vinculada al seguro de dispositivos de MTN en Sudáfrica (la página de entrada era https://www.mtn.co.za/insurance/device-cover/). Para justificar que el objetivo entraba en el alcance del programa, el investigador enlazó esa página de MTN y mostró que la aplicación, alojada bajo el dominio admyntec.co.za, se puede localizar con esta búsqueda:

site:admyntec.co.za intitle:"MTN"

La vulnerabilidad es una inyección SQL (CWE-89) con una particularidad: el dato inyectable no llegaba como parámetro de consulta (?customerId=...) ni en el cuerpo de una petición, sino como un segmento de la propia ruta de la URL, el customerId. Ese valor acababa dentro de una sentencia SQL sin tratarse como dato.

En la divulgación están censuradas la URL exacta, la consulta usada y las capturas de los errores, así que no se puede reproducir el endpoint concreto. El reporte se envió el 26 de enero de 2025, el programa lo dio por resuelto y se divulgó el 6 de marzo de 2025, con severidad crítica.

Pasos de reproducción

  1. Abrir la ruta de la aplicación que incluye el customerId como segmento de la URL (dirección censurada en el reporte).
  2. Añadir una comilla simple (') al valor del customerId. El servidor devuelve un error que indica que la comilla rompe la sentencia SQL.
  3. Cerrar la sentencia original con '), añadir a continuación una orden SQL propia y convertir el resto de la consulta en comentario. El investigador lo comprobó con una consulta básica (censurada en el reporte).
  4. Como alternativa, automatizar la explotación con sqlmap apuntando a la URL vulnerable. El comando original está censurado; su forma era esta:
sqlmap -u "<URL censurada con el customerId en la ruta>"

Impacto

Según el investigador, un atacante podía volcar y descargar la base de datos, con acceso a la información de los usuarios.

Remediación

El reporte no detalla el arreglo; solo consta que el programa lo marcó como resuelto.

Qué aprender de este caso

  • Las rutas del tipo /cliente/<customerId>/... son entrada de usuario igual que un parámetro ?id=. Al auditar, prueba la comilla también en cada segmento variable de la ruta: muchos escáneres y muchas revisiones solo miran la query string y el cuerpo.
  • El cierre con ') indica que el valor iba entre comillas y dentro de un paréntesis (por ejemplo, en un IN ('...') o en una llamada a función). Fíjate en qué caracteres de cierre necesitas: te dicen cómo está construida la consulta.
  • En el código, el valor que extrae el enrutador (req.params o las variables de ruta del framework) debe pasar a la consulta como parámetro enlazado, nunca concatenado. Y si es un identificador numérico, valídalo como número antes de usarlo.
  • Que la respuesta mostrase el error fue lo que confirmó el fallo con una sola comilla. Ocultar los errores detallados en producción no corrige la inyección, pero sí quita la pista más rápida.