java反序列化实题目
lab1-basic:
1 | import java.io.ObjectInputStream; |
很简单 反射一下修改属性即可 ,这里本地进行序列化和反序列化来测试场景
1 | import java.io.FileInputStream; |
lab2-ysoserial:
1 | import com.yxxx.javasec.deserialize.Utils; |
pom.xml中存在cc3.2.1的依赖 ,加上题目提示,不难想到要利用ysoserial并且需要在序列化里面设置1896和SJTU
使用cc6
- Jdk 8u71
- Comoons-Collections 3.2.1
1 | public class cc6 { |
lab3-shiro-jrmp
第三题多了MyObjectInputStream, 其使用了classLoader.loadClass()
而非默认的Class.forName()
去加载类
1 | import java.io.IOException; |
两者主要的不同点在于不能够加载数组,比如:
1 | Class.forName("[[B"); // class [[B |
JRMP简介
就是让服务端反序列化一个JRMPClient,向我们恶意的Registry发送请求,触发二次反序列化 ,其主要意义是绕过黑名单的限制或不出网利用 ,这也算是用上了rmi的基础
payload:
1 | import sun.rmi.server.UnicastRef; |
创建了一个远程对象Registry的代理
看了yso,只是看了,没调,配置项目又要报错,而且不是特别新的只是了,只是来学一下基础
lab4-shiro-blindjava
题目一样但是设置了不出网
1 | version: '2.4' |
用二次反序列化绕过java
java.security.SignedObject 的构造方法中存在序列化 操作 , 并将字节数组存储到content中 , SignedObject#getObject下也完美的实现了将上面赋值的content反序列化操作
1 | KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA"); |
然后调用它的getObject()
方法 ,触发readobject
例如:
1 | import org.apache.commons.collections.Transformer; |
就是代替了原本我自己模仿服务器写的readobject,找不到谁调用getObject,所以找调用getter的,我想到了fastjson,但是这题没有这个依赖,就想到了用cc的一个transform触发 getreadobject
1 | package CC; |
但是getobject不太行,payload没问题lab2可以打通
网上二次反序列化用的是findRMIServerJRMP
这里还会把base64转回array,所以cc6部分要转成base64
看到这里有个猜想,是不是因为这个传输过程中转为base64了所以才算真正绕过‘不能够加载数组’的限制
触发点是RMIConnector.connect,思路和刚才一样,transform来触发connect就可以
贴一下别人写的payload:
1 | package CC; |
lab5-weblogic-readResolvejava
增加了黑名单
那我们就用不了transform方法了。。。然后就没思路了
答案是用了题目给的 MarshalledObject 进行二次序列化,
不知道为什么我写的就是打不通
后来写到九明白了,MarshalledObject应该设置为和原题一样的包名,得自己建一个
1 | com.yxxx.javasec |
不然会找不到对应类
改正后:
1 | package com.yxxx.javasec;//这里 |
lab6-weblogic-resolveProxyClass
题目和lab3相似但是限制了动态代理
1 | public class MyObjectInputStream extends ObjectInputStream { |
payload.JRMPClient不需要动态代理一样可以进行攻击,代码如下所示java
Proxy类其中的InvocationHandler对象是RemoteObjectInvocationHandler,而默认反序列化Proxy就会去反序列化其中的InvocationHandler字段,也就是反序列化RemoteObjectInvocationHandler字段,然后同样会走到触发攻击的地方
payload出自:https://ameuu.github.io/2022/07/22/JavaDeserializeLabs/
1 | package serializable.exp6; |
lab7-weblogic-UnicastRef
相比lab6,增加了黑名单:
1 | static { |
并且Dockerfile 中,对javax.management.BadAttributeValueExpException 进行了序列化过滤
之前的payload需要利用RemoteObjectInvocationHandler,进行远程连接
lab8里面是lab6
lab9-proxy
题目自己写了一个 MyInvocationHandler:
1 | public class MyInvocationHandler implements InvocationHandler, Serializable { |
没有 commons-collection3.2.1 依赖了,想到cc2利用TemplatesImpl,但是cc2里的comparator,需要commons-collection3.2.1 依赖,利用给的MyInvocationHandler,进行绕过
payload:
1 | package serializable.exp9; |
要在new priorityQueue() 之后再用 MyInvocationHandler 配合 proxy写一个 comparator
看了宫崎骏的电影《你想成为怎么样的人》(我没带如日本的背景,而是赋予他我认为的意义)
主角真一进入了一个异世界,开始了寻找夏子的路,最后回到了现实世界,舅公想把搭建世界的石头传给真一,因为真一懂石头是罪恶的,(石子最开始是纯洁的,可是粘上了利益就不再纯洁了)可真一拒绝了,说“我也有罪恶”,(我也会这么选的,比起令人敬仰的权利,我更喜欢自由的风,和被温暖又挚烈的阳光簇拥)
真一从片头开始就是心思很重的感觉,因为他失去了母亲,对夏子“后妈”一直保持距离,不排斥可是也不接受,后来真一在异世界的产房里理解了夏子,最后接受了夏子,我认为这也是接受了现实
总结:我想成为怎么样的人?
有自己的生活,享受自由