dubbo协议
header:1
2
3
4
5
6
7
8
90-7位和8-15位:Magic High和Magic Low,类似java字节码文件里的魔数,用来判断是不是dubbo协议的数据包,就是一个固定的数字
16位:Req/Res:请求还是响应标识。
17位:2way:单向还是双向
18位:Event:是否是事件
19-23位:Serialization 编号
24-31位:status状态
32-95位:id编号
96-127位:body数据长度
128-…位:body
body:
1 | 1.dubboVersion |
rpc tcp报文(ascii)1
... .G.2.0.20,com.threedr3am.learn.server.boot.DemoService.1.0.hello0$Lcom/threedr3am/learn/server/boot/A;C0"com.threedr3am.learn.server.boot.A..name`.xxxxH.path0,com.threedr3am.learn.server.boot.DemoService.activelimit_filter_start_time 1577081623564 interface0,com.threedr3am.learn.server.boot.DemoService.version.1.0.timeout.3000Z
rpc tcp报文(hex)
1 | dabb c200 0000 0000 0000 0000 0000 0149 |
hessian2序列化
- 默认dubbo协议+hessian2序列化方式
- 序列化tcp包可随意修改方法参数反序列化的class
- 反序列化时先通过构造方法实例化,然后在反射设置字段值
- 构造方法的选择,只选择花销最小并且只有基本类型传入的构造方法
1 | Constructor[] constructors = cl.getDeclaredConstructors(); |
总结:想要rce,估计得找到以下条件的exp clain
- 有参构造方法
- 参数不包含非基本类型
- cost最小
例外:
- 利用反序列化HashMap,put方法执行时触发hashCode方法,或putVal方法执行时触发equal方法