JAVA代码审计-XXOA上传0day挖掘

admin 2026-01-07 02:34:16 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析了XXOA系统代码,发现利用URL包含特定字符可绕过认证过滤器。重点挖掘了一处Servlet未授权文件上传漏洞,代码逻辑在处理文件名时存在缺陷,若文件名以gz-开头则跳过强制重命名为PDF的步骤,导致攻击者可上传恶意JSP文件获取服务器权限。 综合评分: 93 文章分类: 代码审计,漏洞分析,WEB安全,渗透测试


cover_image

JAVA代码审计-XXOA 上传0day挖掘

原创

白昼

白昼安全团队

2026年1月6日 14:48 重庆

系统技术栈

├── Web容器: Apache Tomcat
├── Web框架: Struts2 + Spring MVC
├── 持久层: Hibernate
├── 前端: JSP + jQuery
└── 文件上传: Commons FileUpload + 自定义实现

请求处理流程

HTTP请求
    ↓
过滤器链(Filter Chain)
    ├── SpringSecurityFilterChain
    ├── CharacterEncodingFilter(编码过滤)
    ├── LoginUserInfoFilter(认证过滤)
    ├── OpenSessionInViewFilter(Hibernate)
    └── StrutsPrepareAndExecuteFilter(Struts2)
    ↓
目标Servlet或Action
    ↓
业务处理
    ↓
响应返回

过滤器配置分析

LoginUserInfoFilter拦截所有Action、jsp、html后缀,且存在/Servlet/*路由,所有路径不经过认证过滤器

分析LoginUserInfoFilter doFilter()

判断isDefaultPass()和isUserInfoPass()白名单或者存在用户信息放行

跟入isDefaultPass(),存在passUrlList白名单列表

回到上方isDefaultPass() 遍历所有白名单条目,使用contains进行子串匹配,经过LoginUserInfoFilter的路由存在uplod即可绕过过滤器。

第一处漏洞

扫描发现XXAction.java的upload方法,存在很明显的任意文件上传漏洞

路由分析

struts.xml 里启用 convention-default由 Convention 自动扫描类 + 注解/命名规则生成

Convention 规则:

  • • 类名:HeImplementAction
  • • 去掉后缀 Action → HeImplement
  • • 再做驼峰转连字符小写 HeImplement → he-implement

路由规则为/{contextPath}/Namespace/Convention 约定映射!方法名.action

第二处漏洞分析

发现web.xml中有处上传的Servlet的直接映射,前面分析,所有/servlet/*路由,不经过认证过滤器,相当于未授权,跳转分析对应的Servlet

processUpload()接收mtpId参数,存在分支,有mtpId →processUpload()、无mtpId → doEbenUpload()。

mtpId 分支

mtpId=(空字符串)也会进入该分支(并且被替换成固定默认ID),只有完全不传mtpId参数才会走doEbenUpload。

从数据库读取 TblMetadataTackProperty(元数据附件策略),通过mtpFileUploadType(local/ftp/local2ftp)保存到mtpFileSavePath最终通过 property2dto() 把策略转换成DefaultUploadDto

感觉利用不了,跳过

无 mtpId 分支

请求不带 mtpId 参数,就会进入doEbenUpload()

接收tempAppId和filename参数

上传文件写入固定目录:`/xxFile,对上传文件名查版本表 + 重命名pdf规则

粗看可能觉得重命名后缀就放弃了,后来细看:

以(gz-)前缀作为信任依据,代码只在 “非gz 且无版本” 时强制改 .pdf,但“保持原名”分支不会限制扩展名

if ((versions == null || versions.size() <= 0) && !tempName.startsWith("gz-")) {
&nbsp; &nbsp; filename = tempName.replace(".pdf","").replace(".PDF","") + "_0.pdf";
} else {
&nbsp; &nbsp; // filename 保持为 tempName(即原始文件名)
}
File file = new File(path + "/" + tempName.replace(".doc", "").replace(".pdf", "").replaceAll("_0_0", "_0") + ".txt");

后续无处理,直接上传gz-*.jsp即可落地shell


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:白昼安全团队 白昼《JAVA代码审计-XXOA 上传0day挖掘》

评论:0   参与:  0