常见JS打包工具安全分析

admin 2025年6月18日00:44:26评论3 views字数 4006阅读13分21秒阅读模式

声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。

注公众号,设置为星标,不定期有宠粉福利

常见JS打包工具安全分析
一、背景
根据以往的测试情况,总结了下JS文件带来的风险点,主要如下,基本都是高、中危漏洞。有如此多的高频漏洞,js文件分析必定是安全评估的重要环节,尤其在黑盒测试的情况下,好的分析方法,将大大提升挖洞效率。
漏洞类型
出现频率
危害等级
硬编码凭证
23.7%
致命
 客户端XSS
38.2%
高危
配置泄露
17.1%
中高危
访问控制缺陷
29.5%
高危
在以上背景前提下。近期测试各类网站,发现现在前后端分离的站点实在是太多了,用的各类打包工具,不同的打包工具因不同打包方式和特性,会对渗透测试带来不同的影响,影响"高效"挖洞,所以本文将总结各类打包工具的指纹,及分析方法,助力各位师傅"出洞"!
二、不同打包工具安全分析
安全分析主要分为以下几步。
1、前端框架指纹识别
总结下各类打包工具与前端框架的关系,各位师傅在进行前端框架指纹识别之后,可以进一步检查打包使用的工具,进而再针对打包工具的特性进一步开展漏洞挖掘。
常见JS打包工具安全分析
针对前端框架的指纹识别可以使用wappalyzer,用了什么框架,怎么打包的,一目了然。
常见JS打包工具安全分析
2、具体分析打包工具特征
如在wappalyzer已告知使用什么打包工具,此步骤可以略过。如无法识别,可参考以下的特征文件进行辨别。针对主流前端打包工具生成的常见JS文件命名模式清单,专为模糊测试和安全扫描设计。这些模式基于实际项目中的常见实践,覆盖了生产环境和开发环境的命名特征。
  • Webpack 特征
# 命名块模式[name]~[hash].jschunk-[id]-[hash].jsasync~[name].[hash].js# 特殊文件webpack-runtime*.jswebpack-jsonp*.js# 实际生产环境示例main.3d8f2a4c.jsapp-bundle-1a2b3c4d.js
  • Vite 特征
# 现代打包模式assets/index-[hash].jsassets/[name]-[hash].jsassets/[hash].js# 预构建依赖_vue-deps-*.js_react-deps-*.js# 实际生产环境示例_vue-deps-a1b2c3d4.js_react-deps.5e6f7g8h.js
  • Rollup特征
# 哈希模式bundle-[hash].jschunk-[hash].js[hash:8].js# 特殊模式dynamic-import-*.js# 实际生产环境示例bundle-a1b2c3d4.jsmain.5e6f7g8h.min.jsapp-9i8j7k6l.js

3、拉取全量js

由于打包通常会将整站的页面路径和api一起打包,利用此特点,可以拉取全站的api信息,即使不登录系统,也可以了解到登录后接口,页面等情况。针对收集到的页面和api进一步开展未授权、sql注入、账号口令硬编码等漏洞挖掘。

技巧-重点关注以下情况:

注意带有`chunk`、`bundle`、`main`等名字的JS文件(通常是核心文件),可以拉取核心文件里边的异步JS文件,进一步分析。

注意`sourcemap`文件(`.map`结尾),它能还原原始代码,进一步分析原始代码,进而提取敏感信息。

  • webpack提取全量js的方法

有现成的工具,下载即可使用。

Packer-Fuzzer:https://github.com/rtcatc/Packer-Fuzzer。此工具误报率较高。

jjjjjjjjjjjjjs:https://github.com/ttstormxx/jjjjjjjjjjjjjs

  • vite拉取全量js的方法

无现成的工具,实际使用可根据以下代码小改。
import requestsfrom bs4 import BeautifulSoupimport redef extract_vite_js(base_url):    response = requests.get(base_url)    soup = BeautifulSoup(response.text, 'html.parser')    # 1. 提取主入口 JS(含 Vite 热更新逻辑)    main_js = [script['src'for script in soup.find_all('script', src=True               if 'vite' in script.get('src''')]    # 2. 捕获动态导入的 Chunk(如 /_vite/deps/*.js)    chunk_pattern = re.compile(r'import("([^"]+.js)")')    chunks = set(chunk_pattern.findall(response.text))    # 3. 下载所有文件    for js in main_js + list(chunks):        js_url = urljoin(base_url, js)        content = requests.get(js_url).text        with open(js.split('/')[-1], 'w'as f:            f.write(content)
  • Rollup提取全量js方法
考虑到适用性较低,且提取复杂,有兴趣的师傅可以deepseek科普下。
4、提取全量js中的敏感信息
可参考以下代码。规则可自行定义
import reimport argparsefrom pathlib import Pathdef analyze_js(file_path):    """分析JS文件中的敏感信息"""    results = {"urls": [], "keys": [], "credentials": []}    try:        with open(file_path, 'r', encoding='utf-8', errors='ignore'as f:            content = f.read()        # 提取URL        results["urls"] = re.findall(r'https?://[^s"']+', content)        results["urls"] += re.findall(r'['"`](/[^s"']+?)['"`]', content)        # 提取密钥        results["keys"] = re.findall(            r'(?:api[_-]?key|secret[_-]?key|access[_-]?key)s*[=:]s*['"`]([^'"`]{10,})['"`]'            content, re.IGNORECASE        )        # 提取账号密码        creds = re.findall(            r'b(?:user|login|account|auth)s*[=:]s*['"`]([^'"`]+)['"`].*?'            r'b(?:pass|pwd|credential)s*[=:]s*['"`]([^'"`]{6,})['"`]'            content, re.IGNORECASE | re.DOTALL        )        results["credentials"] = [f"user={u}, pass={p}" for u, p in creds]        # 其他敏感信息        results["emails"] = re.findall(r'b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}b', content)        return results    except Exception as e:        return {"error"str(e)}def main():    parser = argparse.ArgumentParser(description='JS敏感信息分析工具')    parser.add_argument('path'help='JS文件或目录路径')    args = parser.parse_args()    path = Path(args.path)    if path.is_file():        results = {str(path): analyze_js(path)}    elif path.is_dir():        results = {}        for js_file in path.glob('**/*.js'):            results[str(js_file)] = analyze_js(js_file)    else:        print(f"无效路径: {path}")        return    # 打印结果    for file, data in results.items():        print(f"n 文件: {file}")        for category, items in data.items():            if items:                print(f"n {category.upper()}:")                for item in items:                    print(f"  - {item}")if __name__ == "__main__":    main()
以上为针对不同打包工具特性,可参考开展js分析的思路。适用于无账号密码情况下的黑盒测试,供各位师傅参考。

原文始发于微信公众号(锐鉴安全):常见JS打包工具安全分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月18日00:44:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   常见JS打包工具安全分析http://cn-sec.com/archives/4172922.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息