java某cms代码审计(二)
字数 1616 2025-08-05 00:15:37

Java CMS代码审计实战分析(二)

1. 系统概述

本次审计的Java CMS系统存在多处安全漏洞,包括任意文件删除、任意文件读取以及备份功能绕过导致的getshell漏洞。系统在SQL注入防护方面较为完善,使用了大量预编译语句,但仍存在一些安全隐患。

2. 登录流程分析

  1. 登录判断:系统首先判断是登录还是退出操作
  2. 验证码检查:验证码错误后直接返回,不刷新页面
  3. 安全检查
    • 检查IP地址
    • 检查账号
    • 检查密码(进行了HTML解码)
  4. 用户状态检查:查询数据库检查用户是否被锁定等状态
  5. 密码验证:验证账号密码是否匹配
  6. 信息记录:获取访问信息并保存登录信息

安全问题:验证码错误后不刷新,导致可对账号密码进行暴力破解。

3. 管理员功能分析

3.1 添加管理员

  1. 管理员权限验证
  2. 获取request内容
  3. 检查checkedRoleId并转换为String或String[]
  4. 验证user字段非空
  5. 执行添加操作

3.2 编辑管理员

流程与添加类似,主要区别在于更新操作而非插入

3.3 删除管理员

安全问题:缺少显式的管理员权限验证(但可能全局做了校验)

3.4 修改密码

  1. 验证管理员登录状态
  2. 获取request内容
  3. 验证两次输入密码一致
  4. 获取userID
  5. 根据userID修改密码

安全问题:存在越权修改密码风险,可通过获取其他用户的userID实现任意密码重置。

4. 漏洞分析

4.1 SQL注入尝试(失败)

  1. 发现点:在Dao文件中发现一处SQL拼接而非预编译
  2. 调用链
    • 找到调用该Dao的service
    • 找到调用该service的控制器
  3. 问题
    • 参数classID可控
    • 但系统有全局过滤,拦截了危险字符(如单引号等)
    • 进一步发现classID为long类型,注入不可行

4.2 任意文件下载/读取漏洞

漏洞原理

  1. 系统对路径处理不完善
  2. 虽然对../web-inf进行了检查
  3. 但全局过滤可被绕过(通过特定字符替换规则)

利用方法

  1. 构造特殊路径格式绕过过滤
  2. 实现路径穿越,读取上层目录文件
  3. 可读取服务器上有权限的任何文件(不限于web目录)

示例

// 读取上层目录的1.txt
String path = "../1.txt"; // 使用特定替换规则绕过过滤

// 读取D盘文件
String path = "D:/e0m.txt";

4.3 任意文件删除漏洞

漏洞原理

  1. 与文件下载类似,路径处理不当
  2. 未严格限制可操作的文件范围

利用方法

  1. 构造恶意路径
  2. 调用文件删除功能
  3. 可删除服务器上有权限的任何文件

示例

// 删除D盘文件
String path = "D:/e0m.txt";
// 调用删除功能后返回302,文件被删除

4.4 系统备份功能getshell

漏洞原理

  1. 备份还原时目录校验不严格
  2. 可进行目录穿越
  3. 配合上传zip包实现getshell

利用步骤

  1. 上传恶意zip包到特定目录(如template目录)
  2. 备份时修改target路径进行目录穿越
  3. 系统会在sys_bak下创建备份
  4. 利用备份文件解析漏洞执行恶意代码

注意事项

  1. 数据库文件名需与备份名相同
  2. 路径规则随环境变化(需根据实际情况调整)
  3. 需要获取admin密码和文件路径

组合利用

  1. 先利用任意文件下载获取网站备份
  2. 修改备份文件添加恶意代码
  3. 再利用备份还原功能上传修改后的备份

5. 审计技巧总结

  1. SQL注入审计

    • 全局搜索order by等关键字
    • 检查Dao层是否使用预编译
    • 注意类型转换处可能存在的漏洞
  2. 文件操作审计

    • 检查所有文件操作功能的路径处理
    • 注意全局过滤是否可被绕过
    • 测试路径穿越可能性
  3. 权限审计

    • 检查每个功能是否有显式权限验证
    • 注意越权操作可能性
    • 测试修改参数(如userID)的影响
  4. 备份功能审计

    • 检查备份目录限制
    • 测试能否通过路径穿越写入非常规位置
    • 检查备份文件解析逻辑
  5. 全局过滤绕过

    • 分析系统过滤规则
    • 寻找替代字符或编码方式
    • 测试过滤规则的边界情况

6. 修复建议

  1. 对所有文件操作功能添加严格的路径校验
  2. 实现验证码错误后刷新机制
  3. 在修改密码等功能添加CSRF防护
  4. 对备份功能添加目录白名单限制
  5. 完善权限验证,避免越权操作
  6. 对全局过滤规则进行加固,防止绕过
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目录) 示例 : 4.3 任意文件删除漏洞 漏洞原理 : 与文件下载类似,路径处理不当 未严格限制可操作的文件范围 利用方法 : 构造恶意路径 调用文件删除功能 可删除服务器上有权限的任何文件 示例 : 4.4 系统备份功能getshell 漏洞原理 : 备份还原时目录校验不严格 可进行目录穿越 配合上传zip包实现getshell 利用步骤 : 上传恶意zip包到特定目录(如template目录) 备份时修改target路径进行目录穿越 系统会在sys_ bak下创建备份 利用备份文件解析漏洞执行恶意代码 注意事项 : 数据库文件名需与备份名相同 路径规则随环境变化(需根据实际情况调整) 需要获取admin密码和文件路径 组合利用 : 先利用任意文件下载获取网站备份 修改备份文件添加恶意代码 再利用备份还原功能上传修改后的备份 5. 审计技巧总结 SQL注入审计 : 全局搜索 order by 等关键字 检查Dao层是否使用预编译 注意类型转换处可能存在的漏洞 文件操作审计 : 检查所有文件操作功能的路径处理 注意全局过滤是否可被绕过 测试路径穿越可能性 权限审计 : 检查每个功能是否有显式权限验证 注意越权操作可能性 测试修改参数(如userID)的影响 备份功能审计 : 检查备份目录限制 测试能否通过路径穿越写入非常规位置 检查备份文件解析逻辑 全局过滤绕过 : 分析系统过滤规则 寻找替代字符或编码方式 测试过滤规则的边界情况 6. 修复建议 对所有文件操作功能添加严格的路径校验 实现验证码错误后刷新机制 在修改密码等功能添加CSRF防护 对备份功能添加目录白名单限制 完善权限验证,避免越权操作 对全局过滤规则进行加固,防止绕过