Descubrimiento de XSS en Chess.com
- Mientras disfrutaba el ajedrez como pasatiempo y jugaba con la tecnología, descubrí una vulnerabilidad XSS en Chess.com.
- Chess.com es el sitio de ajedrez más grande de internet, con más de 100 millones de miembros.
Resumen
- A inicios de 2023 empecé a pasar mucho tiempo en Chess.com.
- Hice que un amigo se registrara en el sitio y, usando la función de amigos, nos agregamos de inmediato.
- Me dio curiosidad si sería posible agregar amigos automáticamente de una forma similar al gusano de MySpace.
- Creé una cuenta nueva y revisé la pestaña de red en las herramientas de desarrollador para encontrar la URL de agregado automático de amigos.
Medio juego
- Intenté hacer XSS usando el editor de texto enriquecido TinyMCE.
- Usé un proxy de Burp para insertar código HTML directamente en la descripción de "About".
- Revisé la configuración de TinyMCE y generé una carga útil de XSS usando la propiedad de estilo
background-image. - Probé varios símbolos hasta encontrar una forma de ejecutar el XSS.
- Finalmente desarrollé una manera de extraer cookies y objetos de JavaScript.
Final
- Trabajé para ejecutar el XSS por completo.
- Encontré un método nuevo que usaba el atributo
srcsetpara permitir una sintaxis de JS más amplia. - Ejecuté directamente la carga útil de XSS usando codificación Base64.
- El impacto era grande porque el editor TinyMCE se usaba en todo el sitio.
Análisis
- La causa raíz de la vulnerabilidad es la función de re-subida de imágenes.
- Es posible evadir la verificación de alojamiento de imágenes incluyendo el nombre de dominio de Chess.com.
- El editor de texto enriquecido permite varios elementos HTML, por lo que es adecuado para lograr XSS.
- TinyMCE estaba actualizado, pero faltaba la sanitización del HTML final.
- Chess.com debe aplicar sanitización al HTML final que se muestra a los usuarios.
Opinión de GN⁺:
- Esta publicación de blog explica de forma interesante el proceso de descubrir y reportar una vulnerabilidad de seguridad que puede surgir en una plataforma en línea a gran escala como Chess.com.
- Las vulnerabilidades XSS pueden representar una amenaza grave para la seguridad de un sitio web, y encontrar y corregir estas fallas es muy importante para proteger la privacidad de los usuarios.
- Este artículo subraya para desarrolladores de software y profesionales de seguridad la importancia de reconocer las vulnerabilidades en componentes de aplicaciones web como los editores de texto enriquecido y de prevenirlas.
1 comentarios
Comentarios de Hacker News
Soy el OP. Muchas gracias por todos los comentarios positivos. Para dar un poco de contexto, soy un estudiante de 17 años en el Reino Unido preparándome para los A-Levels, y todavía estoy decidiendo a qué universidad ir y si tomar la opción de degree apprenticeship
Pueden ver mi perfil de GitHub aquí -> https://github.com/Jayy001
Soy uno de los miembros principales de HashPals, hice Search-That-Hash y también soy mantenedor principal de un repositorio de software libre y de código abierto para la tablet ReMarkable
Si quieres platicarlo más, puedes contactarme; mi correo está en la descripción del perfil
Y si te vas por IT, también conviene aprender negociación de contratos y finanzas
En la época en que toda mi experiencia en internet consistía en perder una y otra vez como “bibliotecario voluntario” en Chess.com, solía inyectar en partidas en vivo de Chess.com caracteres escapados de forma rara, etiquetas de cierre, cadenas de control comunes e incluso objetos OLE
El fundador, Eric, me pidió amablemente una auditoría más formal, pero no quise aceptar porque no quería revelar que era un script kiddie de 11 años. En cambio, le expliqué las expresiones regulares necesarias para la censura del chat, y también abordamos juntos el problema más grande de cómo detectar trampas en un entorno asíncrono
Después de pensarlo, dije que la única forma posible era comparar todas las jugadas importantes y de alto valor de una partida con las mejores jugadas conocidas por un motor, y usar inferencia estadística para distinguir entre humanos muy fuertes y tramposos
Claro, en ese momento era una idea ridículamente imposible de implementar, y así quedó la conclusión. Aun así, es un buen recuerdo de internet que un niño recién salido de primaria pudiera discutir temas tan sutiles con un webmaster de verdad
La parte de “esta función me recordó al gusano de MySpace, como de 2005, ¡yo ni siquiera había nacido entonces!” me hizo sentir que envejezco cada día
La terquedad de querer permitir que los usuarios metieran HTML en el sitio era un problemón. Hoy parsearías bien la entrada HTML para eliminar atributos y etiquetas prohibidas, pero en ese entonces lo resolvían con pura locura de expresiones regulares
No sé si esté relacionado, pero yo vi directamente, e incluso grabé, casos en los que otra gente hacía mis jugadas en partidas de Chess.com. También me pasó que una partida en curso me aparecía a mí y podía hacer una jugada en una situación donde en teoría no debería haber podido
Si buscas en Google, hay bastantes hilos al respecto. No sé si Chess.com lo haya arreglado en los últimos meses, pero cuando intenté reportarlo no quisieron escuchar
Todo esto pasó sin haber iniciado sesión en el sitio. Nunca me ha pasado estando logueado, pero no juego ajedrez muy seguido porque no le hace bien a mi presión arterial
Solo por el título pensé que sería algo mucho más básico para principiantes, pero en realidad construyó un exploit que atravesaba de forma ingeniosa varias capas de validación de entrada con un bypass. Incluso configuró un subdominio para que pareciera el dominio base
No esperaba que eso funcionara, y por sí solo ya me pareció interesante. Si piensas en lo complicado que es parsear dominios con expresiones regulares, se ve como algo fácil de pasar por alto. Aunque también pudo haber sido algo tan simple como revisar
'...'dentro de una variableEl autor sabe muy bien lo que hace. Impresiona pensar cuánto tiempo le dedicó a profundizar hasta alcanzar ese nivel técnico. Parece que va a tener una carrera muy interesante
Muy buen post, OP. Ojalá sigas avanzando bien en tu camino en el hacking. Por si aún no lo conoces, cuando en payloads como
alert(1)los paréntesis son filtrados o codificados, puedes intentar usar backticks conalert\1``Si quieres subir un nivel en inyección de JavaScript, el XSS cheatsheet de Brute Logic y Javascript for Hackers de Gareth Heyes son muy buenos recursos. Algunas personas minimizan la cross-site scripting, pero sigue siendo muy poderosa y está por todos lados. Especialmente, como señaló plugin-baby, si las cookies de sesión no tienen HttpOnly
Está padrísimo. Me encanta leer análisis de bug bounty, especialmente de XSS. Siempre parece fácil de encontrar, pero eso es puro sesgo de confirmación, y en realidad yo no veo todo el tiempo que se fue en pruebas sin resultado y callejones sin salida
La parte de “esta función me recordó al gusano de MySpace, como de 2005, ¡yo ni siquiera había nacido entonces!” me hizo sentir viejo al instante
Lo que me gustaría preguntarle al OP sobre esto es cómo se enteró del tema. ¿Fue por Darknet Diaries o por algún otro camino?
Me dio risa la parte donde llamó al editor de texto enriquecido el “santo grial”. Chess.com es un sitio grande, pero cada vez que veo ese tipo de editores o funciones demasiado recargadas en lugares como foros viejos, no puedo evitar pensar si el sitio no estará lleno de agujeros. En cualquier caso, gran post
La parte de “durante el reporte y revisión del bug bounty, cuando intenté reproducirlo otra vez los desarrolladores intentaron implementar un bloqueo y apareció el siguiente mensaje de error…” parece bastante alejada del espíritu de un programa de bug bounty