XXE攻击

XXE攻击

 

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 文档的主要构建模块,元素可包含文本、其他元素或者是空的。
2,属性
属性可提供有关元素的额外信息

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>

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

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

怎样构建外部实体注入?
方式一:直接通过DTD外部实体声明
方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
方式三:通过DTD外部实体声明引入外部实体声明
好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明

产生哪些危害?

XXE危害

1:读取任意文件

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

另外,数据不回显就没有问题了吗?
不,可以把数据发送到远程服务器,


触发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 etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

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

 

方案二的测试我还没有进行过,感兴趣的可以试试。

————————————————
原文链接:https://blog.csdn.net/qq_40491569/article/details/83066200

XXE攻击(XML External Entity Injection)是一种常见的网络安全攻击,它利用 XML 解析器的漏洞,将恶意的 XML 实体注入到应用程序中,从而实现对目标系统的攻击。下面介绍如何在 pikachu 靶场上实施 XXE 攻击。 步骤1:选择目标 在 pikachu 靶场中,可以选择一个目标进行攻击。例如,选择其中一个常见的目标“WebGoat”,这是一个用于学习 Web 应用程序漏洞的靶场。在 pikachu 靶场中,可以通过访问“https://ip:8443/WebGoat/attack”进入 WebGoat 靶场。 步骤2:查找漏洞 在 WebGoat 靶场中,有许多不同类型的漏洞可供攻击者利用。在这里,我们将选择“XXE Injection”漏洞进行攻击。 步骤3:编写攻击脚本 编写攻击脚本,该脚本将恶意的 XML 实体注入到目标应用程序中。以下是一个简单的攻击脚本示例: ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <foo>&xxe;</foo> ``` 在此脚本中,我们注入了一个实体“xxe”,它将读取目标系统的“/etc/passwd”文件并将其返回。 步骤4:发送攻击攻击脚本发送到目标系统。在 WebGoat 靶场中,可以通过简单地将脚本复制并粘贴到相应的输入框中进行攻击。 步骤5:获取攻击结果 如果攻击成功,将返回目标系统的“/etc/passwd”文件内容。 需要注意的是,XXE 攻击可能会导致目标系统中的敏感信息泄露,因此请在合法授权和合规框架内进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值