某EIS办公平台0day代码审计过程
字数 2793 2025-12-16 12:14:18

某EIS办公平台0day代码审计教学文档

环境搭建与配置

系统环境要求

  • Web服务器: Internet信息服务(IIS)
  • 应用程序池: 托管管道模式需修改为经典模式.NET(默认集成模式需调整)
  • 数据库: 新建数据库,与web.config连接字符串保持一致

部署步骤

  1. 在IIS上新建网站,设置站点名称和物理安装路径
  2. 在应用程序池中找到对应站点程序池,修改托管管道模式为经典
  3. 按顺序依次导入SQL文件完成数据库初始化
  4. 配置web.config中的数据库连接字符串

授权机制分析与绕过

授权验证流程

系统采用双重授权验证机制:

1. 文件授权验证

  • 读取路径:Bin/yard.lic授权文件
  • 获取硬件信息:CPU ID和MAC地址
  • 解密算法:3DES(TripleDES)
  • 密钥生成:CPU + "xxxxxxx20800"
  • 初始化向量(IV):MAC地址
  • 解析10个授权字段,关键字段array[3]包含"DeptName|FullName"

2. 数据库授权验证

  • 查询表:Mekp_EISProductInfo
  • 解密字段:LicenseKey(使用相同密钥和IV)
  • 解析字段:过期时间、FullName

3. 验证逻辑

  • FullName一致性检查:文件授权与数据库授权必须完全匹配
  • 试用版时间校验:DateTime.Now < expiration返回false(验证失败)
  • 验证通过后,授权信息存储到Application对象中

授权绕过方法

方法一:生成合法License

编写脚本根据实际CPU和MAC地址生成合法授权文件:

# 伪代码示例
def generate_license(cpu_id, mac_address):
    key = cpu_id + "xxxxxxx20800"
    iv = mac_address
    full_name = "合法授权名称"
    # 使用3DES加密生成license文件内容
    return encrypted_license

方法二:代码修改绕过

使用dnSpy工具修改核心DLL文件:

  1. 定位关键授权检查文件:yard.Framework.dll
  2. 注释以下方法的鉴权代码:
    • EkpGlobal.CheckLicense() - 核心授权检查
    • EkpPage.OnInit() - 页面初始化检查
    • EkpPage.Page_Load() - 页面加载检查
    • EkpUserControl.Page_Load() - 用户控件检查
  3. 重新编译DLL文件替换原文件

Web.config安全配置分析

匿名访问路径配置

以下路径配置为允许所有用户访问(<allow users="*" />):

配置路径 实际访问路径 说明
XX /XX/*.asmx WebService接口目录,所有ASMX文件可匿名访问
aaa /aaa/*.aspx 特定模块目录下所有aspx文件可匿名访问
third /third/*.aspx 第三方集成目录
Global/Pages/CheckPage /Global/Pages/CheckPage/*.aspx 检查页面目录
Services/MobileDown.aspx /Services/MobileDown.aspx 移动端下载接口

漏洞详细分析

1. 前台SSRF漏洞

文件路径: bin/yard.UI.Integration/yard.UI.Integration.third.template/Service.cs

漏洞代码:

// link参数直接拼接,无任何验证
string url = "http://" + base.Request["link"];

漏洞特点:

  • 参数link用户可控,直接拼接到URL
  • 无URL白名单限制
  • 虽然固定使用http://协议头,但可通过link参数完全控制目标URL

利用方式: 构造恶意请求实现内网探测、服务攻击等

2. 前台SQL注入漏洞

漏洞点一:down.aspx

漏洞代码:

// 直接拼接用户输入到SQL查询
string sql = $"... main_id='{arg}'";

验证方法: 使用延时注入进行验证

漏洞点二:Notify.asmx

文件路径: bin/yard.WebService/yard.WebService.WS.Notify/Notify.cs

漏洞代码:

// LoginName参数直接拼接
string sql = "... AND LoginName='" + person.LoginName + "'";

利用方式: 通过xp_cmdshell执行系统命令,如写入文件等

3. 前台任意用户添加漏洞

文件路径: bin/yard.WebService/yard.WebService.WS/UserInfo.cs

漏洞特点:

  • User方法使用[WebMethod]标记为Web服务
  • WS目录配置为允许匿名访问
  • 无权限校验,直接执行数据库插入操作

利用流程:

  1. 调用WebService的User方法
  2. 系统首先查询数据库中是否存在该用户
  3. 如果不存在,直接向FI_ORG_EMP(员工主表)插入新用户记录

4. 后台任意文件上传漏洞

漏洞点一:UploadLogImg.aspx

文件路径: binyard.Admin.UIyard.Admin.UIUploadLogImg.cs

方法: saveBg()saveLogo()

限制:

  • 上传路径固定:/App_Themes/Login/
  • 文件名采用日期命名
  • 无法直接获取shell(路径不可写执行文件)

漏洞点二:bulkinsert_data.aspx(可利用)

关键技术点:

ViewState验证绕过:

  • 需要有效的__VIEWSTATE__VIEWSTATEGENERATOR
  • 首次访问页面时自动生成这些值
  • 无有效ViewState会导致Invalid ViewState错误

目录穿越技巧:

  • 代码取最后一个\之后的部分作为文件名
  • 但正斜杠/可正常绕过检测:
    • ..\\third\\shell.aspx → 检测为"shell.aspx"(失败)
    • ../third/shell.aspx → 检测为"/third/shell.aspx"(成功)

结合web.config:

  • 可上传文件到third目录(配置为允许访问)
  • 实现真正的文件上传漏洞利用

安全建议与修复方案

授权机制加固

  1. 采用非对称加密算法替换3DES
  2. 增加授权文件完整性校验
  3. 实现硬件绑定与网络验证结合

输入验证强化

  1. 所有用户输入必须进行严格过滤和验证
  2. 实施参数化查询杜绝SQL注入
  3. 建立URL白名单机制防止SSRF

文件上传安全

  1. 限制上传文件类型和扩展名
  2. 禁止上传路径包含路径遍历字符
  3. 上传文件存储在Web根目录外,通过脚本控制访问

权限控制完善

  1. 重新评估匿名访问路径的必要性
  2. 实现基于角色的访问控制(RBAC)
  3. 对WebService方法增加身份验证

总结

本EIS办公平台存在多处严重安全漏洞,从前台到后台均有可利用点。特别需要注意的是结合多个漏洞的链式攻击可能造成更严重的安全后果。安全开发应贯穿整个软件生命周期,从设计阶段就考虑安全因素,而非依赖后期修补。

某EIS办公平台0day代码审计教学文档 环境搭建与配置 系统环境要求 Web服务器 : Internet信息服务(IIS) 应用程序池 : 托管管道模式需修改为 经典模式 .NET(默认集成模式需调整) 数据库 : 新建数据库,与web.config连接字符串保持一致 部署步骤 在IIS上新建网站,设置站点名称和物理安装路径 在应用程序池中找到对应站点程序池,修改托管管道模式为经典 按顺序依次导入SQL文件完成数据库初始化 配置web.config中的数据库连接字符串 授权机制分析与绕过 授权验证流程 系统采用双重授权验证机制: 1. 文件授权验证 读取路径: Bin/yard.lic 授权文件 获取硬件信息:CPU ID和MAC地址 解密算法:3DES(TripleDES) 密钥生成:CPU + "xxxxxxx20800" 初始化向量(IV):MAC地址 解析10个授权字段,关键字段 array[3] 包含"DeptName|FullName" 2. 数据库授权验证 查询表: Mekp_EISProductInfo 解密字段: LicenseKey (使用相同密钥和IV) 解析字段:过期时间、FullName 3. 验证逻辑 FullName一致性检查:文件授权与数据库授权必须完全匹配 试用版时间校验: DateTime.Now < expiration 返回false(验证失败) 验证通过后,授权信息存储到Application对象中 授权绕过方法 方法一:生成合法License 编写脚本根据实际CPU和MAC地址生成合法授权文件: 方法二:代码修改绕过 使用dnSpy工具修改核心DLL文件: 定位关键授权检查文件: yard.Framework.dll 注释以下方法的鉴权代码: EkpGlobal.CheckLicense() - 核心授权检查 EkpPage.OnInit() - 页面初始化检查 EkpPage.Page_Load() - 页面加载检查 EkpUserControl.Page_Load() - 用户控件检查 重新编译DLL文件替换原文件 Web.config安全配置分析 匿名访问路径配置 以下路径配置为允许所有用户访问( <allow users="*" /> ): | 配置路径 | 实际访问路径 | 说明 | |---------|------------|------| | XX | /XX/*.asmx | WebService接口目录,所有ASMX文件可匿名访问 | | aaa | /aaa/*.aspx | 特定模块目录下所有aspx文件可匿名访问 | | third | /third/*.aspx | 第三方集成目录 | | Global/Pages/CheckPage | /Global/Pages/CheckPage/*.aspx | 检查页面目录 | | Services/MobileDown.aspx | /Services/MobileDown.aspx | 移动端下载接口 | 漏洞详细分析 1. 前台SSRF漏洞 文件路径 : bin/yard.UI.Integration/yard.UI.Integration.third.template/Service.cs 漏洞代码 : 漏洞特点 : 参数 link 用户可控,直接拼接到URL 无URL白名单限制 虽然固定使用 http:// 协议头,但可通过 link 参数完全控制目标URL 利用方式 : 构造恶意请求实现内网探测、服务攻击等 2. 前台SQL注入漏洞 漏洞点一:down.aspx 漏洞代码 : 验证方法 : 使用延时注入进行验证 漏洞点二:Notify.asmx 文件路径 : bin/yard.WebService/yard.WebService.WS.Notify/Notify.cs 漏洞代码 : 利用方式 : 通过 xp_cmdshell 执行系统命令,如写入文件等 3. 前台任意用户添加漏洞 文件路径 : bin/yard.WebService/yard.WebService.WS/UserInfo.cs 漏洞特点 : User 方法使用 [WebMethod] 标记为Web服务 WS目录配置为允许匿名访问 无权限校验,直接执行数据库插入操作 利用流程 : 调用WebService的User方法 系统首先查询数据库中是否存在该用户 如果不存在,直接向 FI_ORG_EMP (员工主表)插入新用户记录 4. 后台任意文件上传漏洞 漏洞点一:UploadLogImg.aspx 文件路径 : binyard.Admin.UIyard.Admin.UIUploadLogImg.cs 方法 : saveBg() 和 saveLogo() 限制 : 上传路径固定: /App_Themes/Login/ 文件名采用日期命名 无法直接获取shell(路径不可写执行文件) 漏洞点二:bulkinsert_ data.aspx(可利用) 关键技术点 : ViewState验证绕过 : 需要有效的 __VIEWSTATE 和 __VIEWSTATEGENERATOR 首次访问页面时自动生成这些值 无有效ViewState会导致 Invalid ViewState 错误 目录穿越技巧 : 代码取最后一个 \ 之后的部分作为文件名 但正斜杠 / 可正常绕过检测: ..\\third\\shell.aspx → 检测为 "shell.aspx" (失败) ../third/shell.aspx → 检测为 "/third/shell.aspx" (成功) 结合web.config : 可上传文件到 third 目录(配置为允许访问) 实现真正的文件上传漏洞利用 安全建议与修复方案 授权机制加固 采用非对称加密算法替换3DES 增加授权文件完整性校验 实现硬件绑定与网络验证结合 输入验证强化 所有用户输入必须进行严格过滤和验证 实施参数化查询杜绝SQL注入 建立URL白名单机制防止SSRF 文件上传安全 限制上传文件类型和扩展名 禁止上传路径包含路径遍历字符 上传文件存储在Web根目录外,通过脚本控制访问 权限控制完善 重新评估匿名访问路径的必要性 实现基于角色的访问控制(RBAC) 对WebService方法增加身份验证 总结 本EIS办公平台存在多处严重安全漏洞,从前台到后台均有可利用点。特别需要注意的是结合多个漏洞的链式攻击可能造成更严重的安全后果。安全开发应贯穿整个软件生命周期,从设计阶段就考虑安全因素,而非依赖后期修补。