一次对企业内部EHR系统的渗透测试
字数 1191 2025-08-26 22:12:02

企业内部EHR系统渗透测试实战指南

1. 渗透测试概述

本次渗透测试针对企业内部EHR(电子健康记录)系统,该系统已接入企业SSO单点登录系统。测试起点是一个拥有基本登录凭据但无任何系统权限的普通员工账号。

2. 初始信息收集

2.1 前端分析

  • 系统前端使用现代JavaScript框架构建
  • 观察到的JS文件特征:
    • F12开发者工具仅显示6个JS文件
    • 源代码中实际包含数十个chunk-xxxxxx.js文件
    • 部分接口路径隐藏在JS文件中未被常规扫描工具发现

2.2 工具准备

推荐使用以下工具:

  • Burp Suite - 用于接口测试和请求/响应分析
  • PackerFuzzer - 自动化接口发现工具
  • 自定义Python脚本 - 用于批量处理JS文件

3. 自动化接口发现

3.1 使用PackerFuzzer

  • 快速发现两个任意文件上传漏洞:
    • 一个漏洞利用MinIO存储
    • 另一个是SpringBoot框架的文件上传漏洞

3.2 JS文件路径提取

编写Python脚本批量分析JS文件中的接口路径:

import json
import re
import requests
import sys
import os

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"}

fileurl=sys.argv[1]

filemkdir=fileurl.split('_')[0]
if not os.path.exists(filemkdir):
    os.makedirs(filemkdir)

paths=[]
for dirpath, dirnames, filenames in os.walk('./'+filemkdir):
    for file in filenames:
        with open("./"+filemkdir+"/"+file,"r",encoding='gb18030', errors='ignore') as f2:
            try:
                line=f2.readlines()
                for line in line:
                    line=line.strip('\n').strip('\t')
                    p =  re.findall('''(['"]\/[^][^>< \)\(\{\}]*?['"])''',line)
                    if p != None:
                        for path in p:
                            path=path.replace(':"',"").replace('"',"")
                            paths.append(file+"---"+path)
            except Exception as e:
                print(e)

for var in sorted(set(paths)):
    with open (fileurl+'_path.txt',"a+",encoding='gb18030', errors='ignore') as paths:
        paths.write(var+'\n')

4. 接口测试技巧

4.1 参数遍历

  • 发现personId参数控制数据返回
  • 通过其他接口(如/tree/list)获取可能的personId
  • 测试发现严重越权漏洞:可访问其他员工敏感信息

4.2 请求格式转换

  • 当接口返回"服务异常"时尝试:
    • x-www-form-urlencoded格式转为JSON格式
    • 示例:onBoardTab接口在JSON格式下返回员工个人信息

4.3 JS参数提取

  • 搜索JS中的searchParams字符串
  • 使用正则表达式e.searchParams,"[a-zA-Z_]+"提取潜在参数
  • 关注$route.query.xxxxx模式,可能是有效参数来源

5. 关键漏洞发现

5.1 信息泄露

  • 通过orgId参数控制的数据接口
  • 返回包含员工职位、编号等敏感信息

5.2 越权访问

  • 通过personId参数遍历获取其他员工完整信息
  • 部分接口无需认证即可访问敏感数据

6. 防御建议

6.1 开发层面

  • 实施严格的权限验证机制
  • 避免在前端JS中暴露敏感接口路径
  • 对所有接口实施参数校验

6.2 架构层面

  • 实施API网关进行统一鉴权
  • 对敏感操作实施二次验证
  • 定期进行安全审计和渗透测试

7. 工具与资源

  • Burp Suite插件:Json2http (用于返回包转请求包)
  • 自动化工具:PackerFuzzer
  • 正则表达式:用于从JS中提取接口路径和参数

8. 经验总结

  1. 不要忽视"服务异常"的响应,可能是格式问题而非真正的错误
  2. JS文件是Web应用的重要信息源,需要系统性地分析
  3. 参数命名一致性分析可帮助发现隐藏的漏洞
  4. 自动化工具结合手动测试才能达到最佳效果
  5. 返回包分析往往能揭示系统的内部结构和潜在弱点
企业内部EHR系统渗透测试实战指南 1. 渗透测试概述 本次渗透测试针对企业内部EHR(电子健康记录)系统,该系统已接入企业SSO单点登录系统。测试起点是一个拥有基本登录凭据但无任何系统权限的普通员工账号。 2. 初始信息收集 2.1 前端分析 系统前端使用现代JavaScript框架构建 观察到的JS文件特征: F12开发者工具仅显示6个JS文件 源代码中实际包含数十个 chunk-xxxxxx.js 文件 部分接口路径隐藏在JS文件中未被常规扫描工具发现 2.2 工具准备 推荐使用以下工具: Burp Suite - 用于接口测试和请求/响应分析 PackerFuzzer - 自动化接口发现工具 自定义Python脚本 - 用于批量处理JS文件 3. 自动化接口发现 3.1 使用PackerFuzzer 快速发现两个任意文件上传漏洞: 一个漏洞利用MinIO存储 另一个是SpringBoot框架的文件上传漏洞 3.2 JS文件路径提取 编写Python脚本批量分析JS文件中的接口路径: 4. 接口测试技巧 4.1 参数遍历 发现 personId 参数控制数据返回 通过其他接口(如 /tree/list )获取可能的 personId 值 测试发现严重越权漏洞:可访问其他员工敏感信息 4.2 请求格式转换 当接口返回"服务异常"时尝试: 将 x-www-form-urlencoded 格式转为JSON格式 示例: onBoardTab 接口在JSON格式下返回员工个人信息 4.3 JS参数提取 搜索JS中的 searchParams 字符串 使用正则表达式 e.searchParams,"[a-zA-Z_]+" 提取潜在参数 关注 $route.query.xxxxx 模式,可能是有效参数来源 5. 关键漏洞发现 5.1 信息泄露 通过 orgId 参数控制的数据接口 返回包含员工职位、编号等敏感信息 5.2 越权访问 通过 personId 参数遍历获取其他员工完整信息 部分接口无需认证即可访问敏感数据 6. 防御建议 6.1 开发层面 实施严格的权限验证机制 避免在前端JS中暴露敏感接口路径 对所有接口实施参数校验 6.2 架构层面 实施API网关进行统一鉴权 对敏感操作实施二次验证 定期进行安全审计和渗透测试 7. 工具与资源 Burp Suite插件 :Json2http (用于返回包转请求包) 自动化工具 :PackerFuzzer 正则表达式 :用于从JS中提取接口路径和参数 8. 经验总结 不要忽视"服务异常"的响应,可能是格式问题而非真正的错误 JS文件是Web应用的重要信息源,需要系统性地分析 参数命名一致性分析可帮助发现隐藏的漏洞 自动化工具结合手动测试才能达到最佳效果 返回包分析往往能揭示系统的内部结构和潜在弱点