JAVA代码审计|记录第一次命令执行漏洞

admin 2026-04-21 02:05:32 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档记录了一次针对闭源JAVA源码的代码审计过程,发现并复现了命令执行漏洞。作者通过分析Spring框架特征,绕过Shiro鉴权缺失问题,在Controller中定位到存在SSTI模板注入的任意文件写入漏洞。通过构造特定payload成功实现JSP文件写入并执行系统命令,验证了RCE漏洞的有效性。 综合评分: 82 文章分类: 代码审计,漏洞分析,实战经验,WEB安全,安全开发


cover_image

JAVA代码审计 | 记录第一次命令执行漏洞

WK安全

2026年4月2日 13:39 江苏

在小说阅读器读本章

去阅读

以下文章来源于进击安全 ,作者学员投稿

进击安全 .

主要分享一些个人实战经验,以及漏洞复现,代码审计,等等方面的文章,欢迎大家关注我的公众号呀,可以投稿哦,有稿费的哦,菜鸟路过~~~

免责申明 本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。

一、前言

    好朋友给了一份闭源的JAVA源码,今天来审计审计,正好检验在小朋友师傅那里学习的如何。

二、框架分析

    在拿到源码之后发现全部为jar包类型的文件,这里靠向Spring方向,进行搜索特征他的路由相关例如:@PostMapping等信息,或者@Controller均可,或者直接搜索Servlet的特征例如:生命周期的方法:service以及doget或者dopost等,逐一排除。

搜索后发现确实是Spring类型的源码,那么开始打开小朋友师傅的课件,审计开始审计这套源码。

三、鉴权分析

    因为当时给到了源码之后已经是3G左右,过于庞大,在寻找鉴权的时候发现部分源码是丢失状态,或者不知道跑哪里去了,只是隐隐约约的知道为shiro鉴权,因为我搜到了它。

然后再去寻找对应的拦截路径相关的鉴权处理并未找到,询问过后发现确实为部分源码丢失造成的,不过这个也好解决,因为我们有网站对应的Controller路由信息,直接AI提取路由跑一下就可以一眼看出来哪些是拦截的哪些不是拦截的。

这个命令不错,可以记下来:

ounter(linefind . -name "*.java" | xargs grep -l "@RequestMapping\|@GetMapping\|@PostMapping\|@PutMapping\|@DeleteMapping\|@PatchMapping" 2>/dev/null | head -100

    (有AI可以提升很大的审计效率,要是按照以前的办法,现在就要自己手搓一些脚本还要各种调试了)

然后就是跑了一圈也没发现存在302等信息,随便从路由当中复制一个Controller都可以访问,那这就好办了,下一步开始审计漏洞。

四、RCE漏洞审计

        最终在某一个Controller当中发现存在一个任意文件写入

首先传递参数为vo类,通过vo类的get方法来获取对应的具体参数名。

在这里可以传递四个参数,分别为template、path、fileName、tempext四个参数。

    并且四个参数分别path决定路径:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line@PostMapping({"/createHtml1"})&nbsp; &nbsp;&nbsp;@ResponseBody&nbsp; &nbsp;&nbsp;@ApiOperation("发布")&nbsp; &nbsp;&nbsp;public&nbsp;JsonResult&nbsp;createHtml1(@RequestBody&nbsp;CreateHtmlVo&nbsp;vo) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;String&nbsp;path =&nbsp;this.configModelService.getFrontPath() +&nbsp;File.separator&nbsp;+&nbsp;"pub"&nbsp;+&nbsp;File.separator&nbsp;+&nbsp;"html"&nbsp;+ vo.getPath();&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Velocity.init();&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;VelocityContext&nbsp;context =&nbsp;new&nbsp;VelocityContext();&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;StringWriter&nbsp;stringWriter =&nbsp;new&nbsp;StringWriter();&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Velocity.evaluate(context, stringWriter,&nbsp;"mystring", vo.getTemplate());&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;File&nbsp;file =&nbsp;new&nbsp;File(path);&nbsp; &nbsp; &nbsp; &nbsp; file.mkdirs();&nbsp; &nbsp; &nbsp; &nbsp; file =&nbsp;new&nbsp;File(path +&nbsp;File.separator&nbsp;+ vo.getFileName() +&nbsp;"."&nbsp;+ vo.getTempext());&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;InputStream&nbsp;inputStream =&nbsp;null;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;try&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputStream =&nbsp;new&nbsp;ByteArrayInputStream(stringWriter.toString().getBytes("UTF-8"));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;catch&nbsp;(UnsupportedEncodingException&nbsp;e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;inputstreamtofile(inputStream, file);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Map<String,&nbsp;String> map =&nbsp;new&nbsp;HashMap();&nbsp; &nbsp; &nbsp; &nbsp; map.put("path",&nbsp;"/pub/html"&nbsp;+ vo.getPath() +&nbsp;"/"&nbsp;+ vo.getFileName() +&nbsp;"."&nbsp;+ vo.getTempext());&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;this.renderSuccess(map);&nbsp; &nbsp; }

其中fileName决定相关文件名但是不包含后缀,后缀通过tempext来决定,之后直接进行写入到文件当中,对传入的参数未作任何过滤,那么我们通过path决定路径,fileName决定文件名称,tempext决定后缀文件类型,那么文件控制如下:

这里其实就是SSTI进行渲染模板的操作,渲染完之后在进行写入,然而渲染的内容就是我们的参数Template,当然这也说明我们不只是可以进行任意文件写入,还可以直接打模板漏洞。

五、漏洞复现

构造一下payload:

{&nbsp;&nbsp;"path":&nbsp;"/../../../upload/headimg",&nbsp;&nbsp;"fileName":&nbsp;"test",&nbsp;&nbsp;"tempext":&nbsp;"jsp",&nbsp;&nbsp;"template":&nbsp;"<%out.println(\"Hello World\");%>"}

成功写入,进行访问。

这里成功进行RCE,同样在这里进行宣传html文件进行模板注入也是可以的,但是RCE我们只需要一个就够了,目的在于学习哈哈哈。


免责声明:

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

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

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

本文转载自:WK安全 《JAVA代码审计 | 记录第一次命令执行漏洞》

OAuth攻击利用 网络安全文章

OAuth攻击利用

文章总结: 本文详细分析了OAuth授权流程中六种高危攻击手法:重定向URI篡改可截获授权码直接盗号;CSRF因state参数缺失导致账号绑定劫持;授权码拦截通
评论:0   参与:  0