vue漏洞
- Vue 源碼泄露(最常見低危→高危)
原理:
webpack 默認生成 .js.map,生產環境未關閉,可反編譯還原完整源碼,泄露接口、密鑰、注釋路徑。
黑盒特征:
響應頭 X-SourceMap: xxx.js.map 或 JS 末尾出現 //# sourceMappingURL=xxx.js.map
URL 直接訪問 /js/app.xxxxx.js.map 返回 200 且 Content-Type 為 application/octet-stream
快速驗證:
bash
復制
curl -s https://target.com/js/app.12345.js | grep -ia "sourceMappingURL"
回顯即存在;繼續訪問同目錄 .map 文件可下載
掃描正則:\w+.js?\w.map$
修復:
productionSourceMap: false(vue.config.js)并刪除服務器殘留 .map 文件。
2. Vue Router 靜態目錄未授權(中危→高危)
原理:
前端路由表寫死在 app..js 中,形如 {path:"/admin/user",component:xxx},未做后端鑒權即可直接訪問組件對應業務接口。
黑盒特征:
URL 帶 /#/ 或 /#/admin/xxx 即 Vue Hash 模式;JS 里搜索 path:" 可批量提取目錄
拼接 /admin/user 等路徑無需登錄即可 200 返回數據或跳轉后臺頁面
快速驗證:
bash
復制
grep -Eo 'path:"[^"]+"' app.*.js | awk -F'"' '{print $2}' | sort -u > vue_routes.txt
結合 burp intruder 批量訪問
- 模板注入 / XSS(高危)
原理:
v-html / {{{ 插值 或 v-text 輸出未經轉義的用戶輸入;服務端把用戶數據直接注入到 HTML 片段再交給 Vue 掛載。
黑盒特征:
搜索框、富文本、郵件內容等區域提交 <svg/onload=alert(1)> 后,前端直接彈窗
頁面源碼出現 {{{ 或 v-html= 且值來自請求參數
快速驗證:
JavaScript
復制
'"><svg/onload=alert(document.domain)>
{{constructor.constructor('alert(1)')()}}
注意:Vue 3 默認轉義,但仍會受服務端直出的 HTML 片段污染。 - 樣式注入+點擊劫持(中危)
原理:
:style="userProvidedStyles" 或后臺返回的 style 字段可注入 position:fixed 覆蓋登錄按鈕。
黑盒特征:
提交 {"color":"red","position":"fixed","top":"0","left":"0","z-index":"9999","background":"rgba(0,0,0,0)"} 后整頁被透明層覆蓋
審查元素可見
修復:
使用白名單對象寫法 :style="{color: userColor}",或把用戶區放入 sandbox iframe。 - 正則拒絕服務 ReDoS(CVE-2024-9506,低版本 DoS)
影響版本:Vue 2.0.0–3.0.0(@vue/compiler-core)
原理:
parseHTML 使用貪婪正則解析模板,構造 {{'a'.repeat(10000)+'!'}} 類 payload 可讓瀏覽器/Node 進程 CPU 100%。
黑盒特征:
提交極長模板字符串后,頁面卡死或 SSR 服務超時
無錯誤回顯,但響應時間 TTFB 明顯飆升
快速驗證:
JavaScript
復制
const evil = '{{' + 'a'.repeat(50000) + '!}}';
// 通過評論、富文本、Markdown 存儲后讓 Vue 二次渲染
修復:升級至 Vue 3.0.1+、2.7.16+。 - 組件間數據污染 / Props 注入(邏輯漏洞)
原理:
子組件直接修改 Object props,父級數據被同步篡改;若 props 控制權限標志,可越權。
黑盒特征:
修改子組件表單后,未調用接口卻出現“保存成功”或權限菜單變化
控制臺 Vue-DevTools 可見 mutating props 警告
利用:
把回傳對象增加 {"role":"admin"} 等字段觀察 UI 變化。 - 事件綁定注入(XSS 變種)
原理:
后臺返回 - 服務端渲染(SSR)上下文污染(高危)
原理:
context.state = JSON.stringify(window.INITIAL_STATE) 未轉義 導致 XSS。
黑盒特征:
查看源碼 window.INITIAL_STATE = {"userInput":"<svg/onload=alert(1)>"}
直接提交 <svg/onload=alert(1)> 作為任何字段值,刷新頁面即彈窗。 - 開源腳手架歷史漏洞(RuoYi-Vue ≤3.2.0)
任意文件下載 /common/download/resource?name=../../../etc/passwd
接口無前綴、無鑒權,可直接 GET 下載服務器任意文件 - 工具&掃描插件推薦
Wappalyzer / WhatRuns:快速識別 Vue + webpack
burp-HAE:自帶 .js.map 指紋,自動下載并反編譯
reverse-sourcemap:npx reverse-sourcemap -v xxx.js.map -o src
vue-pen-test-checklist:社區維護的 payload 集合 https://github.com/danielmiessler/vppt
速查 payload 小結
xxx.js.map → 源碼泄露
/#/admin、/#/user、/#/manage → Hash 路由未授權
{{constructor.constructor('alert(1)')()}} → 模板注入
"><svg/onload=alert(1)> → v-html / 行內事件 XSS
'a'.repeat(50000)+'!' → ReDoS
{"role":"admin"} → Props 數據污染
name=../../../etc/passwd → RuoYi 任意文件下載

浙公網安備 33010602011771號