车企TSP平台漏洞挖掘

好忙,又水一篇
挺久前的一篇文章,主要是关于车企TSP平台相关漏洞,可以从中看一下车企云平台有哪些特点,容易存在哪些漏洞。
欢迎各位师傅投稿,内容包括但不限于车联网安全相关文章、面经、思考、建议等

(1)通过配置不当的SSO实现宝马和劳斯莱斯的完全账户接管
        在测试宝马资产时,我们确定了一个为宝马员工和承包商定制的SSO门户。这非常有趣,因为这里识别的任何漏洞都可能允许攻击者危及与宝马所有资产相关的任何账户。
    例如,如果经销商想要访问宝马经销商处的经销商门户,他们必须通过此门户进行身份验证。此外,此SSO门户还用于访问内部工具和相关的devops基础设施。
    我们首先使用OSINT工具如gau和ffuf对主机进行指纹识别。经过几个小时的模糊测试,我们发现了一个WADL文件,该文件通过发送以下HTTP请求暴露了主机上的API端点:
   
 GET /rest/api/application.wadl HTTP/1.1 Host: xpita.bmwgroup.com
    HTTP响应包含了xpita主机上所有可用的REST端点。我们开始枚举端点并发送模拟HTTP请求,以查看可用的功能。
车企TSP平台漏洞挖掘
    一个立即的发现是,我们能够通过在用户字段API端点发送星号查询来查询所有宝马用户账户。这允许我们输入类似“sam*”的内容,并检索名为“sam.curry”的用户信息,而无需猜测实际的用户名。
    HTTP Request
GET /rest/api/chains/accounts/unique_account_id/totp HTTP/1.1 Host: xpita.bmwgroup.com

    HTTP Response
HTTP/1.1 200 OK Content-type: text/plain 9373958
    由于某种原因,这个HTTP请求似乎会为用户账户生成一个TOTP(基于时间的一次性密码)。我们猜测这种交互是与“忘记密码”功能一起工作的,所以我们通过使用我们最初的通配符发现查询“example*”,找到了一个示例用户账户并获取了受害者用户ID。在获取这个ID之后,我们为用户账户启动了重置密码尝试,直到系统要求用户提供来自2FA设备(例如电子邮件或电话)的TOTP代码。
车企TSP平台漏洞挖掘
在这一点上,我们从API端点获取了生成的TOTP代码,并将其输入到重置密码确认字段中。
成功了!我们重置了一个用户账户,获得了任何宝马员工和承包商用户的完全账户接管。
车企TSP平台漏洞挖掘
    在这一点上,可以完全接管任何宝马或劳斯莱斯员工账户,并访问这些员工使用的工具。
    为了展示这个漏洞的影响,我们简单地在Google上搜索了“宝马经销商门户”,并使用我们的账户访问了在宝马和劳斯莱斯实体店工作的销售人员使用的经销商门户。
    登录后,我们观察到我们接管的演示账户与一个实际的经销商相关联,我们可以访问经销商自己拥有的所有功能。这包括查询特定VIN号码并检索该车辆的销售文件。
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
    有了我们的访问级别,我们可以对宝马和劳斯莱斯客户账户和客户车辆执行大量功能。我们在这一点上停止了测试,并报告了这个漏洞。向宝马和劳斯莱斯报告的漏洞已经被修复。

(2)通过配置不当的SSO,在梅赛德斯-奔驰和劳斯莱斯上执行远程代码和访问数百个内部工具
    在我们测试的早期阶段,我们团队中有人购买了一辆梅赛德斯-奔驰汽车,所以我们开始审计梅赛德斯-奔驰的基础设施。我们采取了与宝马相同的方法,开始测试梅赛德斯-奔驰员工SSO。
    我们没有找到任何影响SSO门户本身的漏洞,但通过探索SSO网站,我们观察到他们正在为员工账户运行某种形式的LDAP。基于我们对他们基础设施的高级理解,我们猜测单独的员工应用程序使用了一个集中的LDAP系统来验证用户。我们开始探索每个这些网站,试图找到一个公开注册,以便我们可以获得SSO凭据,即使是在有限级别上,访问员工应用程序。
    在随机网站进行了一段时间的模糊测试后,我们最终找到了“umas.mercedes-benz.com”网站,该网站是为汽车修理店从梅赛德斯-奔驰请求特定工具访问而构建的。该网站启用了公开注册,因为它是为修理店构建的,并且似乎写入了与核心员工LDAP系统相同的数据库。
车企TSP平台漏洞挖掘
    我们填写了注册所需的所有字段,创建了一个用户账户,然后使用我们的侦察数据来识别重定向到梅赛德斯-奔驰SSO的网站。我们尝试的第一个是一个相当明显的员工工具,它是“git.mercedes-benz.com”,即Github的简称。我们尝试使用我们的用户凭据登录到梅赛德斯-奔驰的Github,并看到我们能够登录。成功!
    梅赛德斯-奔驰的Github,在认证后,要求我们在我们的账户上设置2FA,以便我们可以访问应用程序。我们安装了2FA应用程序并将其添加到我们的账户中,输入了我们的代码,然后看到我们进去了。我们访问了“git.mercedes-benz.com”,并开始四处查看。
    几分钟后,我们看到Github实例有梅赛德斯-奔驰的各种项目的内部文档和源代码,包括梅赛德斯Me Connect应用程序,该应用程序由客户用于远程连接他们的车辆。内部文档为员工提供了详细的说明,如果他们想为自己构建一个应用程序与客户车辆通信以及与客户车辆通信必须采取的具体步骤。
    在这一点上,我们报告了这个漏洞,但在等待电子邮件回复几天后,我们遇到了一些阻力。团队似乎误解了影响,所以他们要求我们进一步展示影响。
    我们使用员工账户登录到包含敏感信息的众多应用程序,并通过暴露的操作器、Spring Boot控制台和数十个梅赛德斯-奔驰员工使用的敏感内部应用程序实现了远程代码执行。其中一个应用程序是梅赛德斯-奔驰Mattermost(基本上是Slack)。我们有权限加入任何频道,包括安全频道,并且可以冒充一个可以提出任何实际攻击者提升其在奔驰基础设施中权限的问题的梅赛德斯-奔驰员工。
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
    总之,我们可以访问以下服务:
       • 多个包含敏感信息的仅限员工使用的Github,包含梅赛德斯-奔驰基础设施多个应用程序的文档和配置文件
       • 导致远程代码执行、信息披露的Spring Boot操作器,针对敏感员工和面向客户应用程序的Jenkins实例
       • 我们可以请求、管理和访问各种内部系统的AWS和云计算控制面板
       • 用于与客户车辆通信的XENTRY系统
       • 用于配置和管理内部应用程序的内部OAuth和应用程序管理相关功能
       • 数百个杂项内部服务

(3)法拉利的完全账户接管和任意账户创建允许攻击者访问、修改和删除所有客户信息,并访问管理法拉利网站的管理CMS功能
    当我们开始针对法拉利时,我们绘制了所有公开可用的域名,如“ferrari.com”,并浏览了看看有什么是可访问的。我们发现的一个目标是“api.ferrari.com”,这个域名为法拉利系统提供了面向客户和内部的API。我们的目标是尽可能获得这个API的最高级别访问权限。
    我们分析了看起来是供法拉利经销商使用的多个法拉利子域上的JavaScript。这些子域包括cms-dealer.ferrari.com、cms-new.ferrari.com和cms-dealer.test.ferrari.com。
    当我们测试Web应用程序时,我们注意到一个模式是实现不当的单点登录功能,它没有限制对底层应用程序的访问。上述子域的情况就是这样。可以提取这些应用程序的JavaScript,让我们了解后端API路由的使用。
    当逆向工程JavaScript捆绑包时,检查为应用程序定义了哪些常量是很重要的。通常这些常量包含敏感凭据,或者至少,告诉你应用程序与哪个后端API通信。
    对于这个应用程序,我们注意到设置了以下常量:
const i = { production: !0, envName: "production", version: "0.0.0", build: "20221223T162641363Z", name: "ferrari.dws-preowned.backoffice", formattedName: "CMS SPINDOX", feBaseUrl: "https://{{domain}}.ferraridealers.com/", fePreownedBaseUrl: "https://{{domain}}.ferrari.com/", apiUrl: "https://api.ferrari.com/cms/dws/back-office/", apiKey: "REDACTED", s3Bucket: "ferrari-dws-preowned-pro", cdnBaseUrl: "https://cdn.ferrari.com/cms/dws/media/", thronAdvUrl: "https://ferrari-app-gestioneautousate.thron.com/?fromSAML#/ad/" }


    从上述常量我们可以了解到基础API URL是 https://api.ferrari.com/cms/dws/back-office/,以及一个潜在的API密钥是 REDACTED(此处内容被编辑隐藏)。
    进一步挖掘JavaScript,我们可以寻找对apiUrl的引用,这将告诉我们这个API是如何被调用的,以及API密钥是如何被使用的。例如,以下JavaScript在调用API URL时设置了某些头部信息:
})).url.startsWith(x.a.apiUrl) && !["/back-office/dealers", "/back-office/dealer-settings", "/back-office/locales", "/back-office/currencies", "/back-office/dealer-groups"].some(t => !!e.url.match(t)) && (e = (e = e.clone({ headers: e.headers.set("Authorization", "" + (s || void 0)) })).clone({ headers: e.headers.set("x-api-key", "" + a) }))
    这个发现所需的所有要素都方便地藏在了这个JavaScript文件中。我们知道要与之通信的后端API及其路由,以及我们认证API所需的API密钥。
    在JavaScript中,我们注意到有一个API调用到 /cms/dws/back-office/auth/bo-users。通过Burp Suite请求这个API时,它泄露了注册在法拉利经销商应用的所有用户。此外,还可以向这个端点发送POST请求,以将我们自己添加为超级管理员用户。
    虽然影响很大,但我们仍在寻找一个影响更广泛的法拉利生态系统和每个终端用户的漏洞。花更多时间解构JavaScript后,我们发现一些API调用被发送到了 rest-connectors:
return t.prototype.getConnectors = function() { return this.httpClient.get("rest-connectors")}, t.prototype.getConnectorById = function(t) { return this.httpClient.get("rest-connectors/" + t)}, t.prototype.createConnector = function(t) { return this.httpClient.post("rest-connectors", t)}, t.prototype.updateConnector = function(t, e) { return this.httpClient.put("rest-connectors/" + t, e)}, t.prototype.deleteConnector = function(t) { return this.httpClient.delete("rest-connectors/" + t)}, t.prototype.getItems = function() { return this.httpClient.get("rest-connector-models")}, t.prototype.getItemById = function(t) { return this.httpClient.get("rest-connector-models/" + t)}, t.prototype.createItem = function(t) { return this.httpClient.post("rest-connector-models", t)}, t.prototype.updateItem = function(t, e) { return this.httpClient.put("rest-connector-models/" + t, e)}, t.prototype.deleteItem = function(t) { return this.httpClient.delete("rest-connector-models/" + t)}, t
    以下请求解开了谜题的最后部分。发送以下请求揭示了法拉利的大量API凭据:
GET /cms/dws/back-office/rest-connector-models HTTP/1.1
    为了解释这个端点的用途:法拉利配置了一些后端API,可以通过访问特定路径与它们通信。当访问这个API端点时,它返回了这些API端点、主机和授权头部(以明文形式)的列表。
    这种信息披露使我们能够查询法拉利的生产API,以访问任何法拉利客户的个人信息。除了能够查看这些API端点外,我们还可以注册新的rest连接器或修改现有的连接器。
    HTTP请求
GET /core/api/v1/[email protected] HTTP/1.1Host: fcd.services.ferrari.com
    HTTP响应
HTTP/1.1 200 OK Content-type: application/json…"guid":"2d32922a-28c4-483e-8486-7c2222b7b59c","email":"[email protected]","nickName":"[email protected]","firstName":"Ian","lastName":"Carroll","birthdate":"1963-12-11T00:00:00"…
    使用先前的舞台API密钥披露的API密钥和生产端点允许攻击者访问、创建、修改和删除任何生产用户账户。此外,它还允许攻击者通过电子邮件地址或昵称查询用户。
车企TSP平台漏洞挖掘
    此外,攻击者可以向“/core/api/v1/Users/:id/Roles”端点POST请求,以编辑他们的角色,将自己设置为具有超级用户权限或成为法拉利车主。
车企TSP平台漏洞挖掘
    这个漏洞将允许攻击者访问、修改和删除任何法拉利客户账户,并管理他们的车辆配置文件。

(4) Spireon系统上的SQL注入和正则表达式授权绕过允许攻击者访问、跟踪,并向1500万台远程信息系统发送任意命令,此外还可以完全接管警察部门、救护车服务、卡车司机以及许多商业车队系统的车队管理系统

    在确定要黑客攻击的汽车相关目标时,我们发现了Spireon公司。在90年代初和2000年代,有一些像OnStar、Goldstar和FleetLocate这样的公司,它们是独立的设备,被放入车辆中进行跟踪和管理。这些设备具有被跟踪和接收任意命令的能力,例如锁定启动器,使车辆无法启动。
    在过去的某个时候,Spireon收购了许多GPS车辆跟踪和管理公司,并将它们置于Spireon母公司之下。
    我们阅读了Spireon的营销资料,看到他们声称拥有超过1500万辆连接的车辆。他们直接向客户提供服务,并通过像OnStar这样的子公司提供许多服务。
    我们决定研究他们,因为如果攻击者能够破坏这些设备和车队的管理功能,他们将能够对超过1500万辆具有非常有趣功能的车执行操作,例如发送城市警察的派遣地点、禁用车辆启动器和访问经销商的财务贷款信息。
    我们的第一个目标非常明显:admin.spireon.com
    这个网站看起来是一个非常过时的全球管理门户,供Spireon员工进行身份验证并执行某种操作。我们试图识别无需授权即可访问的有趣端点,但总是被重定向回登录。
车企TSP平台漏洞挖掘
    由于网站非常陈旧,我们尝试了可靠的手动SQL注入有效载荷,但被安装在系统上的WAF踢出。
    我们转而使用一个更简单的有效载荷:发送一个单引号,看看是否出现错误,然后发送两个单引号,看看是否没有错误。这奏效了!系统似乎对我们输入的单引号数量是奇数还是偶数做出了反应。这表明我们在用户名和密码字段中的输入被传递到了可能容易受到某种SQL注入攻击的系统中。
    对于用户名字段,我们设计了一个非常简单的有效载荷:
victim' #
    上述有效载荷的目的是简单地从SQL查询中切断密码检查。我们将此HTTP请求发送到Burp Suite的入侵者,使用常见的用户名列表,并观察到我们收到了多个301重定向到”/dashboard”,用于用户名”administrator”和”admin”。
    手动使用管理员用户名发送HTTP请求后,我们观察到我们作为管理员用户被认证进入了Spireon管理员门户。在这一点上,我们浏览了应用程序并看到了许多有趣的端点。
车企TSP平台漏洞挖掘
    该功能旨在远程管理Spireon设备。管理员用户可以访问所有Spireon设备,包括OnStar、    GoldStar和FleetLocate的设备。我们可以查询这些设备并检索设备安装的实时位置,此外还可以向这些设备发送任意命令。还有额外的功能可以覆盖设备配置,包括它向哪些服务器发出请求以下载更新的固件。
车企TSP平台漏洞挖掘
    使用此门户,攻击者可以创建一个恶意的Spireon包,更新车辆配置以调用修改后的包,然后下载并安装修改后的Spireon软件。
    在这一点上,攻击者可以对Spireon设备进行后门操作,并对设备执行任意命令。
    由于这些设备非常普遍,并且安装在像拖拉机、高尔夫球车、警车和救护车等设备上,每个设备的影响各不相同。对于一些设备,我们只能访问设备的实时GPS位置,但对于其他设备,我们可以禁用启动器并发送警察和救护车派遣地点。
    我们立即报告了这个漏洞,但在测试中,我们观察到一个HTTP 500错误,披露了“admin.spireon.com”服务达到的后端API端点的API URL。最初我们忽略了这一点,因为我们假设它是内部的,但后来我们回过头来观察到我们可以击中端点,它会触发一个HTTP 403禁止错误。
车企TSP平台漏洞挖掘
    现在我们的目标是看看我们是否可以在主机上找到某种授权绕过以及可以访问的端点。通过绕过管理员UI,我们可以直接联系每个设备,并通过后端API调用来直接查询车辆和用户账户。
    我们对主机进行了模糊测试,最终观察到了一些奇怪的行为:
    通过发送任何包含”admin”或”dashboard”的字符串,系统会触发HTTP 403禁止响应,但如果我们不包含这个字符串,会返回404。例如,如果我们尝试加载 “/anything-admin-anything”,我们会收到403禁止,而如果我们尝试加载 “/anything-anything”,它会返回404。
    我们将黑名单字符串放入列表中,然后尝试使用模糊字符(%00至%FF)在第一个和最后一个字符后面枚举特定端点。
    在扫描过程中,我们发现以下HTTP请求将返回200 OK响应:
GET /%0dadmin GET /%0ddashboard
    通过Burp Suite,我们将HTTP响应发送到我们的浏览器,并观察到响应:它是Spireon应用程序的核心管理门户。我们迅速设置了一个匹配和替换规则,将GET /admin和GET /dashboard修改为带有%0d前缀的端点。
    设置此规则后,我们可以浏览到”/admin”或”/dashboard”并探索网站,而无需执行任何其他步骤。我们观察到有十几个端点用于查询所有连接的车辆,向连接的车辆发送任意命令,并查看所有客户租户账户、车队账户和客户账户。我们拥有一切访问权限。
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
    在这一点上,恶意行为者可以对1500万台设备设置后门,查询与特定VIN号相关联的所有权信息,检索所有客户账户的完整用户信息,并邀请自己管理连接到应用的任何车队。
    为了我们的概念验证,我们随机邀请自己加入一个车队账户,发现我们收到了一个邀请,成为美国警察部门的管理员,我们可以跟踪整个警察车队。
车企TSP平台漏洞挖掘

(5) Reviver上的批量分配允许攻击者远程跟踪并重写所有Reviver客户的虚拟车牌,跟踪和管理Reviver车队,并访问、修改和删除所有用户信息
    2022年10月,加利福尼亚州宣布已将数字车牌合法化。我们对此进行了一段时间的研究,发现大多数,如果不是全部的数字车牌,都是通过一家名为Reviver的公司完成的。
车企TSP平台漏洞挖掘
    如果有人想要一个数字车牌,他们会购买包括SIM卡的虚拟Reviver车牌,用于远程跟踪和更新车牌。使用Reviver的客户可以远程更新他们的车牌口号、背景,并且还可以报告如果汽车被盗,通过将车牌标签设置为”STOLEN”。
车企TSP平台漏洞挖掘
    由于车牌可以用来跟踪车辆,我们对Reviver非常感兴趣,并开始审计移动应用程序。我们代理了HTTP流量,发现所有的API功能都是在”pr-api.rplate.com”网站上完成的。在创建用户账户后,我们的用户账户被分配给了一个独特的”公司”JSON对象,允许我们向我们的账户添加其他子用户。
    这个公司JSON对象非常有趣,因为我们可以更新对象中的许多JSON字段。其中之一叫做”type”,默认设置为”CONSUMER”。注意到这一点后,我们翻阅了应用程序的源代码,希望我们能找到另一个值来设置它,但未成功。
    在这一点上,我们退后一步,想知道是否有一个实际的网站我们可以与之交流,而不是通过移动应用程序代理流量。我们在网上寻找了一会儿,然后想到执行我们账户的重置密码,这给了我们一个URL导航。
    一旦我们打开了密码重置URL,我们观察到网站有很多功能,包括管理车辆、车队和用户账户的能力。这非常有趣,因为现在我们有更多的API端点和功能可以访问。此外,网站上的JavaScript似乎有我们用户账户可以是的其他角色的名称(例如,用户、版主、管理员等的专用名称)。
    我们在JavaScript中查询了”CONSUMER”字符串,发现在JavaScript中定义了其他角色。在尝试将我们的”role”参数更新为公开的”CORPORATE”角色后,我们刷新了我们的配置文件元数据,然后发现成功了!我们能够将我们的角色更改为除默认用户账户之外的其他角色,为潜在的权限提升漏洞打开了大门。
    尽管我们已经将我们的账户更新为”CORPORATE”角色,但在登录网站时我们仍然遇到授权漏洞。我们想了一会儿,直到意识到我们可以邀请用户加入我们修改后的账户,该账户具有提升的角色,这可能会授予被邀请用户所需的权限,因为他们是通过预期的方式邀请的,而不是批量分配账户到提升的角色。
    在邀请一个新账户,接受邀请并登录账户后,我们观察到我们不再收到授权错误,并且可以访问车队管理功能。这意味着我们可以(1)批量将我们的账户分配给更高提升的角色(例如管理员),然后(2)邀请一个用户到我们的账户,该用户将被分配适当的权限。
    这让我们感到困惑,因为系统中可能存在我们尚未确定的某个管理组。我们使用单词列表暴力破解”type”参数,直到我们注意到将我们的组设置为数字”4″已将我们的角色更新为”REVIVER_ROLE”。看来角色是按数字索引的,我们可以简单地遍历0-100的数字,找到网站上的所有角色。
    “0”角色是字符串”REVIVER”,设置在我们的账户上并重新邀请一个新用户后,我们正常登录到网站,并观察到UI完全破裂,我们无法点击任何按钮。据我们猜测,我们有管理员角色,但是使用的是面向客户的前端网站访问账户,而不是适当的管理员前端网站。我们必须自己找到管理员使用的端点。
    由于我们的管理员账户理论上有提升的权限,我们的第一次测试只是查询一个用户账户,看看我们是否可以访问别人的数据:这奏效了!
    我们可以采取任何正常的API调用(查看车辆位置、更新车辆车牌、向账户添加新用户)并使用我们的超级管理员账户执行操作,具有完全授权。
    在这一点上,我们报告了这个漏洞,并观察到它在24小时内就被修补了。一个实际的攻击者可以远程更新、跟踪或删除任何人的REVIVER车牌。我们还可以访问任何经销商(例如,梅赛德斯-奔驰经销商经常会打包REVIVER车牌),并更新当新购买的车辆仍然有经销商标签时使用的默认图像。
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
Reviver网站还提供了我们完全访问权限的车队管理功能。

(6) 影响现代和捷尼赛思的完全远程车辆访问和完全账户接管
这个漏洞在Twitter上有详细描述,可以通过以下链接访问:
我们最近发现了一个影响现代和捷尼赛思车辆的漏洞,我们可以远程控制2012年以后制造的车辆的锁、发动机、喇叭、前灯和行李箱。
为了解释它是如何工作的以及我们是如何发现它的,我们有@_specters_作为我们的模拟汽车小偷:[图片链接:pic.twitter.com/WWyY6vFoAF]
— Sam Curry (@samwcyo) 2022年11月29日
(7) 影响本田、日产、英菲尼迪、讴歌的完全远程车辆访问和完全账户接管
这个漏洞在Twitter上有详细描述,可以通过以下链接访问:
更多的汽车黑客攻击!
今年早些时候,我们能够完全未授权地远程解锁、启动、定位、闪烁和鸣响任何远程连接的本田、日产、英菲尼迪和讴歌车辆,只知道汽车的VIN号码。
以下是我们如何发现它以及它的工作原理:[图片链接 pic.twitter.com/ul3A4sT47k]
— Sam Curry (@samwcyo) 2022年11月30日
(8) 通过批量分配对日产的完全车辆接管
这个漏洞在Twitter上有详细描述,可以通过以下链接访问:
大家早上好,我觉得我们需要更多的汽车黑客攻击。所以我们发现了另一个让我们对每一个互联网连接的日产和英菲尼迪执行远程命令的漏洞。漏洞已经被修复。
shout out to @samwcyo @bbuerhaus @sshell_ @d0nutptr @xEHLE_ @iangcarroll @sshell_ @infosec_au pic.twitter.com/5TbC9G1Oxk
— ꙅɿɘƚɔɘqꙅ (@_specters_) November 30, 2022

原文地址:https://samcurry.net/web-hackers-vs-the-auto-industry#8-full-vehicle-takeover-on-nissan-via-mass-assignment
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘
车企TSP平台漏洞挖掘

原文始发于微信公众号(安全脉脉):车企TSP平台漏洞挖掘

版权声明:admin 发表于 2024年8月8日 下午7:03。
转载请注明:车企TSP平台漏洞挖掘 | CTF导航

相关文章