xxe漏洞原理与防御

xxe漏洞原理与防御xml基础知识要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。另外php版本大于5.4.45的默认不解析外部实体XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素为什么使用DTD?通过DTD,您的每一个X…

大家好,又见面了,我是你们的朋友全栈君。

xml基础知识

要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。另外php版本大于5.4.45的默认不解析外部实体

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

xxe漏洞原理与防御

为什么使用 DTD?

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

您还可以使用 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,内部声明:<!DOCTYPE 根元素 [元素声明]> 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):<!DOCTYPE 根元素 SYSTEM “文件名”> 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,一般实体的声明语法:<!ENTITY 实体名 “实体内容“>
引用实体的方式:&实体名
2,参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 “实体内容“>
引用实体的方式:%实体名

1,内部实体声明:<!ENTITY 实体名称 “实体的值”> ex:<!ENTITY eviltest "eviltest">

  注意和DTD中的元素声明区别<!ENTITY 声明元素>
完整实例:

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

<test>&writer;&copyright;</test>

2,外部实体声明:<!ENTITY 实体名称 SYSTEM “URI”>
完整实例:

<?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内容
xxe漏洞原理与防御

方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
XML内容:
xxe漏洞原理与防御
DTD文件内容:
xxe漏洞原理与防御

方式三:通过DTD外部实体声明引入外部实体声明
好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明
具体看例子,XML内容
xxe漏洞原理与防御

dtd文件内容:
xxe漏洞原理与防御

3,支持的协议有哪些?
不同程序支持的协议如下图:
xxe漏洞原理与防御

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

xxe漏洞原理与防御

4,产生哪些危害?

XXE危害1:读取任意文件
xxe漏洞原理与防御

xxe漏洞原理与防御

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

另外,数据不回显就没有问题了吗?如下图,
xxe漏洞原理与防御

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

xxe漏洞原理与防御

远程evil.dtd文件内容如下:
xxe漏洞原理与防御

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

xxe漏洞原理与防御

XXE危害2:执行系统命令
xxe漏洞原理与防御

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

XXE危害3:探测内网端口

xxe漏洞原理与防御

xxe漏洞原理与防御

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

XXE危害4:攻击内网网站

xxe漏洞原理与防御

xxe漏洞原理与防御

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

如何防御xxe攻击

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

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))

方案二、过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142395.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 联想服务器查raid型号,联想服务器所配备常见SAS RAID卡规格汇总

    联想服务器查raid型号,联想服务器所配备常见SAS RAID卡规格汇总故障现象 联想服务器已有万全 ThinkServer Systemx 及 ThinkSystem 四条产品线和十余代产品 各代产品所配备的 SASRAID 卡互有交叉 这里对采用 LSI Avago 芯片的 SASRAID 卡进行一个资料整理 原因分析 LSI 的阵列卡有以下几种工作模式 MR MegaRAID 模式 使用 RoC 芯片硬件实现 RAID 功能 常见的带缓存的阵列卡工作在此模式 如 ServeRAID

    2025年12月6日
    7
  • Facebook时序预测工具Prophet实战分析

    Facebook时序预测工具Prophet实战分析引言去年Facebook开源了一套时序预测工具叫做Prophet。Prophet是一个预测时间序列数据的模型。它基于一个自加性模型,用来拟合年、周、季节以及假期等非线性趋势。它在至少有一年历史数据的日常周期性数据,效果最好。Prophet对缺失值,趋势的转变和大量的异常值是有极强的鲁棒性。Prophet中文翻译是:“先知”。名字还是挺贴切的。在看完本篇文章后,你将会知道:

    2022年6月29日
    30
  • 三种方式实现网页二级菜单

    三种方式实现网页二级菜单方法一:使用HTML和CSS实现 首先是Html代码,习惯上会将菜单放在一个div里,使用盒子模型,方便以后的操作和设置样式。二级菜单也就是在一级菜单中的li中再添加一个ul-li结构 &lt;divclass="test"&gt; &lt;ul&gt; &lt;li&gt;A&lt;/li&gt; &lt;li&gt;B&lt..

    2022年4月30日
    57
  • vue iframe高度自适应 实用

    vue iframe高度自适应 实用iframe 是 vue 的 在使用过程中高度根据数据实时变化 不好设置 iframe 的高度值 试了多种方式之后 总结了几种自适应的方式 实时刷新 iframe 高度变化 variframes document getElementsB iframe setInterval function for vari 0 j iframes length i

    2025年9月1日
    4
  • Myeclipse7.5 下载 安装 注冊 注冊码 100%成功

    Myeclipse7.5 下载 安装 注冊 注冊码 100%成功

    2021年12月7日
    71
  • C++学习——数据类型(强制)转换详解

    C++学习——数据类型(强制)转换详解有时,编程的过程中需要将值从一种数据类型转换为另一种数据类型。C++ 提供了这样做的方法。如果将一个浮点值分配给一个 int 整型变量,该变量会接收什么值?如果一个 int 整数乘以一个 float 浮点数,结果将会是什么数据类型?如果一个 double 浮点数除以一个 unsigned int 无符号整数会怎么样?是否有办法预测在这些情况下会发生什么?答案是肯定的。当运算符的操作数具有不同的…

    2022年8月18日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号