xxe外部实体注入漏洞

XXE原理

攻击者通过干扰应用程序对XML数据的处理,从而实现读取应用程序服务器文件系统中的文件,并与应用程序本身可以访问到的任何后端或外部系统进行交互的一种Web安全漏洞。

在应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成

a:文件读取

b:命令执行

c:内网端口扫描

d:攻击内网网站

e:发起DDos攻击等

在某些情况下,攻击者可以通过利用XXE漏洞执行服务器端请求伪造攻击来升级XXE攻击以危及底层服务器或者其他后端基础架构。

XML介绍

XML(extensible markup language)是用于标记电子文件使其具有结构性的可拓展标记语言,用于存储和传输数据。与HTML一样,XML使用标签和树形结构。与HTML不同,XML不使用预定义标记,因此可以标记指定描述数据的名称。

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。下面是XML语法结构。

 

   
   
   
   
   
]>
 
    Jerry
    Tom
    Reminder
    Don't forget the meeting!

文档类型定义(DTD)

XML文档类型定义(DTD)包含可以定义XML文档结构,它可以包含的数据值类型以及其他项的声明。 DTD在XML文档开头的可选DOCTYPE元素中声明。 DTD可以完全独立于文档本身(称为“内部DTD”),也可以从其他地方加载(称为“外部DTD”),也可以是两者的混合。




XML Entity(在DTD中进行实体声明)

XML实体是在XML文档中表示数据项的一种方法,而不是使用数据本身,可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该变量的值。




XML外部实体是一种自定义实体,其定义位于声明它们的DTD之外。

外部实体的声明使用SYSTEM关键字,并且必须指定应从中加载实体值的URL。 例如:

 ]>

URL可以使用file://协议,因此可以从文件加载外部实体。例如:

 ]>

实体又分为参数实体与一般实体:

  • 一般实体指代的是将来XML数据文档要用到的文本或数据。



&实体名;
  • 参数实体的作用是作为DTD中的元素的条件控制。

参数实体必须定义在单独的DTD文档中或XML文档的DTD区(但是引用只能在单独的DTD文档中,即外部子集,而不能在XML文档的DTD区->内部子集)。



  
     
    %send;
]>

参数实体引用(Parameter Entity Reference),禁止在内部DTD中引用参数实体。



  
    ">
    %start;
    %send;
]>

=> 引用外部的DTD

">
%start;

  
    
    %remote;
    %send;
]>
1234

XXE漏洞检测:

1):检测xml是否被成功解析 

  
                 ]>

2):检测服务器是否支持DTD引用外部实体     

   

 然后查看服务器上的日志判断,查看目标服务器向你的服务器发了一条xml请求。

防御:

a:使用开发者提供的禁用外部实体的方法

from xml import etree
xmlData=etree parse()

b:过滤关键词

参考链接:XML外部实体注入漏洞与利用学习

你可能感兴趣的:(漏洞原理)