XXE漏洞基础知识

XXE概述

XXE(XML External Entity Injection)即XML外部实体注入。漏洞是在对非安全的外部实体数据进行处理时引发的安全问题。
下面我们主要介绍PHP语言下的XXE攻击。

文档结构

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


 


  
     
   
   
   
]]]>


Dave
Tom
Reminder
You are a good man

DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

(1)内部的 DOCTYPE 声明

(2)外部文档声明

DTD实体

(1)内部实体声明

(2)外部实体声明

(3)参数实体声明

或者

三种实体声明方式使用区别:
参数实体用%实体名称申明,引用时也用%实体名称;
其余实体直接用实体名称申明,引用时用&实体名称。
参数实体只能在DTD中申明,DTD中引用;
其余实体只能在DTD中申明,可在xml文档中引用。

XXE原理

XXEXML外部实体注入 。我们先分别理解一下注入和外部实体的含义。
注入:是指XML数据在传输过程中被修改,导致服务器执行了修改后的恶意代码,从而达到攻击目的。
外部实体:则是指攻击者通过利用外部实体声明部分来对XML数据进行修改、插入恶意代码。
所以XXE就是指XML数据在传输过程中利用外部实体声明部分的“SYSTEM”关键词导致XML解析器可以从本地文件或者远程URI中读取受保护的数据。

XXE分类

下面我们对XXE进行一下分类,按照构造外部实体声明的方法不同可分为直接通过DTD外部实体声明、通过DTD文档引入外部DTD文档中的外部实体声明和通过DTD外部实体声明引入外部DTD文档中的外部实体声明。按照XXE回显信息不同可分为正常回显XXE报错XXEBlind XXE

按构造外部实体声明

 直接通过DTD外部实体声明


    
]>

&f;

通过DTD文档引入外部DTD文档中的外部实体声明

XML文件内容:


    

&f;

DTD文件内容:

通过DTD外部实体声明引入外部DTD文档中的外部实体声明



]>

&f;

Quan.dtd的外部实体声明内容:

按输出信息

正常回显XXE

正常回显XXE是最传统的XXE攻击,在利用过程中服务器会直接回显信息,可直接完成XXE攻击。

报错XXE

报错XXE是回显XXE攻击的一种特例,它与正常回显XXE的不同在于它在利用过程中服务器回显的是错误信息,可根据错误信息的不同判断是否注入成功。

Blind XXE

当服务器没有回显,我们可以选择使用Blind XXE。与前两种XXE不同之处在于Blind XXE无回显信息,可组合利用file协议来读取文件或http协议和ftp协议来查看日志。
Blind XXE主要使用了DTD约束中的参数实体和内部实体。
在XML基础有提到过参数实体的定义,这里就不再做详细讲解。
参数实体是一种只能在DTD中定义和使用的实体,一般引用时使用%作为前缀。而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。




%remote;
%all;
]>

&send;

Quan.xml内容:

">

%remote引入外部XML文件到这个 XML 中,%all检测到send实体,在 root 节点中引入 send 实体,便可实现数据转发。
利用过程:第3行,存在漏洞的服务器会读出file的内容(c:/1.txt),通过Quan.xml带外通道发送给攻击者服务器上的1.php,1.php做的事情就是把读取的数据保存到本地的1.txt中,完成Blind XXE攻击。

危害

当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

读取任意文件

PHP中可以通过FILE协议、HTTP协议和FTP协议读取文件,还可利用PHP伪协议。


    
]>

&f;

XML在各语言下支持的协议有:

XXE漏洞基础知识_第1张图片

执行系统命令 

 这种情况很少发生,但在配置不当/开发内部应用情况下(PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上),攻击者能够通过XXE执行代码。


    
]>

&f;

探测内网端口

可根据返回信息内容判断该端口是否打开。若测试端口返回“Connection refused”则可以知道该端口是closed的,否则为open。



]>

&Quan;Any bugs?

参考资料:红日安全-Web安全Day8

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