XML

105 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

一、XML

XML表示可扩展标记语言,与HTML类似,但与HTML的主要区别在于,HTML与数据表示相关,XML更多与数据传输和存储有关 XML是一种可读语言,它应用在很多地方,如API, UI Layout&Style, 安卓应用配置文件以及RSS FEED等等 为了解XML结构,我们先来看一个简单实例

<?xml version="1.0"?> #指定xml原数据,这里的版本号表示XML解析处理时遵循的规范
<Person> #person标签为根元素,符合规则的XML文档必须有且只有一个根元素
<Name>John</Name> #嵌套子元素
<Age>20</Age> #嵌套子元素
</Person>

一个有效的XML文档必须遵循相应语法规则,比如这里的元素标签名对大小写敏感,开闭元素标签必须保持一致,<> ' " 这些是不能出现在xml语言中的,因为XML解析器会搞不清,这种输入到底是数值还是标签,实体entity是一种简单的存储单元,就好比是XML变量一样,可以对它进行赋值,并在XML文档的不同地方对他进行引用,实体1entity在XML文档中的文档类型定义部分(DTD)被单独定义描述,我们通过一个简单示例来了解实体entity的工作机制,

<?xml version="1.0"?>
<!DOCTYPE Person [          #实际上也是告知XML解析器这是一个DTD定义类型
<! ENTITY name "John">     #定一个一个存储单元,这个简单ENTITY名称就为name,
]>                                  
<Person>
   <Name>&name;</Name>
   <Age>20</Age>
   </Person>

实体ENTITY有三种类型,分别是一般实体(General),参数实体(Parameter)和预定义实体(predefined),上面的示例就是通用型实体,这种实体类型会在其他地方发生引用,参数实体有点特殊,他必须定义在单独的DTD区域,这种实体相对灵活,比如用一个ENTITY给另一个ENTITY赋值,

<!ENTITY %  outer "<!ENTITY inner 'John'>"> #这种功能在漏洞利用场景中,外部实体注入(XXE)过程中非常有用

最后`来看一下预定义实体(perdefined),她是某些特殊符号的一组预定义数值集,

<hello>&#x3c;</hello>

如引号和&符号的字符,这种情况下可能会破坏XML文档结构,比如,当你在XML中用小余号当尖括号数值使用时,XML解析器会报错(产生歧义),像尖括号,引号等特殊符号会破坏XML结构,所以可以用十六进制形式的小余号引用表示

<hello>H<llo</hello>
<hello>&#x3c;</hello>

二、XML的安全性

先从实体ENTITY应用说起,前述说过实体entity相当于变量,他可以存储数值以备后续引用,但XML的实体ENTITY应用不仅只是存储,如外部实体(XML External Entity)就是其中之一,实体(Entity)不仅能用来存储指定数值,他还能从本地文件或远程网络中调用相关数据,作为后续实体引用,但这也就形成了一个广泛的攻击面, 我们通过一个示例来了解外部实体工作机制

<?xml version="1.0"?>
<!DOCTYPE XXE [
  <! ENTITY subscribe SYSTEM "secret.txt"> 这里我们有一个名为subscribe的实体,会在后续pwn标签中会被调用,这里的SYSTEM在此意图是让XML解析器知道,该实体是一个外部实体,需要XML解析器获取其中的外部资源并把它存储到内部实体中,如果这里的外部实体像某种标签一样与XML语法类似,呢么XNL解析器就会报错,
  这样的实体赋值并不是secret.txt,其中的内容才是最终XNL获取的东西,实际数值按解析时给定的算,这里也不一定非是文件名,XML在此接受任意有效的URL包括文件,HTTP,FTP和其他协议形式的内容
]>
<pwn>&subscribe;</pwn>