JAVA反序列话串记
前言
java的反序列化看一些,ysoserial和fastjson以及shiro的,但是笔记没怎么做。这篇文章主要做笔记给自己看,把java反序列化中的链串一下,可能只有我自己能看懂吧😂。当然如果你已经跟完所有的ysoserial代码,这篇文章也可以帮你梳理。
URLDNS
URLDNS链是最简单的,调用链如下:
hashmap#readObject()–>Hashmap#Hash()–>URL#hashcode–>URLStreamHandler#hashcode()–>URLStreamHandler#getHostAddress
核心就是URLStreamHandler#hashcode()可以调用一个dns查询请求,把URLStreamHandler对象装载到URL对象中,再把URL对象放入hashmap的key,就可以触发。
CC1
transformer
Map#put()–>decorate()–>chaintransform#transform()–>后续就是一堆transformer的调用包括:invoketransformer、constant transformer、
如果自动Map#put(), 通过Annotation InvocationHandler的readObject满足。
lazymap
CC链中使用的CC1,通过lazymap get函数进行调用transform。其他和上面一样。
CC6
为了高版本的java反序列化绕过,8u71以上(AnnotationInvocationHandler加入了linkHashmap)
Hashset#readObject()–>Hashmap#put–>Hashmap#hash(key)–>TideMapEntry#hashcode–>this.getvalue()–>回到cc1的lazymap
也就是引入了Hashset和TideMapEntry
重点:outermap.remove(“keykey”), 因为序列化过程中已经hashcode一次了,就不再进入hashcode了,所以要移除。
CC3
结合了TemplateImpl加载字节码技术绕过seckiller,CC3绕过了Invokertransformer的限制,它调用TrAxFilter的构造方法,调用templates#newtransformer() 执行字节码。(InstiateTransformer)
CC4
结合CC3 但是这里用的是common-collection4里面的类,引入了PriorityQueue,最终调用一个comparator的compare来调用chaintransform,后半部分和CC3类似。也是加载字节码。
CB1
把CC4的PriorityQueue变成Beancomparator#compare()来触发Propertyutils#getProperty
PriorityQueue->compare()会调用Propertyutils->getProperty,正好走到TemplatesImpl的加载字节码调用链中。
TemplatesImpl#getOutputProperties()->TemplatesImpl#newtransformers()
fastjson
log4j
服务端安全组 应用安全。
应用安全,组件相关的漏洞上线前的东西。
工具 人工的代码审计。
专项治理。
SDL。
CTF 有专门蓝军。
10点-8点。
部门稳定性怎么样?挺稳定的。
黑白灰 SDL流程。
技术 + 研发能力 。