XML 简介
XML
即 可扩展标记语言(EXtensible Markup Language),是一种标记语言,其标签没有预定义,您需要自行定义标签,是W3C
的推荐标准。其于HTML
的区别是:
HTML
被设计用来显示数据XML
被设计用来传输和存储数据
XML作用
数据分离
如果你需要在HTML
文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑HTML
。
通过XML
,数据能够存储在独立的XML
文件中。这样你就可以专注于使用HTML
进行布局和显示,并确保修改底层数据不再需要对HTML
进行任何的改变。
通过使用几行JavaScript
,你就可以读取一个外部XML
文件,然后更新HTML
中的数据内容。
简化数据共享
在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。XML
数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。
这让创建不同应用程序可以共享的数据变得更加容易。
XML
结构
|
|
XML
特性
- 所有 XML 元素都须有关闭标签
- 标签对大小写敏感
- 必须正确地嵌套
- 文档必须有根元素
XML
的属性值须加引号- 实体引用,一些特殊字符(
<>&'"
需要转义) - 注释使用
<!--xxx-->
- 空格会被保留
- 不同系统换行存储不一样(
win
下\r\n
,*inx
下\n
) - 元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素
XSLT
是首选的XML
样式表语言
|
|
XMLHttpRequest
XMLHttpRequest
对象用于在后台与服务器交换数据,XMLHttpRequest
:
- 在不重新加载页面的情况下更新网页
- 在页面已加载后从服务器请求数据
- 在页面已加载后从服务器接收数据
- 在后台向服务器发送数据
DTD
文档类型定义(DTD
)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD
可被成行地声明于 XML 文档中,也可作为一个外部引用。
|
|
PCDATA
(parsed character data)是会被解析器解析的文本。这些文本将被解析器检查实体以及标记
CDATA
(character data)是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
DTD
实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
|
|
XXE Attack
“XML External Entity attack” 即XXE
XML外部实体攻击,举一个简单的例子:
|
|
可以看到,我们的外部实体引用指向了系统passwd
文件,在解析xml时会将敏感信息返回。
XXE利用
XXE读文件
|
|
在外部实体引用是,不同的程序所支持URI协议是不一样的:
和读文件一样,也可进行内网端口扫描,访问不同端口,观察返回信息或者banner内容进行鉴别。
拒绝服务
|
|
这是一个著名的针对XML的billion laughs Dos攻击,其递归构造实体引用,其会产生3G左右的内存数据。
原理是:
构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。
除了这种方式,还可以引用一个外部很大的xml文件,造成Dos攻击,如下:
|
|
有回显情况
|
|
或者:
|
|
simplexml_load_string()
函数,用于转换形式良好的XML
字符串为SimpleXMLElement
对象,然后输出对象的键和元素.是有XXE漏洞的标志性函数。
这种XXE可以和SSRF相结合
blind XEE
没有回显,采用外带数据通道提取数据
|
|
调用过程为:参数实体dtd调用外部实体evil.xml
,然后又调用参数实体all
,接着调用命名实体send
,通过这种方式,将读取的文件通过触发访问的方式传到了所属的evil服务器。
使用php://filter
|
|
|
|
利用其编码解码有时可以绕过一些保护。
执行系统命令
在安装expect
扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令
|
|
Content-Type修改
在目前的web服务当中,很多服务器与客户端都是使用json
格式进行数据交换的,而有些服务器虽然用户提交的是json
或text
格式,但其是可以解析xml
格式内容的,这时候,通过修改HTTP头部Content-Type
字段,有时可以构成XXE攻击。
假设正常通信数据包是这样的:
|
|
可以修改为xml:
|
|
如果服务器相应为:
|
|
这样就能确定很可能存在XXE漏洞,再按外部实体引用的方式去构造即可。
递归引用实体
|
|
编码转换
一些比较低级的黑名单可以通过修改xml编码的方式绕过:
|
|
xml schema 实体攻击
XML Schema
:称为可扩展标记语言架构,用来定义XM文档的合法构建模块,类似 DTD,Schema是DTD的替代者, 它比DTD可以做更多的事情。常见的xml schema attack
分为:
- schemaLocation
- noNamespaceSchemaLocation
- XInclude
- XSLT 攻击
schemaLocation
|
|
noNamespaceSchemaLocation
|
|
XInclude
|
|
其中属性值使用&internal;
的方式可以学习
XSLT Attack
XML Out-Of-Band Data Retrieval,可以通过如下的方式先用document()
获得目标主机的信息,然后使用concat()
将数据与evil主机进行拼接,然后document()
访问拼接后的地址,便可以在evil主机日志上获得信息。
|
|
防御
- 禁用外部实体引用
- 过滤用户提交的XML数据 (
<!DOCTYPE
和<!ENTITY
,或者SYSTEM
和PUBLIC
等字段)
|
|
参考文章:
web-in-security-xxe