当前位置:XML > XML评价

简单XXE漏洞理解以及在实战中演练网络

1.概念

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


转载请注明:http://www.vviuov.com/jbsl/1064034.html

  • 上一篇文章:
  • 下一篇文章: 没有了