浅入深出理解XXE漏洞

一、XXE 是什么

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.预定义实体
某些特定符号组成的预定义字符集
浅入深出理解XXE漏洞_第1张图片
实体不仅可以在内部作为变量存储数据,还可以从本地或远程读取数据,也就是所谓的内部实体和外部实。

内部实体声明如下:

 <!ENTITY name "gouzi">
 ……
 <name>&name;name>

外部实体声明如下:


 ]>
<creds>&test;creds>

通过关键字SYSTEM定义一个外部实体 test ,存储的是1.txt内部的内容。

浅入深出理解XXE漏洞_第2张图片
需要注入的是,这里的1.txt, 可以换成协议,接受的协议有:
浅入深出理解XXE漏洞_第3张图片

二、XXE攻击类型

0x01、任意文件读取

Payload

 

]>
<root>
<name>&xxe;name>
root>

浅入深出理解XXE漏洞_第4张图片
**0x02、内网探测主机端口探测
**
比如我们传入:

  
  
]>
<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 来帮我们探测

如下图所示:

浅入深出理解XXE漏洞_第5张图片
**

三、防御方案

使用开发语言提供的禁用外部实体的方法

1.PHP

libxml_disable_entity_loader(true);

2.JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

3.Python:

from lxml import etree

xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

总结

七、总结
对 XXE 漏洞做了一个重新的认识,对其中一些细节问题做了对应的实战测试,重点在于 netdoc 的利用和 jar 协议的利用,这个 jar 协议的使用很神奇,网上的资料也比较少,我测试也花了很长的时间,希望有真实的案例能出现,利用方式还需要各位大师傅们的努力挖掘。

你的知识面,决定着你的攻击面

你可能感兴趣的:(Web安全)