标签 - xml

xml xxe    2015-09-17 04:33:29    3628    0    0

前置知识

了解了XML, Entity, DCOTYPE, DTD等这些基础知识

一、xml格式说明

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。


 

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。


内部声明DTD


<!DOCTYPE
 根元素 [元素声明]>


引用外部DTD


<!DOCTYPE
 根元素 SYSTEM "文件名">


或者


<!DOCTYPE
 根元素 PUBLIC "public_ID" "文件名">

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。


内部声明实体


<!ENTITY
 实体名称 "实体的值">


引用外部实体


<!ENTITY
 实体名称 SYSTEM "URI">


或者


<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

 

CDATA

CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,"<" (新元素的开始)和 "&" (字符实体的开始)是非法的。

 

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

 

二、XXE

1、参数实体和内部参数实体

XML的规范定义中,只有在DTD中才能引用参数实体. 参数实体的声明和引用都是以百分号%。并且参数实体的引用在DTD是理解解析的,替换文本将变成DTD的一部分。

参数实体的示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % param1 "<!ENTITY internal 'http://evil.com'>">
%param1;
]>
<root>
<test>[This is my site] &internal;</test>
</root>

参数实体param1中包含内部实体的声明,用于替代<test>标签