JavaWeb的某管理系统的一次常规审计
字数 1224 2025-08-05 08:19:04

JavaWeb管理系统安全审计教学文档

1. 审计环境配置

本地部署环境要求:

  • 开发工具:IntelliJ IDEA
  • 服务器:Tomcat 8.5.67
  • 数据库:MySQL 5.7.26
  • JDK版本:1.8

CMS技术栈分析:

  • SpringBoot
  • SpringCloud
  • Shiro (安全框架)
  • Thymeleaf (模板引擎)
  • Vue + Element (前端框架)
  • Bootstrap (前端UI框架)

2. 垂直越权漏洞分析

2.1 漏洞位置

admin-system模块中的SysRoleController

2.2 漏洞代码分析

@RequiresPermissions("system:role:edit")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PostMapping("/authUser/selectAll")
@ResponseBody
public AjaxResult selectAuthUserAll(Long roleId, String userIds) {
    return toAjax(roleService.insertAuthUsers(roleId, userIds));
}

2.3 漏洞原理

  1. 虽然使用了@RequiresPermissions注解进行权限校验
  2. 但方法内部未对roleIduserIds进行有效性验证
  3. 攻击者可构造恶意请求修改任意用户的角色权限

2.4 漏洞复现

  1. 构造POST请求到/authUser/selectAll
  2. 携带有效的会话Cookie
  3. 修改roleIduserIds参数为其他用户的ID
  4. 系统返回操作成功,实现垂直越权

3. 文件上传白名单绕过分析

3.1 上传控制器位置

MVC架构中的uploadController

3.2 白名单验证机制

通过FileUploadUtils类进行文件扩展名校验

3.3 白名单定义

// 默认允许的扩展名
private static final String[] DEFAULT_ALLOWED_EXTENSION = {
    // 定义了一系列允许的文件扩展名
};

3.4 绕过思路

  1. 分析白名单具体包含哪些扩展名
  2. 寻找解析差异(如大小写、特殊字符处理)
  3. 检查是否有多重扩展名处理漏洞
  4. 检查是否有文件内容校验漏洞

4. 历史任意文件下载漏洞分析

4.1 漏洞位置

/common/download/resource接口

4.2 漏洞代码

@GetMapping("/common/download/resource")
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) {
    if (!FileUtils.checkAllowDownload(resource)) {
        throw new Exception("资源文件({})非法,不允许下载。", resource);
    }
    String localPath = XXXConfig.getProfile();
    String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
    // 文件下载逻辑...
}

4.3 修复措施

  1. 增加了FileUtils.checkAllowDownload方法进行资源文件校验
  2. 防止目录穿越攻击
  3. 限制了可下载的资源范围

5. JavaWeb代码审计方法论

5.1 审计流程

  1. 环境搭建:完整复现目标系统运行环境
  2. 架构分析:理解系统使用的技术栈和框架
  3. 功能映射:将功能点与代码实现对应起来

5.2 审计技术

  1. 正向数据流分析:从业务功能追踪代码实现
  2. 逆向数据流分析:从已知缺陷模式追踪业务功能
  3. 工具辅助审计:使用代码审计工具发现潜在问题
  4. 关键组件检查:重点审计安全相关组件

5.3 重点关注

  1. 权限校验机制(如Shiro、Spring Security实现)
  2. 文件上传下载功能
  3. 敏感数据操作接口
  4. 框架配置安全性
  5. 输入验证和输出编码

6. 学习建议

  1. 从已知漏洞入手:分析CNVD等平台上的历史漏洞
  2. 对比修复方案:研究官方补丁的修复方式
  3. 实战练习:选择开源CMS进行审计实践
  4. 记录分析笔记:详细记录审计过程和发现

7. 附录:常规审计思路检查表

  1. 认证与授权机制审计
  2. 会话管理安全性
  3. 输入验证与输出编码
  4. 敏感数据保护
  5. 文件操作安全性
  6. 第三方组件安全性
  7. 配置安全性
  8. 日志与监控机制
JavaWeb管理系统安全审计教学文档 1. 审计环境配置 本地部署环境要求: 开发工具:IntelliJ IDEA 服务器:Tomcat 8.5.67 数据库:MySQL 5.7.26 JDK版本:1.8 CMS技术栈分析: SpringBoot SpringCloud Shiro (安全框架) Thymeleaf (模板引擎) Vue + Element (前端框架) Bootstrap (前端UI框架) 2. 垂直越权漏洞分析 2.1 漏洞位置 admin-system 模块中的 SysRoleController 类 2.2 漏洞代码分析 2.3 漏洞原理 虽然使用了 @RequiresPermissions 注解进行权限校验 但方法内部未对 roleId 和 userIds 进行有效性验证 攻击者可构造恶意请求修改任意用户的角色权限 2.4 漏洞复现 构造POST请求到 /authUser/selectAll 携带有效的会话Cookie 修改 roleId 和 userIds 参数为其他用户的ID 系统返回操作成功,实现垂直越权 3. 文件上传白名单绕过分析 3.1 上传控制器位置 MVC架构中的uploadController 3.2 白名单验证机制 通过 FileUploadUtils 类进行文件扩展名校验 3.3 白名单定义 3.4 绕过思路 分析白名单具体包含哪些扩展名 寻找解析差异(如大小写、特殊字符处理) 检查是否有多重扩展名处理漏洞 检查是否有文件内容校验漏洞 4. 历史任意文件下载漏洞分析 4.1 漏洞位置 /common/download/resource 接口 4.2 漏洞代码 4.3 修复措施 增加了 FileUtils.checkAllowDownload 方法进行资源文件校验 防止目录穿越攻击 限制了可下载的资源范围 5. JavaWeb代码审计方法论 5.1 审计流程 环境搭建 :完整复现目标系统运行环境 架构分析 :理解系统使用的技术栈和框架 功能映射 :将功能点与代码实现对应起来 5.2 审计技术 正向数据流分析 :从业务功能追踪代码实现 逆向数据流分析 :从已知缺陷模式追踪业务功能 工具辅助审计 :使用代码审计工具发现潜在问题 关键组件检查 :重点审计安全相关组件 5.3 重点关注 权限校验机制(如Shiro、Spring Security实现) 文件上传下载功能 敏感数据操作接口 框架配置安全性 输入验证和输出编码 6. 学习建议 从已知漏洞入手 :分析CNVD等平台上的历史漏洞 对比修复方案 :研究官方补丁的修复方式 实战练习 :选择开源CMS进行审计实践 记录分析笔记 :详细记录审计过程和发现 7. 附录:常规审计思路检查表 认证与授权机制审计 会话管理安全性 输入验证与输出编码 敏感数据保护 文件操作安全性 第三方组件安全性 配置安全性 日志与监控机制