记一次项目中遇到的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 权限拦截器分析
拦截器分为三类处理逻辑:
- 第一类: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_tokenweixin_EncodingAESKeyweixin_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. 审计经验总结
-
重点关注:
- 全局拦截器配置
- 白名单机制
- 用户输入直接用于敏感操作的点
-
审计方法:
- 配置文件优先分析
- 跟踪敏感方法调用链
- 验证所有理论漏洞点的实际可利用性
-
深度防御:
- 多层验证机制
- 最小权限原则
- 输入输出严格过滤