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

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.

html
<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.

html
<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.

html
<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.

html
<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.

html
<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.

js
// 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.

js
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.

js
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.

js
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.

js
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'.

http
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.

http
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.

shell
npm ci --ignore-scripts   # safer install

Hardening Checklist

  1. Sanitizujte svaki string pre nego što dođe do v-html (DOMPurify).
  2. Dodajte na belu listu dozvoljene sheme, atribute, komponente i događaje.
  3. Izbegavajte eval i dinamičke šablone u potpunosti.
  4. Patch-ujte zavisnosti nedeljno i pratite obaveštenja.
  5. Pošaljite jake HTTP zaglavlja (CSP, HSTS, XFO, CSRF).
  6. Zaključajte svoj lanac snabdevanja revizijama, lockfile-ovima i potpisanim commit-ima.

References

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