Jamás me había parado a mirar las tripas de la web, pero desde que curro en CODERE me he vuelto más diablo. Es inverosímil la cantidad de vulnerabilidades que puedes encontrar si sabes dónde mirar. Incluso cosas “muertas” como una XSS (inyección de JS; la clásica) siguen vivitas y coleando.
Hace un mes empecé un máster en cierta universidad online famosilla, especializada en finanzas y economía. Universidad de nueva creación. Esperaba software moderno y fino. Y lo era… pura fachada. Le pegas con un palo y salen vulnerabilidades como cucarachas. Sin ser pentester, no tuve que esforzarme para romper su seguridad dos veces. Aquí va el relato.
<!> XSS Injection
La página tiene un apartado de perfil. Como en todo buen “User Settings”, hay formulario. Los formularios suelen venir protegidos por los frameworks de serie. Spoiler: no aquí.
Había un campo “Biografía”: texto libre, sin límite de caracteres, sin dar formato. Ni siquiera podía separar párrafos. Probé con \n\n: nada. Pensé: igual interpreta HTML. Probé con <br/> y funcionó. Fui feliz un rato.
Quise más. Probé a envolver párrafos con <p></p> y meter style="color: red". También funcionó. Y no solo eso: vi que aceptaba <style></style>.
Llegados a este punto la pregunta era obligada: si se come <style>, ¿también <script>?
Ya sabéis la respuesta: Sí, pude ejecutar JS en el cliente. Y si otro usuario visitaba mi perfil, también ejecutaba mi JS en su navegador. Delicia.
La página está llena de logs y comentarios, pero hagamos como que no los hemos visto ...
Inspeccionando el DOM, el cuadro de texto inyectaba sin pudor todo lo que venía. Y en base de datos, guardado tal cual, ni sanitizado ni leches. Ahora me pregunto si podría atacar el server, porque eso ya sería la h*stia.
Resumen del bug
- Campo de texto rico sin sanitización ni whitelist de etiquetas.
- Permite HTML crudo, atributos
style y script. - Ejecución en el navegador de terceros al visitar perfiles → XSS Almacenada
Impacto potencial
- Robo de sesiones y datos de compañeros.
- Keylogging, CSRF, falsificación de vistas, phishing interno.
- Pivot a otros subdominios si comparten cookies o sesión. Divertido, ¿eh?
<!> Batch Bunny
En el curso, a veces hay que repasar clases. Sería genial descargar vídeos o al menos escucharlos como podcast. Lástima que no ofrecen esa opción… ¿verdad?
Clic derecho bloqueado, pero la inspección del DOM es libre. Los vídeos están en un iframe dentro de otro iframe, servidos por Bunny ( supongo que bunny.net).
Intenté descargar: curl, script en Python… 403 Forbidden a saco. No eran credenciales: faltaban cabeceras. Añadí las cabeceras adecuadas y pude bajar el HTML del iframe. Desde ahí, encontrar los vídeos era trivial.
Le metí extras al script:
- Descarga múltiple leyendo un fichero con iframes.
- Extractor de audio (alias Podcastify) para llevarme las clases en el gym.
- Pipeline “pásame iframes → me bajo el curso”.
Literalmente puedo bajarme todo.
Nota técnica breve
Los CDN/players suelen validar origin, referer y user-agent; si los replicas y resuelves las playlists M3U8, la descarga cae sola.
<!> Xplo!t
Tranquilos. No exploté todo… solo lo de los vídeos para uso personal. Antes avisé al soporte para contarles las vulnerabilidades. La XSS me parecía más crítica: lo de bajar vídeos es feo para negocio, pero una XSS almacenada es robar datos, mover dinero ajeno y cosas peores.
El magnífico equipo de la uni no respondió. Insistí. A la segunda: “Lo transmitiremos, gracias por tu sinceridad”. Ha pasado un mes y todo sigue igual. Tampoco pidieron pasos para reproducir ni cómo arreglarlo. Flojito.
Fixes propuestos
Sanitización/escape estricto: permitir solo texto o una whitelist cerrada (Markdown con renderer seguro, por ejemplo).
CSP decente: sin unsafe-inline, sin unsafe-eval, con script-src y style-src bien cerrados.
HTTP-only/SameSite para cookies, y aislamiento de dominios si comparten sesión.
Revisar el player/CDN: exigir tokens temporales y firmados, hotlink protection real y verificación de origen consistente.
Bug bounty o al menos canal de seguridad que responda algo más que “lo pasamos”.
Epílogo
Seguiré un poco más, a ver hasta dónde llego. No por maldad; por higiene digital. Si tu fachada es “premium”, que tus cimientos no sean de cartón.