XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的
属性可提供有关元素的额外信息
实体是用来定义普通文本的变量。实体引用是对实体的引用
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本
#XML文件声明 DTD为XML文档定义语义约束
<bookstore>
<book category="test"> #属性
<title>XML Studytitle>
<day>2022-08-18day>
book>
bookstore>
DOCTYPE xxe [
<!ELEMENT name ANY >
]>
<root>
<name>&xxe;name>
root>
DOCTYPE foo [
]> //内部实体为 file
<user>
<username>&file;username> //此处应为 &file;
<password>111password>
user>
外部声明(引用外部DTD):
!doctype>
(1)所有的 XML 元素都必须有关闭标签
(2)XML 标签对大小写敏感
(3)XML 属性值必须加引号
(4)XML 必须正确嵌套
(5)XML 标签自定义
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可以在 XML 文档内声明,也可以外部引用
内部声明:
外部声明:
(1)一般实体
(2)参数实体
声明语法:
引用实体的方式:
&实体名;
只能在DTD中使用,参数实体的声明格式:
引用实体的方式:
%实体名
内部实体声明:
]>
DOCTYPE xxe [
]>
<c>&file;c>
XML:
&file;
DTD:
XML:
%a;
]>
&file;
DTD:
(1)读取任意文件
(2)执行系统命令
(3)探测内网端口
(4)攻击内网网站
(1)使用开发语言提供的禁用外部实体的方法
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))
(2)过滤用户提交的 XML 数据