Vue.js
Reading time: 5 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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
XSS Sinks in Vue.js
v-html Direktiva
Direktiva v-html
prikazuje sirov HTML, tako da se svaki <script>
(ili atribut poput onerror
) ugrađen u nesanitizovani korisnički unos odmah izvršava.
<div id="app">
<div v-html="htmlContent"></div>
</div>
<script>
new Vue({
el: '#app',
data: {
htmlContent: '<img src=x onerror=alert(1)>'
}
})
</script>
v-bind sa src ili href
Povezivanje korisničkog stringa sa atributima koji sadrže URL (href
, src
, xlink:href
, formaction
…) omogućava izvršavanje payload-a kao što je javascript:alert(1)
kada se link prati.
<div id="app">
<a v-bind:href="userInput">Click me</a>
</div>
<script>
new Vue({
el: '#app',
data: {
userInput: 'javascript:alert(1)'
}
})
</script>
v-on sa korisnički kontrolisanim handler-ima
v-on
kompajlira svoju vrednost sa new Function
; ako ta vrednost dolazi od korisnika, pružate im izvršavanje koda na tanjiru.
<div id="app">
<button v-on:click="malicious">Click me</button>
</div>
<script>
new Vue({
el: '#app',
data: { malicious: 'alert(1)' }
})
</script>
Dinamička imena atributa / događaja
Imena koja obezbeđuje korisnik u v-bind:[attr]
ili v-on:[event]
omogućavaju napadačima da kreiraju bilo koji atribut ili handler događaja, zaobilazeći statičku analizu i mnoge CSP pravila.
<img v-bind:[userAttr]="payload">
<!-- userAttr = 'onerror', payload = 'alert(1)' -->
Dinamička komponenta (<component :is>
)
Dozvoljavanje korisničkih stringova u :is
može montirati proizvoljne komponente ili inline šablone—opasno u pretraživaču i katastrofalno u SSR.
<component :is="userChoice"></component>
<!-- userChoice = '<script>alert(1)</script>' -->
Nepouzdani šabloni u SSR
Tokom renderovanja na strani servera, šablon se izvršava na vašem serveru; injektovanje korisničkog HTML-a može eskalirati XSS do potpune daljinske izvršne kontrole (RCE). CVE-ovi u vue-template-compiler
dokazuju rizik.
// DANGER – never do this
const app = createSSRApp({ template: userProvidedHtml })
Filters / render functions that eval
Zastarjeli filteri koji grade render stringove ili pozivaju eval
/new Function
na korisničkim podacima su još jedan XSS vektor—zamijenite ih sa izračunatim svojstvima.
Vue.filter('run', code => eval(code)) // DANGER
Druge uobičajene ranjivosti u Vue projektima
Zagađenje prototipa u pluginovima
Deep-merge pomoćnici u nekim pluginovima (npr., vue-i18n) su omogućili napadačima da pišu u Object.prototype
.
import merge from 'deepmerge'
merge({}, JSON.parse('{ "__proto__": { "polluted": true } }'))
Open redirects with vue-router
Prosleđivanje neproverenih korisničkih URL-ova u router.push
ili <router-link>
može preusmeriti na javascript:
URI-e ili phishing domene.
this.$router.push(this.$route.query.next) // DANGER
CSRF u Axios / fetch
SPA-ovi i dalje trebaju CSRF tokene sa servera; SameSite kolačići sami po sebi ne mogu blokirati automatski poslata cross-origin POST-ova.
axios.post('/api/transfer', data, {
headers: { 'X-CSRF-TOKEN': token }
})
Click-jacking
Vue aplikacije se mogu uokviriti osim ako ne pošaljete i X-Frame-Options: DENY
i Content-Security-Policy: frame-ancestors 'none'
.
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none';
Content-Security-Policy zamke
Puna Vue izgradnja zahteva unsafe-eval
; pređite na runtime izgradnju ili unapred kompajlirane šablone kako biste mogli da se oslobodite tog opasnog izvora.
Content-Security-Policy: default-src 'self'; script-src 'self';
Napadi na lanac snabdevanja (node-ipc – mart 2022)
Sabotaža node-ipc—koju je povukao Vue CLI—pokazala je kako transitivna zavisnost može da izvrši proizvoljan kod na razvojnim mašinama. Zaključajte verzije i često vršite reviziju.
npm ci --ignore-scripts # safer install
Hardening Checklist
- Sanitizujte svaki string pre nego što dođe do
v-html
(DOMPurify). - Dodajte na belu listu dozvoljene sheme, atribute, komponente i događaje.
- Izbegavajte
eval
i dinamičke šablone u potpunosti. - Patch-ujte zavisnosti nedeljno i pratite obaveštenja.
- Pošaljite jake HTTP zaglavlja (CSP, HSTS, XFO, CSRF).
- Zaključajte svoj lanac snabdevanja revizijama, lockfile-ovima i potpisanim commit-ima.
References
- https://www.stackhawk.com/blog/vue-xss-guide-examples-and-prevention/
- https://medium.com/@isaacwangethi30/vue-js-security-6e246a7613da
- https://vuejs.org/guide/best-practices/security
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.