xxe漏洞的学习与利用总结

VSole2021-11-04 06:37:22

前言

对于xxe漏洞的认识一直都不是很清楚,而在我为期不长的挖洞生涯中也没有遇到过,所以就想着总结一下,撰写此文以作为记录,加深自己对xxe漏洞的认识。

xml基础知识

要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。

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

xml文档的构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

下面是每个构建模块的简要描述。

1,元素

元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。

实例:

<body>body text in between</body><message>some message in between</message>

空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。

2,属性

属性可提供有关元素的额外信息

实例:

<img src="computer.gif" />

3,实体

实体是用来定义普通文本的变量。实体引用是对实体的引用。

4,PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

5,CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。

DTD(文档类型定义)

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可以在 XML 文档内声明,也可以外部引用。

1,内部声明:ex: <!DOCTYOE test any>

完整实例:

<?xml version="1.0"?><!DOCTYPE note [  <!ELEMENT note (to,from,heading,body)>  <!ELEMENT to      (#PCDATA)>  <!ELEMENT from    (#PCDATA)>  <!ELEMENT heading (#PCDATA)>  <!ELEMENT body    (#PCDATA)>]><note>  <to>George</to>  <from>John</from>  <heading>Reminder</heading>  <body>Don't forget the meeting!</body></note>

2,外部声明(引用外部DTD): 

ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>

完整实例:

<?xml version="1.0"?><!DOCTYPE note SYSTEM "note.dtd"><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note> 

而note.dtd的内容为:

<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>

DTD实体

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


实体又分为一般实体和参数实体

1,一般实体的声明语法:

引用实体的方式:&实体名;

2,参数实体只能在DTD中使用,参数实体的声明格式:

引用实体的方式:%实体名;


1,内部实体声明: ex:<!ENTITY eviltest "eviltest">

完整实例:

<?xml version="1.0"?><!DOCTYPE test [<!ENTITY writer "Bill Gates"><!ENTITY copyright "Copyright W3School.com.cn">]>
<test>&writer;&copyright;</test>

2,外部实体声明:

完整实例:

<?xml version="1.0"?><!DOCTYPE test [<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"><!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">]><author>&writer;&copyright;</author>

在了解了基础知识后,下面开始了解xml外部实体注入引发的问题。

XXE的攻击与危害(XML External Entity)

1,何为XXE?

答:xxe也就是xml外部实体注入。也就是上文中加粗的那一部分。

2,怎样构建外部实体注入?

方式一:直接通过DTD外部实体声明

XML内容


方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明

XML内容:

DTD文件内容:

方式三:通过DTD外部实体声明引入外部实体声明

好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明

具体看例子,XML内容

dtd文件内容:

3,支持的协议有哪些?

不同程序支持的协议如下图:

其中php支持的协议会更多一些,但需要一定的扩展支持。

4,产生哪些危害?

XXE危害1:读取任意文件

该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

另外,数据不回显就没有问题了吗?如下图,

不,可以把数据发送到远程服务器,

远程evil.dtd文件内容如下:

触发XXE攻击后,服务器会把文件内容发送到攻击者网站

XXE危害2:执行系统命令

该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

XXE危害3:探测内网端口

该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

XXE危害4:攻击内网网站

该CASE是攻击内网struts2网站,远程执行系统命令。

如何防御xxe攻击

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

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

方案二、过滤用户提交的XML数据

关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

最后

通过本次对XXE的总结,认真了解了XML基础知识,XXE的攻击方式与及防御方案。

xml语言xml解析
本作品采用《CC 协议》,转载必须注明作者和本文链接
XXE如何理解? 它是可扩展标记语言 ( XML) 用于存储和传输数据。 通常始于异步JavaScript和XML技术(ajax技术):网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面。 目前JSON的使用比XML更加普遍JSON和XML都被用于在Ajax模型中的XML技术
Web Service渗透测试总结
2017 OWASP十大关键Web应用安全风险简析 受越来越短的软件项目生命周期影响,有些应用面临损及金融、医疗、零售业和其他行业数字安全的风险。开发人员和经理必须了解这些最常见的风险,才能保护自己的应用。为此,开放网页应用安全计划(OWASP)定期发布十大最关键Web应用安全风险。 该计划从专精应用安全的公司企业收集40多份数据,数据涵盖数百家公司处收集的漏洞信息,涉及10万个应用和API。 O
浅析xml之xinclude & xslt
2022-05-19 08:17:00
最近依旧在研究xml及其相关安全问题,前一篇文章已经提及了较为大众且CTF中常见的xml攻击方式。
近日,国家信息安全漏洞库(CNNVD)收到关于微信支付SDK XXE(XML External Entity)漏洞(CNNVD-201807-083)情况的报送。成功利用该漏洞的攻击者可以远程读取服务器文件,获取商户服务器上的隐私数据,甚至可以支付任意金额购买商品。
XML外部实体注入
2022-07-28 22:32:56
0x01:简单了解XMLXML 指可扩展标记语言XML的特点及作用:特点:1. xml与操作系统、编程语言的开发平台都无关
但是,在处理外部实体时,可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。//这一行是 XML 文档定义
--第一行是XML声明-->. --这是XML处理指令的例子。后的第一个单词是处理指令名,在本例中是xml-->. --处理指令一定要顶格写,前面不能有任何空白-->. XML文档必须有且只有一个根元素。version特性表明这个文档符合XML 1.0规范。0x02:实体实体叫ENTITY,实体的作用是避免重复输入。0x03:处理指令PI处理指令用于XML解析器传递信息到应用程序。这些文本将被解析器检查实体以及标记。
禁用XXE处理漫谈
2023-03-13 10:52:32
近期准备面试题时,XXE漏洞防范措施(或者说修复方式)在一些文章中比较简略
VSole
网络安全专家