文章总结: 本文分析了XXOA系统代码,发现利用URL包含特定字符可绕过认证过滤器。重点挖掘了一处Servlet未授权文件上传漏洞,代码逻辑在处理文件名时存在缺陷,若文件名以gz-开头则跳过强制重命名为PDF的步骤,导致攻击者可上传恶意JSP文件获取服务器权限。 综合评分: 93 文章分类: 代码审计,漏洞分析,WEB安全,渗透测试
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-")) {
filename = tempName.replace(".pdf","").replace(".PDF","") + "_0.pdf";
} else {
// filename 保持为 tempName(即原始文件名)
}
File file = new File(path + "/" + tempName.replace(".doc", "").replace(".pdf", "").replaceAll("_0_0", "_0") + ".txt");
后续无处理,直接上传gz-*.jsp即可落地shell
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:白昼安全团队 白昼《JAVA代码审计-XXOA 上传0day挖掘》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论