XXE(XMLExternalEntityInjection)全称为XML外部实体注入。这是一个注入漏洞,强调利用点是外部实体,将注意力集中于外部实体中,而不要被XML中其他的一些名字相似的东西扰乱了思维,如果能注入外部实体并且成功解析的话,这就会大大拓宽我们XML注入的攻击面。
2.语法XML指可扩展标记语言(EXtensibleMarkupLanguage)XML是一种标记语言,很类似HTMLXML被设计为传输和存储数据,其焦点是数据的内容XML被设计用来结构化、存储以及传输信息XML允许创作者定义自己的标签和自己的文档结构
.结构1.XML文档声明,在文档的第一行2.XML文档类型定义,即DTD,XXE漏洞所在的地方.XML文档元素
4.介绍一下XML文档?xmlversion="1.0"encoding="utf-8"standalone="yes"?!--第一行是XML声明--!--这是XML处理指令的例子。处理指令以?开始,以?结束--!--在?后的第一个单词是处理指令名,在本例中是xml--!--处理指令一定要顶格写,前面不能有任何空白--studentsGREETING!--开始标记--HelloWorld!--元素内容--/GREETING!--结束标记--studentgender="male"isHandsome="true"id/idnamezhangsan/nameaddssBeijing/addsssco50/sco/studentstudentgender="female"id/idnamelisi/nameaddss北京/addsssco/!--为空的简写形式--/student/students
注:文档注释用包围,不允许嵌套,允许多行注释。XML里面的元素严格区分大小写。XML文档必须有且只有一个根元素。(根元素是一个完全包括文档中其他所有元素的元素。)
1、XML文档说明
每一个XML文档都以一个XML声明开始,用以指明所用的XML的版本。
XML声明有version、encoding和standalone特性。
version特性表明这个文档符合XML1.0规范。
encoding属性指定了编码格式,默认情况下是utf-8,这个属性要放在属性前面。
像standalone是XML文档的属性,位于等号左边的是特姓名,而其值位于等号的右边,并用双引号或单引号括起来。
自定义的元素也可以有一个或多个属性,其属性值使用单引号或者双引号括起来。
如果属性值中有双引号则使用单引号,反之亦然。
属性的形式为:
**属性名="属性值",**比如gender="male"。
多个属性值之间用空格隔开(一个或多个空格都可以)。
在一个元素上,相同的属性只能出现一次。
属性值不能包含,,。
2、实体
实体叫ENTITY,实体的作用是避免重复输入。
在XML中,有5个预定义的实体引用
自定义实体语法:
!DOCTYPE根元素!ENTITY实体名"实体内容"]引用已定义的实体:实体名;
、处理指令PI
处理指令用于XML解析器传递信息到应用程序。
语法:
PI必须以一个叫做目标的标识符开头,这个标识符遵从如同元素和属性一样的规则,目标是指令所指向的应用的名称,指令是传递给应用程序的信息。
4、CDATA节
用于把整段文本解释为纯字符数据而不是标记的情况。
包含大量的、、、或者"字符。CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是XML标记。
语法:
![CDATA[......]]
可以输入任意字符(除]]外),不能嵌套。
?xmlversion="1.0"encoding="utf-8"?root![CDATA[helloworld这里放任何内容都是合法的]]subRoot/subRoot/root
5、PCDATA节
PCDATA表示已解析的字符数据。
PCDATA的意思是被解析的字符数据(parsedcharacterdata)。可以把字符数据想象为XML元素的开始标签与结束标签之间的文本。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。但是,被解析的字符数据不应当包含任何字符;需要使用实体来分别替换它们。
5.什么是DTD
DTD是XML文档的一个格式规范
exp:
//这一行是XML文档定义!DOCTYPEmessage[!ELEMENTmessage(ceiver,sender,header,msg)!ELEMENTceiver(#PCDATA)!ELEMENTsender(#PCDATA)!ELEMENTheader(#PCDATA)!ELEMENTmsg(#PCDATA)
!DOCTYPEmessage[#这个就是定义了一个根元素message!ELEMENTmessage(ceiver,sender,header,msg)!ELEMENTceiver(#PCDATA)!ELEMENTsender(#PCDATA)!ELEMENTheader(#PCDATA)!ELEMENTmsg(#PCDATA)#这里就是为根元素message定义了4个子元素,ceiver,sender,header,msg,然后这4个元素必须要出现而且要按照顺序
6.DTD的三种应用形式:
1.内部DTD文档
!DOCTYPE根元素[定义内容]exp:?xmlversion="1.0"encoding="UTF-8"?!DOCTYPEdata[!ELEMENTdata(aaa,bbb,ccc)!ELEMENTaaa(#PCDATA)!ELEMENTbbb(#PCDATA)!ELEMENTccc(#PCDATA)]
2.外部DTD文档
!DOCTYPE根元素SYSTEM"DTD文件路径"exp:外部的DTD文档?xmlversion="1.0"encoding="UTF-8"?!ELEMENTdata(aaa,bbb,ccc)!ELEMENTaaa(#PCDATA)!ELEMENTbbb(#PCDATA)!ELEMENTccc(#PCDATA)
?xmlversion="1.0"encoding="UTF-8"?!DOCTYPEdataSYSTEM"data.dtd"dataaaa1aaabbb2bbbcccccc/data
.内外部DTD文档结合
!DOCTYPE根元素SYSTEM"DTD文件路径"[定义内容]pexp:?xmlversion="1.0"encoding="UTF-8"?!DOCTYPEdataSYSTEM"data.dtd"[?xmlversion="1.0"encoding="UTF-8"?!ELEMENTdata(aaa,bbb,ccc)!ELEMENTaaa(#PCDATA)!ELEMENTbbb(#PCDATA)!ELEMENTccc(#PCDATA)]
7.DTD元素
8.DTD实体
内部实体!ENTITY实体名称"实体的值"一个实体由三部分构成:``符号,一个实体名称,以及一个分号`(;)`exp:!DOCTYPEfoo[!ELEMENTfooANY!ENTITYxxe"hello"]fooxxe;/foo这里定义的实体是xxe,实体的值是hello
外部实体!ENTITY实体名称SYSTEM"URL"
XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以利用如下协议
file:///path/to/file.ext