前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >xxe漏洞原理与防御

xxe漏洞原理与防御

作者头像
全栈程序员站长
发布2022-08-31 19:27:25
7360
发布2022-08-31 19:27:25
举报
文章被收录于专栏:全栈程序员必看

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

xml基础知识

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

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

为什么使用 DTD?

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

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

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

您还可以使用 DTD 来验证您自身的数据。

xml文档的构建模块

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

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

下面是每个构建模块的简要描述。 1,元素 元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。 实例:

代码语言:javascript
复制
<body>body text in between</body>
<message>some message in between</message>

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

2,属性 属性可提供有关元素的额外信息 实例:

代码语言:javascript
复制
<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]> 完整实例:

代码语言:javascript
复制
<?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'> 完整实例:

代码语言:javascript
复制
<?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的内容为:

代码语言:javascript
复制
<!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 声明元素> 完整实例:

代码语言:javascript
复制
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
]>

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

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

代码语言:javascript
复制
<?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攻击

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

代码语言:javascript
复制
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.cn/142395.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • xml基础知识
  • 为什么使用 DTD?
    • xml文档的构建模块
      • DTD(文档类型定义)
        • DTD实体
        • XXE的攻击与危害(XML External Entity)
        • 如何防御xxe攻击
        相关产品与服务
        云服务器
        云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档