news 2026/6/25 12:07:42

BurpSuite插件开发实战:自动化检测反序列化与越权漏洞

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BurpSuite插件开发实战:自动化检测反序列化与越权漏洞

1. 项目概述:为什么我们需要这样一款插件?

在渗透测试和日常安全审计的实战中,我们常常面临一个效率瓶颈:面对海量的请求包,如何快速、准确地识别出那些潜藏在高风险漏洞下的“暗礁”?手动测试反序列化漏洞,你需要构造复杂的序列化数据,观察应用的各种异常响应;测试越权漏洞,你需要在不同用户角色间反复切换、对比请求,过程繁琐且极易遗漏。这两个问题,一个是代码层面的深度利用,一个是业务逻辑层面的横向突破,都是当前Web安全领域的硬骨头。

我一直在想,能不能把这两块“硬骨头”的自动化检测,集成到我们最熟悉的Burpsuite里?让它像一把瑞士军刀,平时安静地躺在工具链里,一旦需要,就能一键启动,自动扫描、标记、甚至验证潜在的漏洞点。这就是我开发这款“一键自动化检测反序列化与越权漏洞”插件的初衷。它不是一个替代专业扫描器的全能工具,而是一个聚焦于特定高危场景的“渗透利器”,旨在提升安全人员在深度测试环节的效率和精度。

简单来说,这款插件能为你做两件核心的事:第一,在流量经过Burpsuite时,自动识别可能触发反序列化漏洞的端点(如接收Java序列化数据、XMLJSON等格式的接口),并尝试注入无害的探测载荷,根据响应特征(如异常堆栈、延迟、特定错误信息)初步判断风险。第二,基于你已登录的会话(如普通用户),自动尝试构造并发送平行权限的请求(如访问其他用户的资源ID),或尝试垂直越权操作(如普通用户调用管理员API),通过对比响应差异来发现越权漏洞。它的目标用户很明确:有一定Burpsuite使用基础的渗透测试人员、安全开发工程师和红队成员,帮助大家在常规测试之外,进行更深入的、自动化辅助的漏洞挖掘。

2. 插件核心设计与实现思路拆解

2.1 整体架构:如何与Burpsuite无缝集成?

要让插件在Burpsuite里跑起来,核心是遵循其IBurpExtender接口规范。这是所有Burpsuite插件的“入场券”。我的设计思路是创建一个主类实现这个接口,并在registerExtenderCallbacks方法中完成插件的初始化工作,包括设置扩展名、注册各种处理器(IHttpListener,IScannerCheck等)。

整个插件可以划分为三个相对独立但又协同工作的模块:

  1. 流量监听与预处理模块:实现IHttpListener接口,监听所有经过Burpsuite代理的请求和响应。它的任务不是直接检测,而是“筛选”和“标记”。例如,它会分析请求头(如Content-Type: application/x-java-serialized-object)、URL路径(是否包含/api/deserialize等关键词)、参数名(如data,input,obj等),将疑似存在反序列化或敏感操作(如/user/delete,/admin/config)的请求高亮显示在Proxy历史记录中,为后续的主动扫描提供目标。
  2. 主动扫描检测模块:实现IScannerCheck接口,这是插件的“攻击引擎”。当用户在Target站点地图或Proxy历史中右键发起“主动扫描”时,这个模块会被调用。对于反序列化检测,它会生成一系列从无害到逐步危险的探测载荷(如URLDNS、简单的CommonsCollectionsJackson链);对于越权检测,它会基于当前请求的上下文(如Cookie、参数),自动化修改用户ID、角色参数等,并发起新的请求进行比对。
  3. 用户交互与配置界面:通过ITab接口创建一个配置面板。在这里,用户可以启用/禁用特定检测类型、设置黑白名单、调整Payload强度、配置越权检测的ID替换规则(如将userId=123替换为userId=124)以及自定义触发漏洞的响应特征匹配规则(正则表达式)。界面虽不复杂,但提供了足够的灵活性来适应不同的测试环境。

注意:插件设计必须考虑性能和对被测系统的影响。主动扫描模块的Payload发送频率需要可调节,避免对生产环境造成Dos攻击。同时,所有自动修改的请求都应明确标记来源,防止与正常测试流量混淆。

2.2 技术选型:为什么用Java和这些库?

选择Java是必然的,因为Burpsuite本身就是用Java写的,其插件API对Java的支持最原生、最稳定。虽然也有Python(通过Jython)等选择,但涉及到复杂的类操作(尤其是反序列化Payload生成)和性能要求时,纯Java实现能避免很多兼容性和环境依赖的坑。

在核心库的选择上,我主要依赖了以下几个:

  • Burp Extender API:根基,无需多言。
  • ysoserial:反序列化漏洞检测的“弹药库”。我并没有直接打包整个ysoserial,而是借鉴了其生成Payload的核心思路和部分工具类,并进行了大幅精简和改造。重点是生成用于探测的、相对无害的Payload(如URLDNS,用于触发DNS查询以确认漏洞存在),而非直接用于利用的攻击载荷。这既是出于安全合规的考虑,也符合“检测”而非“攻击”的定位。
  • Gson/Jackson:用于处理JSON格式的请求和响应。在检测某些基于JSON的反序列化(如Fastjson,Jackson)时,需要精确地构造和解析JSON结构。
  • Java原生序列化/XML解析库:用于处理Java原生序列化流和XML格式(可能涉及XStream等)的编码与解码。

实操心得:直接引入完整的ysoserial作为依赖会让插件体积庞大,且可能引发误报(因为其Payload攻击性较强)。更好的做法是,提取其中用于生成Serializable对象和计算CRC32等关键功能的代码,自己实现一个轻量化的、专注于“信号触发”的Payload生成器。例如,一个只包含HashMapURL对象的、能触发一次DNS查询的链,是绝佳的探测选择。

3. 核心功能模块深度解析

3.1 反序列化漏洞自动化探测引擎

反序列化漏洞的自动化检测,难点在于“盲测”。你发送一段序列化数据,应用可能成功反序列化但没有任何外在表现,也可能因类路径不符而直接抛出异常,这两种响应看起来很像,但风险等级天差地别。因此,我的探测策略是“基于差异的触发”。

1. 目标识别与指纹采集:插件首先会 passively(被动地)扫描流量。当发现请求的Content-Type包含application/x-java-serialized-objectapplication/json(且参数名可疑)、application/xml,或者URL/参数名中包含readObjectdeserializemarshalunmarshal等关键词时,会将该请求标记为“疑似反序列化端点”。同时,插件会记录该端点对于正常请求的基准响应,包括响应时间、状态码、长度和特定关键词。

2. 多向量Payload注入:在主动扫描阶段,插件会向这些疑似端点发送精心构造的探测Payload。这里采用了分层策略:

探测层级Payload类型目的风险判断依据
Level 1: 无害探针畸形的序列化数据(如截断的字节)、不存在的类名测试端点是否真的在处理反序列化。响应出现ClassNotFoundException,InvalidClassException等Java反序列化特有错误。这强烈暗示存在反序列化功能。
Level 2: 延迟触发包含Sleep或循环计算的简单链(需极度谨慎,时间极短)。尝试造成可观测的响应延迟。响应时间显著超过基准时间(例如,超过2秒)。这能有效区分“处理错误”和“成功执行”。
Level 3: 外部交互触发URLDNS链(ysoserial经典链)。触发一次DNS查询,这是最可靠的“出网”证据。在插件配置的DNS监听平台上(如Burp Collaborator),收到来自目标应用的DNS查询请求。这是高危确证信号。
Level 4: 错误信息触发精心构造的、会调用特定类方法的链(如toString())。尝试在错误信息中泄漏类路径或方法信息。响应中包含更详细的堆栈跟踪信息,暴露内部类名。

3. 响应差异分析:插件不会仅仅因为返回了一个500错误就报漏洞。它会综合比较:

  • 状态码差异:从200变成了500?
  • 响应时间差异:是否出现了异常的延迟?
  • 响应长度差异:长度是否发生了显著变化?
  • 内容关键词匹配:是否出现了java.io,invoke,readObject,com.sun等关键词?
  • 外部交互证据:是否收到了DNS或HTTP回调(通过Burp Collaborator)?

只有当多个指标同时出现异常,特别是出现了外部交互证据特征性的延迟,插件才会在Burpsuite的Scanner结果中标记一个“疑似反序列化漏洞”的中高风险问题,并附上详细的请求响应对比和触发原理说明。

注意事项URLDNS链虽然相对无害,但它仍然会向外部域名发起DNS查询。务必在测试前获得授权,并使用自己可控的Collaborator服务器,避免对第三方造成干扰。对于Level 2的延迟探测,休眠时间必须设置得非常短(如100-300毫秒),并严格控制发送频率,这是职业道德也是避免法律风险的红线。

3.2 越权漏洞自动化检测逻辑

越权漏洞的自动化检测,核心思想是“权限旁路测试”。它需要上下文(一个有效的低权限会话),然后尝试突破这个会话的边界。

1. 会话上下文管理:插件需要能够“记住”当前活跃的会话。通常,这通过监听流量中的CookieAuthorization头等认证信息来实现。用户也可以手动在插件界面指定一个“测试会话”(从Proxy历史中拖拽一个请求即可)。所有后续的越权检测都将基于这个会话的认证凭证进行。

2. 检测模式:

  • 水平越权检测:插件会自动分析请求中的资源标识符参数,如id,userId,docId,fileId等数字或UUID。它会尝试将这些标识符替换为其他可能的值(例如123->124,或通过简单的递增、递减生成)。然后,使用当前会话重新发送请求。关键的一步是响应比对。插件会深度比较原始请求(访问自己资源)和修改后请求(尝试访问他人资源)的响应。
    • 成功响应比对:如果两个响应状态码都是200,且内容高度相似(如仅用户名不同),这可能是正常的。但如果内容完全一致,特别是包含了本应属于其他用户的敏感数据,那就极有可能存在水平越权。插件会计算响应的相似度(如通过哈希或关键词匹配),当相似度超过阈值时报警。
    • 失败响应比对:如果修改ID后返回了403/404,而原请求是200,这通常是安全的。但如果返回了奇怪的错误(如500)或重定向到了登录页,也值得深入分析。
  • 垂直越权检测:这需要一些“知识”。插件内置了一个常见的“高危管理员路径/参数”字典(如包含/admin/,/manage/,role=admin,action=delete的请求)。当发现当前低权限会话的请求命中这些特征时,插件会尝试直接重放该请求。如果低权限用户能成功访问本应需要高权限的接口并获取到数据(返回200且包含数据),则直接报告垂直越权漏洞。更高级的检测还会尝试修改Cookie中的角色字段或添加X-Admin: true之类的头进行试探。

3. 智能参数替换与规避:简单的数字递增很容易被WAF或业务逻辑拦截。插件实现了更智能的替换策略:

  • UUID替换:识别UUID格式的参数,并生成一个新的、格式有效的UUID进行替换。
  • 参数名推断:对于像/api/user/123/profile这样的RESTful风格URL,插件会尝试将路径中的数字123识别为用户ID并进行替换。
  • 批量替换:一个请求中可能有多个ID参数(如authorIdpostId),插件支持同时替换多个参数,以测试更复杂的场景。

实操心得:越权检测最大的挑战是“误报”。不同的用户,其数据视图本来就可能不同。因此,响应比对算法不能太死板。我采用的策略是:首先排除掉明显是模板的部分(如导航栏HTML),然后对核心数据部分(如JSON中的data字段,或HTML中特定<div>的内容)进行提取和对比。同时,结合状态码、响应长度和关键词(如“权限不足”、“Access Denied”)进行综合判断。在插件配置中,允许用户自定义“排除对比的响应部分”的正则表达式,这能大幅提升准确率。

4. 插件实战部署与使用流程

4.1 环境准备与插件加载

首先,你需要一个能运行Burpsuite的环境。推荐使用Burpsuite Professional版,因为社区版对主动扫描等高级API功能有限制。Java环境建议使用JDK 8或11,兼容性最好。

插件的安装非常简单:

  1. 将编译好的插件jar包(例如AutoDeserializeAndIDOR.jar)下载到本地。
  2. 打开Burpsuite,进入Extender标签页。
  3. 点击Add按钮,在弹窗中点击Select file...,选择你的jar包。
  4. 加载成功后,你会在Extender的“Loaded”列表里看到你的插件,同时Burpsuite的顶部菜单栏或标签页区域会出现一个新的标签,那就是插件的配置界面。

如果加载失败,最常见的原因是JDK版本不兼容或依赖冲突。查看Extender标签下的“Errors”输出面板,通常会有详细的错误堆栈信息。确保你的插件是针对与当前Burpsuite匹配的Java版本编译的。

4.2 配置详解与实战扫描

加载插件后,点击其标签页进入配置界面。一个清晰的配置是高效检测的前提。

核心配置项:

  1. 反序列化检测设置

    • 启用检测:总开关。
    • Payload强度:可选择“仅探测”(只发URLDNS和轻微延迟)或“深度检测”(尝试更多链,风险略高)。
    • Collaborator服务器必填项。填入你的Burp Collaborator地址(可以是Burpsuite自带的,也可以是自建的)。这是确认反序列化漏洞能否执行代码(出网)的关键。
    • 延迟时间:设置Level 2探测的休眠时间(单位毫秒),建议100-300。
    • 触发关键词:自定义用于判断漏洞的响应关键词正则表达式,如java\.lang\.reflect\.Method\.invoke
  2. 越权检测设置

    • 启用检测:总开关。
    • 当前测试会话:这里会显示插件自动捕获的最近一个请求的Host和Cookie摘要。你也可以手动从Proxy历史中拖拽一个请求到此区域,将其设为基准会话。
    • ID参数模式:定义识别ID参数的正则表达式,默认包含id,userId,doc等。
    • 管理员路径关键词:定义用于识别管理员接口的正则表达式,如.*/admin/.*,.*manage.*
    • 响应相似度阈值:设置一个百分比(如95%),超过此阈值则认为两个响应内容可能泄露了他人数据。
    • 扫描范围:可选择“仅扫描Scope内目标”或“扫描所有流量”。

实战扫描步骤:

假设我们要测试一个名为vuln-app.com的应用。

  1. 配置浏览器代理,使流量经过Burpsuite。
  2. 正常使用应用:以普通用户userA身份登录,浏览几个页面,如“我的订单”(/orders?userId=1001)、“编辑资料”(/profile/edit)。
  3. 设置测试会话:在Burpsuite的Proxy历史中,找到一个userA登录后的典型请求(如访问首页),右键将其发送到插件界面,或直接在插件界面点击“从Proxy历史捕获当前会话”。
  4. 配置插件:在插件界面,确保vuln-app.com在Scope内,启用反序列化和越权检测,填好Collaborator地址。
  5. 发起主动扫描
    • Target->Site map中,右键点击vuln-app.com,选择“Actively scan this host”
    • 或者,在Proxy->History中,筛选出vuln-app.com的请求,全选后右键“Do an active scan”
  6. 查看结果:扫描开始后,切换到Scanner->Issue activity标签页。插件发现的任何疑似漏洞都会在这里列出,并分类为“反序列化漏洞”或“越权访问漏洞”。点击任意一个发现,可以查看详细的请求、响应对比、以及插件判断的依据。

4.3 结果解读与漏洞验证

插件报告的问题,尤其是“疑似”问题,必须经过手动验证。自动化工具只是辅助,人的判断才是关键。

  • 对于反序列化漏洞报告

    1. 查看报告中的“HTTP请求”,确认发送的Payload是什么(如URLDNS)。
    2. 查看“服务器响应”,是否有异常堆栈?状态码是否是500?
    3. 最关键的是,查看Burpsuite的Collaborator交互记录(在Burp顶部菜单Burp->Collaborator client)。如果在发送Payload的时间点,收到了来自目标服务器的DNS查询,那么这是一个非常坚实的远程代码执行(RCE)证据。你可以尝试使用ysoserial生成一个更确定的命令执行Payload(如执行ping你的Collaborator域名)进行最终验证。

    注意:在生产环境验证时,务必使用无害的命令(如pingsleep),或仅在获得明确授权的测试环境进行。

  • 对于越权漏洞报告

    1. 查看报告,它会并排显示“原始请求”(访问自己资源)和“测试请求”(尝试访问他人资源)。
    2. 仔细对比两个响应。插件会高亮显示它认为相似的部分。你需要人工判断这些相似部分是否确实属于越权访问的数据。例如,订单详情里,订单号、商品信息可能相同,但收货人姓名、电话应该是不同的。如果连这些敏感信息都相同,那就是实锤的水平越权。
    3. 对于垂直越权,报告会显示低权限用户成功访问了高权限接口。你需要手动用低权限账户重放这个请求,确认是否真的能执行管理操作(如删除用户、查看配置)。

5. 常见问题、排查技巧与进阶使用

5.1 插件运行问题排查

问题现象可能原因解决方案
插件加载失败,提示ClassNotFoundExceptionNoClassDefFoundError插件依赖的库(如Gson、改造的ysoserial类)没有被打包进Jar,或Burpsuite环境缺少相关库。使用MavenGradleshade插件,将所有依赖打包成一个“uber jar”。确保编译时包含所有必要依赖。
插件界面不显示或按钮无响应插件实现的ITab接口或Swing组件存在线程安全问题。Burpsuite的UI必须在事件分发线程(EDT)中更新。检查代码中所有更新UI的操作(如设置文本、添加列表项),确保它们被包装在SwingUtilities.invokeLater()中。
主动扫描不触发插件检测1. 未实现IScannerCheck接口或注册不正确。
2. 扫描的请求不在插件的检测范围内(如未包含特定参数)。
3. Burpsuite的扫描队列过滤了插件。
1. 在registerExtenderCallbacks中正确调用callbacks.registerScannerCheck(this)
2. 检查插件配置中的“扫描范围”和Target Scope设置。
3. 在Scanner的“Options”中,确保没有启用过于激进的过滤规则。
Collaborator始终收不到DNS查询1. 目标服务器出网被限制(防火墙策略)。
2. Payload生成或编码错误,导致反序列化失败。
3. Collaborator地址配置错误或网络不通。
1. 尝试使用DNSLog等国内平台替代,或测试内网DNS。
2. 在插件中增加日志,输出生成的Payload字节,与ysoserial原版工具生成的进行对比。
3. 先在浏览器中手动访问Collaborator生成的域名,确认能收到HTTP请求,证明网络可达。
越权检测误报率高响应比对算法过于简单,将不同用户的公共页面内容(如导航栏、页脚)误判为数据泄露。调整插件配置中的“响应相似度阈值”,或添加“排除对比区域”的正则表达式,过滤掉HTML模板中固定的部分(如<header>.*</header>)。

5.2 进阶使用技巧与场景扩展

  1. 与Burpsuite Intruder联动:插件主要做初步筛选和自动化探测。对于插件标记的“疑似越权”请求,你可以右键选择“Send to Intruder”。在Intruder中,使用“Pitchfork”或“Cluster bomb”攻击模式,对多个ID参数进行更复杂、更暴力的组合遍历测试,这是发现“不规律ID”越权漏洞的利器。
  2. 自定义Payload库:对于反序列化检测,你可以根据目标系统使用的组件(如Apache Shiro,Fastjson,Jackson)来扩充插件的Payload库。在插件配置界面,可以添加自定义的、Base64编码后的序列化Payload。例如,针对Shiro的RememberMe反序列化,可以添加相应的AES加密后的Payload。
  3. 会话智能切换:在测试水平越权时,可以配置插件同时管理两个会话:Session A(用户Alice)和Session B(用户Bob)。插件可以尝试用Alice的Cookie去请求Bob的资源ID,再用Bob的Cookie去请求Alice的资源ID,进行双向测试,覆盖更全面的场景。
  4. 针对JSON/XML反序列化的深度检测:除了Java原生序列化,现代应用更多使用JSON或XML。插件可以集成针对Fastjson(利用@type)、Jackson(利用多态类型处理defaultTyping)、XStream(利用缺失类型限制)的特定探测Payload。这些Payload通常是一段特殊的JSON或XML字符串,能触发类加载或方法调用。
  5. 性能调优:在全站扫描时,插件可能会产生大量请求。可以在配置中设置“请求间隔延迟”和“并发线程数”,避免对目标造成过大压力。同时,合理设置Target Scope,只扫描授权范围内的域名和路径。

5.3 开发与调试心得

如果你有兴趣基于这个思路自己开发或修改插件,这里有一些踩过的坑:

  • 日志输出是生命线:Burpsuite提供了callbacks.printOutput()callbacks.printError()来输出信息到Extender的“Output”和“Errors”面板。在关键节点(如开始检测、生成Payload、分析响应时)输出日志,对于调试至关重要。
  • 处理各种编码:请求和响应的Body可能是GZIP压缩的,参数可能是URL编码Base64编码的。插件在处理前必须先进行正确的解码,否则Payload无法正确注入或响应无法正确解析。Burpsuite的IExtensionHelpers类提供了analyzeRequest()analyzeResponse()等强大工具,能帮你轻松获取解码后的内容。
  • 线程安全:Burpsuite的API调用和UI更新可能来自不同线程。确保你的代码是线程安全的,特别是操作共享数据结构(如存储会话信息的Map)时。更新Swing组件一定要在EDT线程中进行。
  • 保持轻量:插件不要做太重的计算或存储大量数据,以免拖慢Burpsuite主程序。对于需要复杂计算的Payload生成,可以考虑延迟加载或缓存。

开发这样一款插件的过程,本身就是一个对反序列化和越权漏洞原理深度理解的过程。它强迫你去思考如何将手动的、经验性的测试步骤,转化为可重复、可判定的自动化逻辑。最终,工具提升的不仅是效率,更是测试的覆盖率和深度。它不会取代安全工程师,但会成为工程师手中一把更加锋利和精准的解剖刀。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 12:07:41

基于OWASP Cheat Sheet构建安全代码审查清单:从漏洞扫描到缺陷预防

1. 项目概述&#xff1a;为什么我们需要一份“作弊”清单&#xff1f;在安全圈里混了十几年&#xff0c;我见过太多因为代码里一个不起眼的疏忽&#xff0c;导致整个系统被攻破的案例。开发团队夜以继日地赶工&#xff0c;功能上线了&#xff0c;性能也优化了&#xff0c;但安全…

作者头像 李华
网站建设 2026/6/25 12:06:47

Embedchain实战指南:分钟级搭建企业级语义检索系统

1. 项目概述&#xff1a;这不是一个“又一个RAG框架”&#xff0c;而是一套开箱即用的语义检索工作流Embedchain 这个名字第一次出现在我视野里&#xff0c;是在帮一家做法律科技的客户做知识库升级时。他们原来的方案是自己搭 LangChain Chroma OpenAI 的组合&#xff0c;但…

作者头像 李华
网站建设 2026/6/25 12:04:32

鸿蒙 ArkTS 实战:Morning Checklist 从状态建模到交互闭环完整解析

鸿蒙 ArkTS 实战&#xff1a;Morning Checklist 从状态建模到交互闭环完整解析 前言 欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net Morning Checklist 是一个面向 家庭生活效率 的鸿蒙 ArkTS 小应用。把起床流程、天气穿搭、待办同步和…

作者头像 李华
网站建设 2026/6/25 12:01:50

AI模型搭建的几个容易忽略的问题

很多人觉得&#xff0c;AI模型搭建就是把预训练模型下载下来&#xff0c;跑通推理就算完成任务。其实不是&#xff0c;从需求梳理&#xff0c;到模型选型&#xff0c;环境准备&#xff0c;微调训练&#xff0c;验证优化&#xff0c;再到部署上线&#xff0c;整个链路都属于AI模…

作者头像 李华
网站建设 2026/6/25 12:00:47

Windows 12网页版:3分钟快速体验完整桌面系统的终极指南

Windows 12网页版&#xff1a;3分钟快速体验完整桌面系统的终极指南 【免费下载链接】win12 Windows 12 网页版&#xff0c;在线体验 点击下面的链接在线体验 项目地址: https://gitcode.com/gh_mirrors/wi/win12 想要零安装体验Windows 12的全新界面吗&#xff1f;Wind…

作者头像 李华
网站建设 2026/6/25 11:57:33

如何用开源脚本实现网盘下载加速:告别限速的终极解决方案

如何用开源脚本实现网盘下载加速&#xff1a;告别限速的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…

作者头像 李华