java某cms代码审计(二)
字数 1616 2025-08-05 00:15:37
Java CMS代码审计实战分析(二)
1. 系统概述
本次审计的Java CMS系统存在多处安全漏洞,包括任意文件删除、任意文件读取以及备份功能绕过导致的getshell漏洞。系统在SQL注入防护方面较为完善,使用了大量预编译语句,但仍存在一些安全隐患。
2. 登录流程分析
- 登录判断:系统首先判断是登录还是退出操作
- 验证码检查:验证码错误后直接返回,不刷新页面
- 安全检查:
- 检查IP地址
- 检查账号
- 检查密码(进行了HTML解码)
- 用户状态检查:查询数据库检查用户是否被锁定等状态
- 密码验证:验证账号密码是否匹配
- 信息记录:获取访问信息并保存登录信息
安全问题:验证码错误后不刷新,导致可对账号密码进行暴力破解。
3. 管理员功能分析
3.1 添加管理员
- 管理员权限验证
- 获取request内容
- 检查checkedRoleId并转换为String或String[]
- 验证user字段非空
- 执行添加操作
3.2 编辑管理员
流程与添加类似,主要区别在于更新操作而非插入
3.3 删除管理员
安全问题:缺少显式的管理员权限验证(但可能全局做了校验)
3.4 修改密码
- 验证管理员登录状态
- 获取request内容
- 验证两次输入密码一致
- 获取userID
- 根据userID修改密码
安全问题:存在越权修改密码风险,可通过获取其他用户的userID实现任意密码重置。
4. 漏洞分析
4.1 SQL注入尝试(失败)
- 发现点:在Dao文件中发现一处SQL拼接而非预编译
- 调用链:
- 找到调用该Dao的service
- 找到调用该service的控制器
- 问题:
- 参数classID可控
- 但系统有全局过滤,拦截了危险字符(如单引号等)
- 进一步发现classID为long类型,注入不可行
4.2 任意文件下载/读取漏洞
漏洞原理:
- 系统对路径处理不完善
- 虽然对
../和web-inf进行了检查 - 但全局过滤可被绕过(通过特定字符替换规则)
利用方法:
- 构造特殊路径格式绕过过滤
- 实现路径穿越,读取上层目录文件
- 可读取服务器上有权限的任何文件(不限于web目录)
示例:
// 读取上层目录的1.txt
String path = "../1.txt"; // 使用特定替换规则绕过过滤
// 读取D盘文件
String path = "D:/e0m.txt";
4.3 任意文件删除漏洞
漏洞原理:
- 与文件下载类似,路径处理不当
- 未严格限制可操作的文件范围
利用方法:
- 构造恶意路径
- 调用文件删除功能
- 可删除服务器上有权限的任何文件
示例:
// 删除D盘文件
String path = "D:/e0m.txt";
// 调用删除功能后返回302,文件被删除
4.4 系统备份功能getshell
漏洞原理:
- 备份还原时目录校验不严格
- 可进行目录穿越
- 配合上传zip包实现getshell
利用步骤:
- 上传恶意zip包到特定目录(如template目录)
- 备份时修改target路径进行目录穿越
- 系统会在sys_bak下创建备份
- 利用备份文件解析漏洞执行恶意代码
注意事项:
- 数据库文件名需与备份名相同
- 路径规则随环境变化(需根据实际情况调整)
- 需要获取admin密码和文件路径
组合利用:
- 先利用任意文件下载获取网站备份
- 修改备份文件添加恶意代码
- 再利用备份还原功能上传修改后的备份
5. 审计技巧总结
-
SQL注入审计:
- 全局搜索
order by等关键字 - 检查Dao层是否使用预编译
- 注意类型转换处可能存在的漏洞
- 全局搜索
-
文件操作审计:
- 检查所有文件操作功能的路径处理
- 注意全局过滤是否可被绕过
- 测试路径穿越可能性
-
权限审计:
- 检查每个功能是否有显式权限验证
- 注意越权操作可能性
- 测试修改参数(如userID)的影响
-
备份功能审计:
- 检查备份目录限制
- 测试能否通过路径穿越写入非常规位置
- 检查备份文件解析逻辑
-
全局过滤绕过:
- 分析系统过滤规则
- 寻找替代字符或编码方式
- 测试过滤规则的边界情况
6. 修复建议
- 对所有文件操作功能添加严格的路径校验
- 实现验证码错误后刷新机制
- 在修改密码等功能添加CSRF防护
- 对备份功能添加目录白名单限制
- 完善权限验证,避免越权操作
- 对全局过滤规则进行加固,防止绕过