记一次项目中遇到的JAVA系统审计
字数 1646 2025-08-30 06:50:35

Java系统安全审计实战教学文档

1. 系统架构概述

审计目标系统采用以下技术架构:

  • Spring MVC框架
  • WAR包部署方式(非Spring Boot)
  • 使用web.xml配置路由

2. 审计流程与方法

2.1 配置文件分析

首先检查web.xml文件:

  • 确认系统使用Spring MVC的统一路由机制

检查spring.xml配置文件:

  • 重点关注全局拦截器配置:com.futvan.z.framework.core.AllHandlerInterceptor
  • 拦截器配置对所有URL进行拦截:/**

2.2 权限拦截器分析

拦截器分为三类处理逻辑:

  1. 第一类:web包下的请求不拦截
  2. 第二类:httpservices包下状态为1的方法放行
  3. 第三类:不属于上述两类的请求单独处理(重点关注白名单)

3. 漏洞发现与分析

3.1 任意文件上传漏洞

漏洞位置:upload方法

漏洞分析

  1. 检查CreateFileSavePath方法:

    • 确认文件上传路径是否可控
    • 验证是否可上传到web根目录下
  2. 检查save方法:

    • 无有效文件类型检查
    • 无路径限制
    • 导致任意文件上传漏洞

利用条件

  • 无需额外条件,直接可利用

3.2 SQL注入漏洞

漏洞位置:RunSQL方法

漏洞分析

  1. 需要知道数据库名称
  2. 后续直接执行SQL语句,无参数化查询
  3. 导致SQL注入漏洞

Session验证机制分析

  • 检查session中是否存在zuser键值对
  • zuser赋值点只有三处,其中两处为登录后赋值

登录处SQL注入

  1. 密码比对逻辑简单
  2. SQL语句存在明显拼接
  3. 可利用union查询控制返回结果实现任意登录

利用链

  1. 通过SQL注入获取管理员凭证
  2. 使用获取的凭证登录系统
  3. 获取有效session cookie

3.3 SpEL表达式注入漏洞

RCE点分析

  1. 发现存在SpEL表达式解析点
  2. 调用链:
    • 直接获取用户参数进行解析
    • 无任何过滤或限制
  3. 导致SpEL表达式注入漏洞

利用方式

  • 通过构造恶意SpEL表达式实现远程代码执行

3.4 XStream反序列化漏洞(经分析不存在)

初步发现

  1. pom.xml中存在<1.4.18版本的XStream组件
  2. 发现两处fromXML方法调用

深入分析

  1. 调用位于wx控制器中
  2. 内容可控但需要WeiXinUtil.Decrypt可控
  3. 解密依赖三个配置项:
    • weixin_token
    • weixin_EncodingAESKey
    • weixin_appid

配置来源分析

  1. 通过z.sp.get()获取配置
  2. z.sp是Map,来源:
    • 配置文件z.properties
    • z_sp数据表
  3. 数据库表中不存在上述三个键值对
  4. _EncodingAESKey长度不为64时抛出异常

结论

  • 由于必要配置缺失,解密必然失败
  • XStream反序列化漏洞实际不存在

4. 漏洞利用链总结

完整利用路径:

  1. 利用登录处SQL注入获取有效凭证
  2. 通过凭证登录获取有效session
  3. 利用任意文件上传漏洞上传Webshell
  4. 或利用SpEL表达式注入直接执行系统命令

5. 修复建议

  1. 文件上传漏洞

    • 限制上传文件类型
    • 限制上传目录为web根目录外
    • 使用随机文件名
  2. SQL注入

    • 使用参数化查询
    • 使用ORM框架
    • 最小权限原则配置数据库账户
  3. SpEL表达式注入

    • 禁用动态表达式解析
    • 使用Safe Evaluation Context
    • 对用户输入严格过滤
  4. XStream安全

    • 升级至最新版本
    • 配置安全框架
    • 禁用不必要类型
  5. Session管理

    • 增加CSRF防护
    • 使用更复杂的session验证机制

6. 审计经验总结

  1. 重点关注:

    • 全局拦截器配置
    • 白名单机制
    • 用户输入直接用于敏感操作的点
  2. 审计方法:

    • 配置文件优先分析
    • 跟踪敏感方法调用链
    • 验证所有理论漏洞点的实际可利用性
  3. 深度防御:

    • 多层验证机制
    • 最小权限原则
    • 输入输出严格过滤
Java系统安全审计实战教学文档 1. 系统架构概述 审计目标系统采用以下技术架构: Spring MVC框架 WAR包部署方式(非Spring Boot) 使用web.xml配置路由 2. 审计流程与方法 2.1 配置文件分析 首先检查web.xml文件: 确认系统使用Spring MVC的统一路由机制 检查spring.xml配置文件: 重点关注全局拦截器配置: com.futvan.z.framework.core.AllHandlerInterceptor 拦截器配置对所有URL进行拦截: /** 2.2 权限拦截器分析 拦截器分为三类处理逻辑: 第一类 :web包下的请求不拦截 第二类 :httpservices包下状态为1的方法放行 第三类 :不属于上述两类的请求单独处理(重点关注白名单) 3. 漏洞发现与分析 3.1 任意文件上传漏洞 漏洞位置 :upload方法 漏洞分析 : 检查 CreateFileSavePath 方法: 确认文件上传路径是否可控 验证是否可上传到web根目录下 检查 save 方法: 无有效文件类型检查 无路径限制 导致任意文件上传漏洞 利用条件 : 无需额外条件,直接可利用 3.2 SQL注入漏洞 漏洞位置 :RunSQL方法 漏洞分析 : 需要知道数据库名称 后续直接执行SQL语句,无参数化查询 导致SQL注入漏洞 Session验证机制分析 : 检查session中是否存在 zuser 键值对 zuser 赋值点只有三处,其中两处为登录后赋值 登录处SQL注入 : 密码比对逻辑简单 SQL语句存在明显拼接 可利用union查询控制返回结果实现任意登录 利用链 : 通过SQL注入获取管理员凭证 使用获取的凭证登录系统 获取有效session cookie 3.3 SpEL表达式注入漏洞 RCE点分析 : 发现存在SpEL表达式解析点 调用链: 直接获取用户参数进行解析 无任何过滤或限制 导致SpEL表达式注入漏洞 利用方式 : 通过构造恶意SpEL表达式实现远程代码执行 3.4 XStream反序列化漏洞(经分析不存在) 初步发现 : pom.xml中存在 <1.4.18版本的XStream组件 发现两处 fromXML 方法调用 深入分析 : 调用位于wx控制器中 内容可控但需要 WeiXinUtil.Decrypt 可控 解密依赖三个配置项: weixin_token weixin_EncodingAESKey weixin_appid 配置来源分析 : 通过 z.sp.get() 获取配置 z.sp 是Map,来源: 配置文件z.properties z_ sp数据表 数据库表中不存在上述三个键值对 当 _EncodingAESKey 长度不为64时抛出异常 结论 : 由于必要配置缺失,解密必然失败 XStream反序列化漏洞实际不存在 4. 漏洞利用链总结 完整利用路径: 利用登录处SQL注入获取有效凭证 通过凭证登录获取有效session 利用任意文件上传漏洞上传Webshell 或利用SpEL表达式注入直接执行系统命令 5. 修复建议 文件上传漏洞 : 限制上传文件类型 限制上传目录为web根目录外 使用随机文件名 SQL注入 : 使用参数化查询 使用ORM框架 最小权限原则配置数据库账户 SpEL表达式注入 : 禁用动态表达式解析 使用Safe Evaluation Context 对用户输入严格过滤 XStream安全 : 升级至最新版本 配置安全框架 禁用不必要类型 Session管理 : 增加CSRF防护 使用更复杂的session验证机制 6. 审计经验总结 重点关注: 全局拦截器配置 白名单机制 用户输入直接用于敏感操作的点 审计方法: 配置文件优先分析 跟踪敏感方法调用链 验证所有理论漏洞点的实际可利用性 深度防御: 多层验证机制 最小权限原则 输入输出严格过滤