java某cms代码审计(二)
字数 1362 2025-08-05 00:15:37
Java CMS代码审计实战分析(二)
1. 审计概述
本文是对某Java CMS系统的第二次代码审计分析,重点审计了以下漏洞类型:
- 任意文件删除漏洞
- 任意文件读取漏洞(受限)
- 备份功能绕过getshell漏洞
- 潜在的SQL注入点
2. 系统功能分析
2.1 登录流程分析
- 判断是登录还是退出操作
- 验证码检查(存在缺陷:验证码错误后不刷新,可暴力破解)
- IP、账号、密码检查(密码进行HTML解码)
- 数据库查询验证用户名状态(包括锁定检查)
- 账号密码匹配验证
- 获取访问信息并保存登录状态
2.2 管理员管理功能
-
添加管理员:
- 管理员权限验证
- 获取请求内容
- 检查checkedRoleId并转换类型
- 验证用户字段非空
- 执行添加操作
-
编辑管理员:
与添加流程类似,但发现删除功能缺少管理员权限验证(实际测试发现可能有全局权限校验) -
修改密码:
- 管理员登录验证
- 获取请求内容
- 验证两次密码输入一致
- 获取userID
- 根据userID修改密码
漏洞点:存在越权修改密码风险,可通过获取userID修改任意用户密码
3. 漏洞详细分析
3.1 SQL注入尝试(失败)
审计过程:
- 在Dao层发现直接拼接SQL的代码段
- 追踪调用该Dao的Service
- 分析控制器参数是否可控
- 发现classID参数前端可控
失败原因:
- 系统存在全局过滤器拦截危险字符(如单引号、双引号等)
- 传入的classID实际为long类型,wcond转为String但类型限制已阻止注入
3.2 任意文件下载/读取漏洞
漏洞位置:后台下载功能控制器
限制条件:
- 过滤
../路径遍历 - 禁止访问
WEB-INF目录
绕过方法:
- 利用系统自身的路径替换规则
- 构造特殊路径格式绕过过滤
利用效果:
- 可读取上层目录文件(如
../1.txt) - 可跳出web目录读取系统文件(如
D:/e0m.txt)
关键代码特征:
// 路径检查逻辑
if (path.contains("../") || path.contains("WEB-INF")) {
// 拒绝访问
}
// 但存在可被绕过的路径替换机制
3.3 任意文件删除漏洞
漏洞原理:
- 与文件下载类似,对路径处理不严格
- 可利用路径替换规则实现任意文件删除
利用示例:
- 删除
D:/e0m.txt文件 - 返回302状态码表示操作成功
3.4 系统备份getshell漏洞
漏洞条件:
- 能上传ZIP压缩包(环境问题未测试)
- 备份还原时目录校验不严格
利用步骤:
- 在template目录放置恶意ZIP包
- 备份文件存储在sys_bak目录
- 修改target路径实现目录穿越
- 注意数据库文件需与备份名相同
关键点:
- 获取admin密码和文件路径
- 备份文件名需适配Tomcat版本解析要求
- 可结合任意文件下载实现完整攻击链:
- 备份网站
- 下载备份
- 添加恶意代码
- 还原备份
4. 审计方法论总结
-
入口点选择:
- 优先审计文件操作功能(上传/下载/删除)
- 检查权限验证缺失的功能点
- 搜索直接拼接SQL的代码段
-
过滤机制分析:
- 识别全局过滤规则
- 测试过滤规则的绕过可能性
- 注意类型转换带来的安全影响
-
漏洞链构建:
- 结合多个低危漏洞形成高危利用链
- 如:任意文件读取+备份还原=getshell
-
开发安全建议:
- 统一使用预编译SQL
- 实现严格的路径规范化处理
- 关键操作需多重权限验证
- 备份还原功能应限制目录范围
5. 参考链接
- 公众号详细文章:Java代码审计思路和方法