某OA系统的审计(新手学习)
字数 1148 2025-08-06 08:35:06

某OA系统安全审计教学文档

0x01 系统架构分析

  • 系统框架:Struts2 + Spring混合使用
  • 数据库:SQL Server
  • 代码结构:
    • MVC架构
    • DAO目录存放数据库交互代码
    • core/base/dao中存在IBaseDao基类

0x02 SQL注入漏洞分析

数据库操作基类分析

  • IBaseDao类定义了数据库操作基础方法
  • 实现类直接传入SQL语句字符串通过hibernateTemplate API执行查询
  • 存在700多个继承者,大多未重载基类方法

危险方法定位

  1. 全局搜索sqlFind方法
  2. 发现使用?占位符的查询无法注入
  3. 寻找直接拼接参数的SQL语句构造方式

具体漏洞点

  • BaseDataService类中的listBaseDataByFlowId方法:
    String sql = "select * from base_data where flow_id = " + flowId + " and type = " + type;
    return this.sqlFind(sql);
    
  • BaseDataController调用该危险方法

漏洞验证

构造SQL注入payload:

flowId = 1'+(case when (1=1) then '' else char(1/0) end)+'
  • 条件为真时正常返回
  • 条件为假时返回500错误

0x03 权限绕过分析

拦截器配置

  • Spring全局拦截器PermissionInterceptor
  • 白名单定义:
    • UN_LOGIN_EXPOSE_CONTROLLERS:免登录控制器数组
    • UN_LOGIN_EXPOSE_SERVLET_PATH:免登录接口URL数组

JWT硬编码问题

  • 拦截器检查JWT token有效性
  • jwtCheck方法中存在硬编码密钥
  • 可利用硬编码密钥生成有效token绕过认证

0x04 其他发现漏洞

1. 未授权文件上传

  • appCallController中的uploadFile方法未做权限检查
  • 漏洞代码特征:
    @RequestMapping({"uploadFile"})
    @ResponseBody
    public String uploadFile(@RequestParam MultipartFile file) {
        String extension = StringUtils.getFilenameExtension(file.getOriginalFilename());
        String fileUrl = "../xxx_Ueditor_File/app/files/" + id + extension;
        file.transferTo(saveFile);
    }
    
  • 未限制文件后缀,可上传JSP等危险文件

2. 未授权SQL注入(Struts2)

  • Struts2配置文件中定义拦截器
  • 白名单方法中包含数据查询方法
  • 示例漏洞点:
    public String getlistProjAuditDataQGC() {
        String sql = "select * from table where id = " + request.getParameter("id");
        return sqlFindPage(sql);
    }
    

0x05 审计方法论总结

1. SQL注入审计方法

  • DAO层:查找直接执行SQL语句的方法
  • Service层:检查SQL语句构造方式
  • Controller层:定位调用接口

2. 权限绕过审计方法

  1. 检查Spring配置文件定位拦截器
  2. 分析拦截器实现:
    • 白名单定义是否合理
    • 认证机制是否存在缺陷(如JWT硬编码)
  3. 检查Struts2配置中的拦截器规则

3. 文件上传漏洞审计

  1. 查找MultipartFile参数的方法
  2. 检查是否进行:
    • 权限验证
    • 文件类型限制
    • 存储路径安全控制

0x06 修复建议

SQL注入修复

  • 使用预编译语句
  • 统一使用参数化查询
  • 避免直接拼接用户输入到SQL中

权限绕过修复

  • 移除硬编码密钥
  • 使用动态生成的密钥
  • 严格限制白名单范围

文件上传修复

  • 增加权限验证注解
  • 限制可上传文件类型
  • 使用随机文件名+固定后缀
  • 禁止上传可执行文件
某OA系统安全审计教学文档 0x01 系统架构分析 系统框架:Struts2 + Spring混合使用 数据库:SQL Server 代码结构: MVC架构 DAO目录存放数据库交互代码 core/base/dao中存在IBaseDao基类 0x02 SQL注入漏洞分析 数据库操作基类分析 IBaseDao类定义了数据库操作基础方法 实现类直接传入SQL语句字符串通过hibernateTemplate API执行查询 存在700多个继承者,大多未重载基类方法 危险方法定位 全局搜索 sqlFind 方法 发现使用 ? 占位符的查询无法注入 寻找直接拼接参数的SQL语句构造方式 具体漏洞点 BaseDataService 类中的 listBaseDataByFlowId 方法: BaseDataController 调用该危险方法 漏洞验证 构造SQL注入payload: 条件为真时正常返回 条件为假时返回500错误 0x03 权限绕过分析 拦截器配置 Spring全局拦截器 PermissionInterceptor 白名单定义: UN_LOGIN_EXPOSE_CONTROLLERS :免登录控制器数组 UN_LOGIN_EXPOSE_SERVLET_PATH :免登录接口URL数组 JWT硬编码问题 拦截器检查JWT token有效性 jwtCheck 方法中存在硬编码密钥 可利用硬编码密钥生成有效token绕过认证 0x04 其他发现漏洞 1. 未授权文件上传 appCallController 中的 uploadFile 方法未做权限检查 漏洞代码特征: 未限制文件后缀,可上传JSP等危险文件 2. 未授权SQL注入(Struts2) Struts2配置文件中定义拦截器 白名单方法中包含数据查询方法 示例漏洞点: 0x05 审计方法论总结 1. SQL注入审计方法 DAO层:查找直接执行SQL语句的方法 Service层:检查SQL语句构造方式 Controller层:定位调用接口 2. 权限绕过审计方法 检查Spring配置文件定位拦截器 分析拦截器实现: 白名单定义是否合理 认证机制是否存在缺陷(如JWT硬编码) 检查Struts2配置中的拦截器规则 3. 文件上传漏洞审计 查找 MultipartFile 参数的方法 检查是否进行: 权限验证 文件类型限制 存储路径安全控制 0x06 修复建议 SQL注入修复 使用预编译语句 统一使用参数化查询 避免直接拼接用户输入到SQL中 权限绕过修复 移除硬编码密钥 使用动态生成的密钥 严格限制白名单范围 文件上传修复 增加权限验证注解 限制可上传文件类型 使用随机文件名+固定后缀 禁止上传可执行文件