Webpack源代码泄露漏洞研究 原创

2023-07-09
关注

1.1Webpack简介   

1.1.1Webpack简介  

Webpack是一个前端资源模块化管理和打包工具,它可以将多种静态文件(图片、CSS、JS等)视为模块,通过各种插件对这些模块进行加载、转换、分块并最终输出到合适的位置。Webpack以其高度的可配置性和灵活性而闻名,已经成为现代前端开发中最流行的构建工具之一。

1.1.2 Webpack主要功能  

支持各种模块化规范,如CommonJS、ES6、AMD等。

能够自动生成依赖树,并生成对应的代码块。

支持各种类型的资源,如图片、CSS、JS等。

可以使用各种插件和loader,例如压缩、混淆代码、样式预处理等。

可以对代码进行拆分和合并,提高代码的性能和效率。

1.1.3 Webpack工作原理及架构  

Webpack的工作流程可以分为四个阶段:输入、处理、输出和模块热替换(可选)。

输入阶段:Webpack通过入口文件作为启动点来开始整个构建过程。

处理阶段:Webpack将入口文件及其依赖分析后生成一个依赖图,然后再根据配置文件中的规则将不同类型的文件转化为相应的模块。

输出阶段:Webpack根据依赖图生成对应类别的代码块,并将每个代码块的代码打包成一个(或者多个)输出文件。

模块热替换阶段:为了改善开发体验,Webpack支持在开发过程中实时替换部分代码,而不用重新编译整个工程。

Webpack的架构由以下几个核心组件组成:

Entry:入口模块,指定Webpack开始分析的文件。

Output:输出文件,指定Webpack输出的打包文件名和路径。

Loader:文件转化器,用于将不同类型的文件转化为Webpack可以识别的模块。

Plugin:扩展插件,用于实现各种特殊功能和优化Webpack打包过程。

1.1.4 Webpack的部署及配置  

在部署Webpack之前,需要安装Node.js环境和NPM包管理器。可以通过以下命令进行安装:

$ sudo apt-get install nodejs npm

然后使用NPM安装Webpack:

$ npm install webpack

在安装完成后,需要进行Webpack的配置,一般情况下Webpack的配置文件是webpack.config.js。以下是一个简单的Webpack配置示例:

javascript

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader'
        },
        exclude: /node_modules/
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(['dist']),
    new HtmlWebpackPlugin({
      title: 'Webpack Demo',
      template: 'src/index.html'
    })
  ]
};

这个配置文件定义了入口文件、输出文件路径、模块处理规则和插件等内容。具体可以参考Webpack官方文档进行配置。

1.2Webpack源代码泄露漏洞  

Webpack 会为打包后的代码生成 Source Map 文件,以便在运行时可以调试源代码。然而,如果开发人员在生产环境中没有正确地配置 SourceMap,攻击者就可能获得敏感信息,例如源代码和服务器配置等。

攻击者可以通过发送 HTTP 请求来获取 Source Map 文件,并从中获取敏感信息。这可以通过以下方式实现:

在生产环境中开启 SourceMap 功能:

javascript

// webpack.config.js
module.exports = {
  // ...
  devtool: 'source-map',
};

配置 Web 服务器,以便通过 HTTP 获取 SourceMap 文件:

nginx

# nginx configuration
location /static/ {
  add_header 'Access-Control-Allow-Origin' '*';
  # 设置为源映射文件所在的目录
  alias '/path/to/source-maps/';
}

构造对 SourceMap 文件的请求:

http://example.com/static/dist/app.js.map

攻击者可以使用类似 Chrome DevTools 中 “Sources” 面板的工具来查看源代码

1.3Webpack源代码插件利用法  

1.3.1使用Chrome扩展插件SourceDetector  

1.下载SourceDetector

 SourceDetector在github上有两个地址提供,在本案例中使用第二个。

(1)https://github.com/SunHuawei/SourceDetector

(2)https://github.com/Lz1y/SourceDetector-dist

2.加载插件

直接在Google浏览器中输入“chrome://extensions/”打开插件,单击“加载已解压的扩展程序”,如图1所示。选择“SourceDetector-dist-master”子目录中的dist文件夹,如图2所示。

         

图1 打开插件管理及配置

图2 选择dist文件夹

3.配置“SourceDetector”插件成功

   如图3所示,在Google扩展程序中正常显示,则表示配置成功。

图3插件配置成功

还可以在Google地址中找到扩展程序所在的图标列,设置“SourceDetector”在地址栏可以直接使用,方便访问网站直接使用。

图4设置扩展程序展示

1.3.2获取源代码  

 1.浏览网站时使用快捷键“Ctrl+Shift+i”

   如图5所示,单击“Source”则可以查看并获取目标网站的源代码信息,在本例中可以看到webpack字样,说明使用webpack。

图5 查看目标源代码

2.搜索js.map

    选中“webpack”文件夹,单击搜索,输入“js.map”即可获取代码中包含的js.map信息,如图6所示。

图6 搜索获取js.map文件信息

3.直接下载获取源代码信息

(1)单击刚才安装的Google插件“SourceDetector”,如图7所示,单击“Download All”即可下载存在webpack代码泄露的源代码。

图7 下载webpack代码

(2)解压压缩包即可获取所有泄露的源代码

   如图8所示,可以看到js等源代码。

图8获取源代码

1.3.3 Linux下配置node.js  

1.安装node.js及npm

以Centos为例,执行以下命令安装nodejs及npm,如图9所示,表示安装成功。

sudo yum install epel-release
sudo yum install nodejs
sudo yum install -y npm
node--version
npm –version

图9安装node.js及nmp

2.安装reverse-sourcemap

npm install   reverse-sourcemap

1.3.4在linux下还原js.map文件  

1.首先需要下载js.map文件

https://somesite.com/js/chunk-vendors.556e2737.js.map

注意有些js.map文件虽然在注释中出现,但实际不存在漏洞,所以无法下载。

2. 直接反编译map文件

reverse-sourcemap --output-dir <输出目录> <源映射文件路径>

(1)方编译map文件命令

reverse-sourcemap --output-dir app.5ef4326406dfb69eb193.js app.5ef4326406dfb69eb193.js.map

reverse-sourcemap --output-dir chunk-vendors.f2592a04.js chunk-vendors.f2592a04.js.map

设置输出目录app.5ef4326406dfb69eb193.js,如图10所示,命令执行后直接获取js源代码信息

图10 获取js源代码

1.4源代码分析及利用  

当有网站的js源代码文件后,可以逐个查看js文件,寻找一些配置信息,或者可以利用的url地址信息等。在本文中不详细讨论这些漏洞的利用。

1.5漏洞修复方法  

为避免这种漏洞,应该在生产环境中禁用 SourceMap 功能或限制 SourceMap 文件的访问权限。例如,在 Webpack 配置中禁用 SourceMap 功能:

javascript

// webpack.config.js
module.exports = {
  // ...
  devtool: false,
};

或者,在 Web 服务器配置中限制 SourceMap 文件的访问权限:

nginx

# nginx configuration
location /static/ {
  # 只允许本地访问
  allow 127.0.0.1;
  deny all;
  alias '/path/to/source-maps/';
}

您觉得本篇内容如何
评分

评论

您需要登录才可以回复|注册

提交评论

谜知

这家伙很懒,什么描述也没留下

关注

点击进入下一篇

“腰部”大模型,活在故事里

提取码
复制提取码
点击跳转至百度网盘