XML External Entity Injection 外部实体注入,该漏洞发生在应用程序解析XML输入时,
没有禁止外部实体的加载,导致可加载任意外部文件,造成文件读取、命令执行(有点极端)、内网端口扫描、攻击内网网站、发起dos攻击等危害。
什么是xml
一种标记语言,被设计用来传输和存储数据(html是用来显示数据):
<person>
<name>johnname>
person>
第一行是xml文档的说明,在很多时候可以不写,其中是根元素标签,
这里注意,xml不像html一样标签都是固定的,这里可以根据需求自己定义(区分大小写),
name是子元素标签,注意标签是成对存在
所以也就造成了在xml文档中不能存在< > " '等容易影响xml解析器解析的内容。
为了解决这种状况,引入实体的概念。
实体是用于定义引用普通文本或特殊字符的快捷方式的变量,其不仅能用来存储指定数值,还可以从本地文件或者远程文件中调用相关数据作为后续实体引用
实体就类似与变量,不仅可以对其赋值,也能在文档的各个地方进行引用,实体在xml文档中的DTD部分被定义,如下
// 定义个实体 name 值为gozi
] >
<person>
<name>&name;name> //<name>gouziname>
person>
DTD的作用是定义该xml文档包含哪些模块,这些模块包含了哪些内容:
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Georgeto>
<from>Johnfrom>
<heading>Reminderheading>
<body>Don't forget the meeting!body>
note>
由于其中的实体部分可以加载外部实体等操作,所以在可以控制xml的地方就容易造成xxe漏洞。
实体分为三种:
1.一般实体
<!ENTITY name "gouzi">
……
<name>&name;name>
2.参数实体
<!ENTITY % data " % name 'gouzi'>">
%data; //<!ENTITY % name 'gouzi'>">
只能在DTD引用,引用方式为%实体名;,可以使用参数实体引用其他实体
3.预定义实体
某些特定符号组成的预定义字符集
实体不仅可以在内部作为变量存储数据,还可以从本地或远程读取数据,也就是所谓的内部实体和外部实。
内部实体声明如下:
<!ENTITY name "gouzi">
……
<name>&name;name>
外部实体声明如下:
]>
<creds>&test;creds>
通过关键字SYSTEM定义一个外部实体 test ,存储的是1.txt内部的内容。
需要注入的是,这里的1.txt, 可以换成协议,接受的协议有:
Payload
]>
<root>
<name>&xxe;name>
root>
]>
<data>4data>
返回结果:
**javax.xml.bind.UnmarshalException
- with linked exception:
[Exception [EclipseLink-25004] (Eclipse Persistence Services): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred unmarshalling the document
Internal Exception: ████████████████████████: Connection refused**
这样就完成了一次端口探测。如果想更多,我们可以将请求的端口作为 参数 然后利用 bp 的 intruder 来帮我们探测
如下图所示:
使用开发语言提供的禁用外部实体的方法
libxml_disable_entity_loader(true);
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
七、总结
对 XXE 漏洞做了一个重新的认识,对其中一些细节问题做了对应的实战测试,重点在于 netdoc 的利用和 jar 协议的利用,这个 jar 协议的使用很神奇,网上的资料也比较少,我测试也花了很长的时间,希望有真实的案例能出现,利用方式还需要各位大师傅们的努力挖掘。
你的知识面,决定着你的攻击面