第一步:审视历史漏洞
泛微前台存在注入漏洞,特别是在 /js/hrm/getdata.jsp 页面上。关键漏洞点在于使用 Java 全局搜索关键字 request.getParameter(),并确保 Java 类中存在 executeSql 方法。
具体漏洞分析可参考这篇博客 https://www.cnblogs.com/0day-li/p/14637680.html。
第二步:流(Stream)分析
针对文件上传功能,关键类或方法往往与流相关。通过搜索关键词“Stream”,使用工具如 Sublime Text,全局搜索 new BufferedInputStream(,共计 285 处,涉及 133 个文件,主要集中在 Java 类中。
下一步是分析这些流的使用,重点关注:
- 获取 /mobilemode/skin 文件夹目录;
- 文件上传参数赋值给变量 i,默认为 0;
- 判断 SQL 查询的 imagefile 的 filerealpath、isaesencrypt、aescode 返回值;
- 将 SQL 查询到的 filerealpath 路径赋值给 str3;
- 创建新的文件实例,将 str3 赋值给 file2;
- 创建新的文件实例,将 /mobilemode/skin 和当前时间加 1L 后创建的文件实例赋值给 file3,如果文件夹不存在则创建(随机文件夹);
- 将 file2 和 file3 的路径加载到 upzip 方法,并创建压缩文件实例进行解压;
- 创建 BufferedOutputStream 和 BufferedInputStream 实例,BufferedOutputStream 实例将读取 file3 并设置根目录,而 BufferedInputStream 实例将通过 zipfile 对象获取流;
- 以 1024 字节为单位读取 BufferedInputStream 并写入 BufferedOutputStream 的流中,即解压文件,并刷新;
- 回到 _import 方法,判断 file3 下的 _.xml、.css 文件和 images 文件夹是否存在;
- 加载 file4 的值(xml 文件)到 readxml 方法进行读取,检查是否具有 id、name、previewImg、isEnabled、order、subCompanyId 的属性,并利用三元表达式进行判断,返回 skin(建议都不为空);
- 判断返回值是否为空并且 id 属性不能为空。
调用链:
通过全局搜索 SkinAction,定位到 classbean/com/weaver/formmodel/mobile/skin/SkinAction.java,在其中的 execute 方法中判断 action 参数等于 import 时,调用 _import 方法,并将 httpServletRequest 对象加载进去。
getAction 方法是通过继承自 MobileAction 并通过 HTTP 请求获取 action 参数的方式得到的。然后通过全局搜索 SkinAction,发现通过 joinActionUrl 方法调用,在第 2 行包含了 <%@ include file=”/mobilemode/init.jsp”%>,根据该方法构造出路径。
路径:
/mobilemode/Action.jspinvoker=com.weaver.formmodel.mobile.skin.SkinAction&action=import
最后,需要确保压缩包下必须存在 _.xml、.css 文件和 images 文件夹,且 xml 文件必须具有 id、name、previewImg、isEnabled、order、subCompanyId 的属性。
路径示例:/mobilemode/Action.jsp?invoker=com.weaver.formmodel.mobile.skin
暂无评论内容