目录
-
XML及DTD介绍
-
简介
XML指可扩展标记语言(EXtensible Markup Lanuage),设计用来进行数据的传输和存储。
XML是一种标记语言,很类似HTML
XML的设计宗旨是传输数据,而非显示数据
XML标签没有被定义。需要自行定义标签
XML被设计为具有自我描述性
XML是W3C的推荐标准
XML是不作为的
XML仅仅是纯文本
XML可以发明自己的标签
XML是对HTML的补充
XML是W3C的推荐标准
<?xml version="1.0" encoding="UTF-8"?> //xml声明
<!DOCTYPE message> //DTD文档类型定义
<!ELEMENT message (receiver,sender,header,msg)> //定义元素
<reset>
<login>&aaa;</login>
<secret>Any bugs?</secret>
</reset> //文档元素
-
DTD
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行的声明于XML文档中,也可作为一个外部引用。
- 内部声明DTD:<!DOCTYPE 根元素[元素声明]>
- 引用外部DTD:<!DOCTYPE 根元素 SYSTEM "文件名">
- 内外部DTD文档结合:<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
DTD中的一些重要的关键字:
DOCTYPE(DTD的声明)
ENTITY(实体的声明)
SYSTEM、PUBLIC(外部资源申请)
-
PCDATA
PCDATA的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为XML元素的开始标签与结束标签之间的文本,PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记,文本中的标签会被当做标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何&、< 或者 > 字符;需要使用&、< 以及 > 实体来分别替换它们。
-
CDATA
CDATA的意思是字符数据(character data)。
CDATA是不会被解析器解析的文本。在这些文本中的标签不会被当做标记来对待,其中的实体也不会被展开。
-
实体
实体是对数据引用;根据实体种类的不同,XML解析器使用实体的替代文本或者外部文档的内容来替代实体引用,它主要分为以下四类:
- 内置实体(Built-in entities)
- 字符实体(Character entities)
- 通用实体(General entities)
- 参数实体(Parameter entities)
参数实体用%实体名称申明,引用时也用%实体名称;
其余实体直接用实体名称申明,引用使用&实体名称;
参数实体只能在DTD中申明,DTD中引用;
其余实体只能在DTD中申明,可在xml文档中引用。
注意:参数实体是在DTD中被引用的,而其余实体是在xml文档中被引用的,另外定义时注意%后面跟空格。
-
内部实体声明
<!ENTITY 实体名称 "实体的值">
一个实体由三部分构成:&符号,实体名称,分号(;),这里&不论在GET还是在POST中都需要进行URL编码,因为是使用参数传入xml的,&符号会被认为是参数间的连接符号。示例:
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "Thinking">
]>
<foo>&xxe;</foo>
外部实体声明
XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,由SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借用各种协议,比如以下三种:
file:///path/to/file.ext
http://url
php://filter/read=convert.base64-encode/resource=conf.php
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM “URI/URL”>
]>
<foo>&xxe;</foo>
外部实体可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议。
参数实体格式
<!ENTITY % 实体名称 “实体的值”>或<!ENTITY % 实体名称 SYSTEM “URI”>
-
XXE漏洞介绍
XXE也叫XML(可扩展标记语言)外部实体注入,然后我们这里拆开来解释:
注入:
在XML数据传输过程中,数据被恶意修改,导致服务器最终执行了修改后的恶意代码。
外部实体:
通过调用外部实体声明部分对XML数据进行修改、插入恶意代码。
因此XXE指的是XML数据在传输过程中,利用外部实体声明部分的"SYSTEM"关键字导致XML解析器可以从本地文件或者远程的URL中读取受保护的数据。
-
挖掘技巧及修复
-
挖掘方式
- 判断数据类型
- 判断自定义XML是否被解析
- 判断是否支持外部实体,尽量使用自己的VPS判断,避免遇到的不是不会显得XXE
-
漏洞利用
- 读取敏感信息/文件
- 内网探测
-
漏洞修复
- 使用开发语言提供的禁用外部实体的方法
- 过滤用户提交的XML数据
- 不允许XML中含有任何自定义声明的DTD
- 最简单、粗暴、有效、直接的修复方式就是禁用DOCTYPE
标签:XML,外部,实体,笔记,DTD,文档,引用,XXE 来源: https://blog.csdn.net/m0_47599604/article/details/115251399
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。