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

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

1. 审计概述

本文是对某Java CMS系统的第二次代码审计分析,重点审计了以下漏洞类型:

  • 任意文件删除漏洞
  • 任意文件读取漏洞(受限)
  • 备份功能绕过getshell漏洞
  • 潜在的SQL注入点

2. 系统功能分析

2.1 登录流程分析

  1. 判断是登录还是退出操作
  2. 验证码检查(存在缺陷:验证码错误后不刷新,可暴力破解)
  3. IP、账号、密码检查(密码进行HTML解码)
  4. 数据库查询验证用户名状态(包括锁定检查)
  5. 账号密码匹配验证
  6. 获取访问信息并保存登录状态

2.2 管理员管理功能

  • 添加管理员

    1. 管理员权限验证
    2. 获取请求内容
    3. 检查checkedRoleId并转换类型
    4. 验证用户字段非空
    5. 执行添加操作
  • 编辑管理员
    与添加流程类似,但发现删除功能缺少管理员权限验证(实际测试发现可能有全局权限校验)

  • 修改密码

    1. 管理员登录验证
    2. 获取请求内容
    3. 验证两次密码输入一致
    4. 获取userID
    5. 根据userID修改密码
      漏洞点:存在越权修改密码风险,可通过获取userID修改任意用户密码

3. 漏洞详细分析

3.1 SQL注入尝试(失败)

审计过程

  1. 在Dao层发现直接拼接SQL的代码段
  2. 追踪调用该Dao的Service
  3. 分析控制器参数是否可控
  4. 发现classID参数前端可控

失败原因

  • 系统存在全局过滤器拦截危险字符(如单引号、双引号等)
  • 传入的classID实际为long类型,wcond转为String但类型限制已阻止注入

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

漏洞位置:后台下载功能控制器

限制条件

  • 过滤../路径遍历
  • 禁止访问WEB-INF目录

绕过方法

  1. 利用系统自身的路径替换规则
  2. 构造特殊路径格式绕过过滤

利用效果

  • 可读取上层目录文件(如../1.txt
  • 可跳出web目录读取系统文件(如D:/e0m.txt

关键代码特征

// 路径检查逻辑
if (path.contains("../") || path.contains("WEB-INF")) {
    // 拒绝访问
}
// 但存在可被绕过的路径替换机制

3.3 任意文件删除漏洞

漏洞原理

  • 与文件下载类似,对路径处理不严格
  • 可利用路径替换规则实现任意文件删除

利用示例

  • 删除D:/e0m.txt文件
  • 返回302状态码表示操作成功

3.4 系统备份getshell漏洞

漏洞条件

  1. 能上传ZIP压缩包(环境问题未测试)
  2. 备份还原时目录校验不严格

利用步骤

  1. 在template目录放置恶意ZIP包
  2. 备份文件存储在sys_bak目录
  3. 修改target路径实现目录穿越
  4. 注意数据库文件需与备份名相同

关键点

  • 获取admin密码和文件路径
  • 备份文件名需适配Tomcat版本解析要求
  • 可结合任意文件下载实现完整攻击链:
    1. 备份网站
    2. 下载备份
    3. 添加恶意代码
    4. 还原备份

4. 审计方法论总结

  1. 入口点选择

    • 优先审计文件操作功能(上传/下载/删除)
    • 检查权限验证缺失的功能点
    • 搜索直接拼接SQL的代码段
  2. 过滤机制分析

    • 识别全局过滤规则
    • 测试过滤规则的绕过可能性
    • 注意类型转换带来的安全影响
  3. 漏洞链构建

    • 结合多个低危漏洞形成高危利用链
    • 如:任意文件读取+备份还原=getshell
  4. 开发安全建议

    • 统一使用预编译SQL
    • 实现严格的路径规范化处理
    • 关键操作需多重权限验证
    • 备份还原功能应限制目录范围

5. 参考链接

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 ) 关键代码特征 : 3.3 任意文件删除漏洞 漏洞原理 : 与文件下载类似,对路径处理不严格 可利用路径替换规则实现任意文件删除 利用示例 : 删除 D:/e0m.txt 文件 返回302状态码表示操作成功 3.4 系统备份getshell漏洞 漏洞条件 : 能上传ZIP压缩包(环境问题未测试) 备份还原时目录校验不严格 利用步骤 : 在template目录放置恶意ZIP包 备份文件存储在sys_ bak目录 修改target路径实现目录穿越 注意数据库文件需与备份名相同 关键点 : 获取admin密码和文件路径 备份文件名需适配Tomcat版本解析要求 可结合任意文件下载实现完整攻击链: 备份网站 下载备份 添加恶意代码 还原备份 4. 审计方法论总结 入口点选择 : 优先审计文件操作功能(上传/下载/删除) 检查权限验证缺失的功能点 搜索直接拼接SQL的代码段 过滤机制分析 : 识别全局过滤规则 测试过滤规则的绕过可能性 注意类型转换带来的安全影响 漏洞链构建 : 结合多个低危漏洞形成高危利用链 如:任意文件读取+备份还原=getshell 开发安全建议 : 统一使用预编译SQL 实现严格的路径规范化处理 关键操作需多重权限验证 备份还原功能应限制目录范围 5. 参考链接 公众号详细文章: Java代码审计思路和方法