XXE漏洞及防御

一,XML

XML是可扩展标记语言(eXtensible Markup Language)的缩写。它是一种用于标记电子文件结构以便存储、传输和展示数据的标记语言。XML被广泛应用于Web开发、数据交换、配置文件等领域。XML的设计目标是可扩展性、通用性和互操作性。XML文档使用标签来描述数据的结构和含义,类似于HTML,但更加灵活和通用。

与HTML的区别;

HTML的标签是固定的,不可以随意改变;而XML的标签可以自定义;

用途:

  • 用来做配置文件;
  • 在不同系统之间做数据交换(数据通信);

XML格式校验是指对XML文档的结构和语法进行验证,确保其符合XML规范。XML格式校验通常包括以下几个方面:

1. 语法验证:检查XML文档是否符合XML规范的语法,包括标签的闭合、属性值的引号、特殊字符的转义等方面。

2. 结构验证:检查XML文档是否符合指定的文档类型定义(Document Type Definition,DTD)或XML Schema定义的结构规则,确保文档中元素和属性的使用符合规范。

3. 命名空间验证:检查XML文档中命名空间的使用是否正确,避免命名空间冲突或未声明的命名空间。

4. 数据类型验证:对XML文档中的数据类型进行验证,确保数据的格式和类型符合规范,比如日期格式、数字格式等。

XML格式校验可以通过各种XML解析器和验证工具来实现,例如Java中的SAX、DOM解析器,以及XML Schema验证工具等。在实际应用中,XML格式校验有助于确保XML文档的正确性,提高数据交换的准确性和可靠性。

XML的实体

1,XML的内部实体:

XML的内部实体是在XML文档中定义的可重用的实体。内部实体由一个实体声明定义,可以在整个XML文档中引用和重复使用。内部实体通常用于定义重复出现的文本片段、特殊符号或其他数据。

内部实体的定义格式如下:

<!ENTITY entity_name "entity_value">

其中,`entity_name` 是内部实体的名称,`entity_value` 是内部实体的值。在XML文档中引用内部实体时,使用 `&entity_name;` 的形式。

例如,定义一个内部实体 `company`:

<!ENTITY company "ABC Inc.">

然后在XML文档中引用这个内部实体:

<employee>
    <name>John Doe</name>
    <company>&company;</company>
</employee>

在这个例子中,`&company;` 实际上会被替换为 `ABC Inc.`,从而在XML文档中显示为:

<employee>
    <name>John Doe</name>
    <company>ABC Inc.</company>
</employee>

2,XML的外部实体;(XXE出现的原因)

XML的外部实体是在XML文档外部定义的可重用的实体。外部实体通常用于引入外部资源或数据,例如文本文件、图像、样式表等。外部实体可以帮助减少XML文档的大小,提高可维护性和重用性。

外部实体有两种类型:参数实体和通用实体。

1. 参数实体:用于传递参数值到DTD中。

<!ENTITY % entity_name SYSTEM "external_file.dtd">

2. 通用实体:用于引入外部资源到XML文档中。

<!ENTITY entity_name SYSTEM "external_file.xml">

在XML文档中引用外部实体时,使用 `&entity_name;` 的形式。

例如,定义一个外部实体 `external_data` 引入外部 XML 文件:

<!ENTITY external_data SYSTEM "data.xml">

然后在XML文档中引用这个外部实体:

<root>
    &external_data;
</root>

在这个例子中,`&external_data;` 会被替换为外部文件 `data.xml` 中的内容,从而在XML文档中显示为:

<root>
    <!-- Content of data.xml -->
</root>

二,什么是XXE漏洞

XXE(XML External Entity)外部实体的注入漏洞是指在XML处理过程中,攻击者可以利用外部实体来访问本地或远程系统资源的安全漏洞。攻击者可以通过在XML文档中插入恶意实体来触发漏洞,从而执行各种攻击,这种漏洞通常出现在未正确验证用户输入的情况下,导致应用程序解析XML时受到攻击。

XXE的危害:

  • 任意文件读取;
  • 系统命令执行;
  • 内网端口探测;
  • 攻击内网网站;

内部实体;

<?xml version="1.0"?>
<!DOCTYPE note [<!ENTITY xxe "huan 1234567890">]>
<name>&xxe;</name>

外部实体(导致任意文件读取);

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [<!ENTITY xxe SYSTEM "file:///D://1.txt">]>
<login>&xxe;</login>

(在PHP的新版本中,外部实体不会被直接解析)

三,XXE的防御

XXE(XML External Entity)攻击是一种利用XML解析器的漏洞来读取本地文件或执行远程代码的攻击方式。为了防御XXE攻击,可以采取以下措施:

1. 输入验证:对用户输入的XML数据进行严格的验证,过滤掉不必要的实体和外部实体引用。

2. 使用安全的XML解析器:使用安全的XML解析器,并关闭或限制解析器的外部实体加载功能。

3. 沙盒环境:将XML解析器运行在沙盒环境中,限制其访问系统资源的权限。

4. 阻止外部实体引用:禁止XML文档中引用外部实体,可以在解析XML文档时禁用DTD(Document Type Definition)解析或禁用外部实体加载。

5. 使用白名单:只允许特定的实体引用,而不是允许所有的实体引用。

6.过滤某些特定的字符:如<,>,/,[,]......之类的。

阻止外部实体的解析对于不同的编程语言有不同的方法:

对于PHP:

libxml_disable_entity_loader(true);

对于Java:

DocumentBuilderFactory dbf
=DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

对于python:

from lxml import etree
xmlData =
etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕舟舟.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值