一,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))