Vue.js
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
Vue.jsμ XSS μ±ν¬
v-html μ§μμ΄
v-html μ§μμ΄λ μμ HTMLμ λ λλ§νλ―λ‘, λΉμμμ μΈ μ¬μ©μ μ
λ ₯μ ν¬ν¨λ <script> (λλ onerrorμ κ°μ μμ±)λ μ¦μ μ€νλ©λλ€.
<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 with src or href
μ¬μ©μ λ¬Έμμ΄μ URLμ ν¬ν¨νλ μμ±(href, src, xlink:href, formaction λ±)μ λ°μΈλ©νλ©΄ λ§ν¬λ₯Ό λ°λ₯Ό λ javascript:alert(1)κ³Ό κ°μ νμ΄λ‘λκ° μ€νλ μ μμ΅λλ€.
<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 μ¬μ©μ μ μ΄ νΈλ€λ¬μ ν¨κ»
v-onμ new FunctionμΌλ‘ κ°μ μ»΄νμΌν©λλ€; λ§μ½ κ·Έ κ°μ΄ μ¬μ©μλ‘λΆν° μ¨ κ²μ΄λΌλ©΄, μ½λ μ€νμ μ 곡νλ μ
μ
λλ€.
<div id="app">
<button v-on:click="malicious">Click me</button>
</div>
<script>
new Vue({
el: '#app',
data: { malicious: 'alert(1)' }
})
</script>
λμ μμ± / μ΄λ²€νΈ μ΄λ¦
μ¬μ©μκ° μ 곡ν μ΄λ¦μ΄ v-bind:[attr] λλ v-on:[event]μ μ¬μ©λλ©΄ 곡격μλ μ μ λΆμ λ° λ§μ CSP κ·μΉμ μ°ννμ¬ μμμ μμ± λλ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μμ±ν μ μμ΅λλ€.
<img v-bind:[userAttr]="payload">
<!-- userAttr = 'onerror', payload = 'alert(1)' -->
λμ μ»΄ν¬λνΈ (<component :is>)
:isμ μ¬μ©μ λ¬Έμμ΄μ νμ©νλ©΄ μμμ μ»΄ν¬λνΈλ μΈλΌμΈ ν
νλ¦Ώμ λ§μ΄νΈν μ μμ΅λλ€. μ΄λ λΈλΌμ°μ μμ μννκ³ SSRμμλ μ¬μμ μ
λλ€.
<component :is="userChoice"></component>
<!-- userChoice = '<script>alert(1)</script>' -->
SSRμμ μ λ’°ν μ μλ ν νλ¦Ώ
μλ² μΈ‘ λ λλ§ μ€μ ν
νλ¦Ώμ λΉμ μ μλ²μμ μ€νλ©λλ€; μ¬μ©μ HTMLμ μ£Όμ
νλ©΄ XSSκ° μ 체 μ격 μ½λ μ€ν(RCE)μΌλ‘ νλλ μ μμ΅λλ€. vue-template-compilerμ CVEλ μ΄ μνμ μ¦λͺ
ν©λλ€.
// DANGER β never do this
const app = createSSRApp({ template: userProvidedHtml })
Filters / render functions that eval
λ κ±°μ νν°λ λ λ λ¬Έμμ΄μ μμ±νκ±°λ μ¬μ©μ λ°μ΄ν°μ λν΄ eval/new Functionμ νΈμΆνλ λ λ€λ₯Έ XSS 벑ν°μ
λλ€. μ΄λ₯Ό κ³μ°λ μμ±μΌλ‘ κ΅μ²΄νμΈμ.
Vue.filter('run', code => eval(code)) // DANGER
Vue νλ‘μ νΈμ λ€λ₯Έ μΌλ°μ μΈ μ·¨μ½μ
νλ¬κ·ΈμΈμμμ νλ‘ν νμ μ€μΌ
μΌλΆ νλ¬κ·ΈμΈ(μ: vue-i18n)μ Deep-merge ν¬νΌλ 곡격μκ° Object.prototypeμ μΈ μ μλλ‘ νμ©νμ΅λλ€.
import merge from 'deepmerge'
merge({}, JSON.parse('{ "__proto__": { "polluted": true } }'))
Open redirects with vue-router
κ²μ¦λμ§ μμ μ¬μ©μ URLμ router.push λλ <router-link>μ μ λ¬νλ©΄ javascript: URI λλ νΌμ± λλ©μΈμΌλ‘ 리λλ μ
λ μ μμ΅λλ€.
this.$router.push(this.$route.query.next) // DANGER
CSRF in Axios / fetch
SPAsλ μ¬μ ν μλ² μΈ‘ CSRF ν ν°μ΄ νμν©λλ€; SameSite μΏ ν€λ§μΌλ‘λ μλ μ μΆλ κ΅μ°¨ μΆμ² POSTλ₯Ό μ°¨λ¨ν μ μμ΅λλ€.
axios.post('/api/transfer', data, {
headers: { 'X-CSRF-TOKEN': token }
})
Click-jacking
Vue μ±μ X-Frame-Options: DENYμ Content-Security-Policy: frame-ancestors 'none'λ₯Ό λͺ¨λ μ μ‘νμ§ μμΌλ©΄ νλ μμ ν¬ν¨λ μ μμ΅λλ€.
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none';
Content-Security-Policy pitfalls
μ 체 Vue λΉλλ unsafe-evalμ΄ νμν©λλ€; μνν μμ€λ₯Ό μ κ±°ν μ μλλ‘ λ°νμ λΉλλ 미리 μ»΄νμΌλ ν
νλ¦ΏμΌλ‘ μ ννμΈμ.
Content-Security-Policy: default-src 'self'; script-src 'self';
Supply-chain attacks (node-ipc β March 2022)
node-ipcμ νκ΄΄λ Vue CLIμ μν΄ λ°μνμΌλ©°, μ μ΄ μ’ μμ±μ΄ κ°λ° λ¨Έμ μμ μμμ μ½λλ₯Ό μ€νν μ μλ λ°©λ²μ 보μ¬μ£Όμμ΅λλ€. λ²μ μ κ³ μ νκ³ μμ£Ό κ°μ¬νμΈμ.
npm ci --ignore-scripts # safer install
νλλ 체ν¬λ¦¬μ€νΈ
- λͺ¨λ λ¬Έμμ΄μ μ 리νμ¬
v-htmlμ μ λ¬νκΈ° μ μ μ²λ¦¬ν©λλ€ (DOMPurify). - νμ©λ μ€ν΄, μμ±, μ»΄ν¬λνΈ λ° μ΄λ²€νΈλ₯Ό νμ΄νΈλ¦¬μ€νΈν©λλ€.
evalκ³Ό λμ ν νλ¦Ώμ μμ ν νΌν©λλ€.- μμ‘΄μ±μ λ§€μ£Ό ν¨μΉνκ³ κΆκ³ μ¬νμ λͺ¨λν°λ§ν©λλ€.
- κ°λ ₯ν HTTP ν€λλ₯Ό μ μ‘ν©λλ€ (CSP, HSTS, XFO, CSRF).
- κ°μ¬, μ κΈ νμΌ λ° μλͺ λ 컀λ°μΌλ‘ 곡κΈλ§μ μ κΈλλ€.
μ°Έκ³ λ¬Έν
- 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
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


