El término Inyección de Plantillas en el Lado del Cliente (o CSTI por sus siglas en inglés, Client-Side Template Injection) hace referencia a una vulnerabilidad de seguridad en la que un atacante puede inyectar código malicioso en una plantilla de cliente, que se ejecuta en el navegador del usuario en lugar del servidor.
A diferencia del Server-Side Template Injection (SSTI), en el que la plantilla de servidor se ejecuta en el servidor y es responsable de generar el contenido dinámico, en el CSTI, la plantilla de cliente se ejecuta en el navegador del usuario y se utiliza para generar contenido dinámico en el lado del cliente.
Los atacantes pueden aprovechar una vulnerabilidad de CSTI para inyectar código malicioso en una plantilla de cliente, lo que les permite ejecutar comandos en el navegador del usuario y obtener acceso no autorizado a la aplicación web y a los datos sensibles.
Una derivación común en un ataque de Client-Side Template Injection (CSTI) es aprovecharlo para realizar un ataque de Cross-Site Scripting (XSS).
Una vez que un atacante ha inyectado código malicioso en la plantilla de cliente, puede manipular los datos que se muestran al usuario, lo que le permite ejecutar código JavaScript en el navegador del usuario. A través de este código malicioso, el atacante puede intentar robar la cookie de sesión del usuario, lo que le permitiría obtener acceso no autorizado a la cuenta del usuario y realizar acciones maliciosas en su nombre.
AngularJS analiza y renderiza cada expresión entre corchetes. Entonces, si pasamos una expresión aritmética, como {{7*7}}, deberíamos esperar 49 como resultado;
Ahora que sabemos que el aplicativo es vulnerable a una inyección de plantilla del lado del cliente, queremos hacer más que solo imprimir números agradables.
Al observar posibles payloads, encontramos una que funciona para Angular < = 1.5.0 en PayloadAllTheThings
Este payload define una expresión asincrónica la cual es interpretada por AngularJS como explicamos anteriormente y manipula un nodo de AST de JavaScript para crear una expresión con el fin de lanzar una alerta en el navegador del usuario
Como podemos ver, se ejecuta el Pop Up de "alert(1)" ejecutandose JavaScript;
Ahora podemos ejecutar código JavaScript en nuestro DOM. Este payload lo podemos modificar utilizando Python, es este le vamos a pedir cuando valdría en decimal la palabra CuriosidadesDeHackers;
Con la misma plantilla anterior usada modificamos el "Alert" y utilizaremos el método "String.fromCharCode()", Se utiliza en JavaScript para crear una cadena de caracteres a partir de los valores Unicode especificados. Toma una secuencia de números Unicode y devuelve una cadena que contiene los caracteres correspondientes a esos números Unicode.
Leer más»
A diferencia del Server-Side Template Injection (SSTI), en el que la plantilla de servidor se ejecuta en el servidor y es responsable de generar el contenido dinámico, en el CSTI, la plantilla de cliente se ejecuta en el navegador del usuario y se utiliza para generar contenido dinámico en el lado del cliente.
Los atacantes pueden aprovechar una vulnerabilidad de CSTI para inyectar código malicioso en una plantilla de cliente, lo que les permite ejecutar comandos en el navegador del usuario y obtener acceso no autorizado a la aplicación web y a los datos sensibles.
Una derivación común en un ataque de Client-Side Template Injection (CSTI) es aprovecharlo para realizar un ataque de Cross-Site Scripting (XSS).
Una vez que un atacante ha inyectado código malicioso en la plantilla de cliente, puede manipular los datos que se muestran al usuario, lo que le permite ejecutar código JavaScript en el navegador del usuario. A través de este código malicioso, el atacante puede intentar robar la cookie de sesión del usuario, lo que le permitiría obtener acceso no autorizado a la cuenta del usuario y realizar acciones maliciosas en su nombre.
PoC
Nos encontramos ante un aplicativo web el cual utiliza AngularJS 1.5
AngularJS analiza y renderiza cada expresión entre corchetes. Entonces, si pasamos una expresión aritmética, como {{7*7}}, deberíamos esperar 49 como resultado;
Ahora que sabemos que el aplicativo es vulnerable a una inyección de plantilla del lado del cliente, queremos hacer más que solo imprimir números agradables.
Al observar posibles payloads, encontramos una que funciona para Angular < = 1.5.0 en PayloadAllTheThings
Este payload define una expresión asincrónica la cual es interpretada por AngularJS como explicamos anteriormente y manipula un nodo de AST de JavaScript para crear una expresión con el fin de lanzar una alerta en el navegador del usuario
Como podemos ver, se ejecuta el Pop Up de "alert(1)" ejecutandose JavaScript;
Ahora podemos ejecutar código JavaScript en nuestro DOM. Este payload lo podemos modificar utilizando Python, es este le vamos a pedir cuando valdría en decimal la palabra CuriosidadesDeHackers;
Con la misma plantilla anterior usada modificamos el "Alert" y utilizaremos el método "String.fromCharCode()", Se utiliza en JavaScript para crear una cadena de caracteres a partir de los valores Unicode especificados. Toma una secuencia de números Unicode y devuelve una cadena que contiene los caracteres correspondientes a esos números Unicode.