XXE笔记

本文介绍了XML及DTD的基础知识,详细讲解了XXE漏洞的概念、挖掘技巧和修复方法。内容涵盖XML的声明、DTD的声明、PCDATA、CDATA和实体的定义,特别是外部实体声明的使用,以及如何利用XXE读取敏感信息。最后,文章讨论了XXE漏洞的防范措施,包括禁用外部实体和过滤用户提交的XML数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

XML及DTD介绍

简介

DTD

PCDATA

CDATA

实体

内部实体声明

XXE漏洞介绍

挖掘技巧及修复

挖掘方式

漏洞利用

漏洞修复


  • XML及DTD介绍

  • 简介

XML指可扩展标记语言(EXtensible Markup Lanuage),设计用来进行数据的传输和存储。

XML是一种标记语言,很类似HTML

XML的设计宗旨是传输数据,而非显示数据

XML标签没有被定义。需要自行定义标签

XML被设计为具有自我描述性

XML是W3C的推荐标准

XML是不作为的

XML仅仅是纯文本

XML可以发明自己的标签

XML是对HTML的补充

XML是W3C的推荐标准

<?xml version="1.0" encoding="UTF-8"?>     //xml声明

<!DOCTYPE message>                                //DTD文档类型定义

<!ELEMENT message (receiver,sender,header,msg)>   //定义元素

<reset>

<login>&aaa;</login>

<secret>Any bugs?</secret>

</reset>                                                            //文档元素

  • DTD

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

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行的声明于XML文档中,也可作为一个外部引用

  1. 内部声明DTD:<!DOCTYPE 根元素[元素声明]>
  2. 引用外部DTD:<!DOCTYPE 根元素 SYSTEM "文件名">
  3. 内外部DTD文档结合:<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

DTD中的一些重要的关键字:

DOCTYPE(DTD的声明)

ENTITY(实体的声明)

SYSTEM、PUBLIC(外部资源申请)

  • PCDATA

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

可把字符数据想象为XML元素的开始标签与结束标签之间的文本,PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记,文本中的标签会被当做标记来处理,而实体会被展开。

不过,被解析的字符数据不应当包含任何&、< 或者 > 字符;需要使用&amp;、&lt; 以及 &gt; 实体来分别替换它们。

  • CDATA

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

CDATA是不会被解析器解析的文本。在这些文本中的标签不会被当做标记来对待,其中的实体也不会被展开。

  • 实体

实体是对数据引用;根据实体种类的不同,XML解析器使用实体的替代文本或者外部文档的内容来替代实体引用,它主要分为以下四类:

  1. 内置实体(Built-in entities)
  2. 字符实体(Character entities)
  3. 通用实体(General entities)
  4. 参数实体(Parameter entities)

参数实体用%实体名称申明,引用时也用%实体名称;

其余实体直接用实体名称申明,引用使用&实体名称;

参数实体只能在DTD中申明,DTD中引用;

其余实体只能在DTD中申明,可在xml文档中引用。

注意:参数实体是在DTD中被引用的,而其余实体是在xml文档中被引用的,另外定义时注意%后面跟空格。

  • 内部实体声明

<!ENTITY 实体名称 "实体的值">

一个实体由三部分构成:&符号,实体名称,分号(;),这里&不论在GET还是在POST中都需要进行URL编码,因为是使用参数传入xml的,&符号会被认为是参数间的连接符号。示例:

<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "Thinking">
]>
<foo>&xxe;</foo>

外部实体声明

XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,由SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借用各种协议,比如以下三种:

file:///path/to/file.ext
http://url
php://filter/read=convert.base64-encode/resource=conf.php

<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM “URI/URL”>
]>
<foo>&xxe;</foo>

外部实体可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议。

参数实体格式

<!ENTITY % 实体名称 “实体的值”>或<!ENTITY % 实体名称 SYSTEM “URI”>

 

  • XXE漏洞介绍

XXE也叫XML(可扩展标记语言)外部实体注入,然后我们这里拆开来解释:

注入:

在XML数据传输过程中,数据被恶意修改,导致服务器最终执行了修改后的恶意代码。

外部实体:

通过调用外部实体声明部分对XML数据进行修改、插入恶意代码。

因此XXE指的是XML数据在传输过程中,利用外部实体声明部分的"SYSTEM"关键字导致XML解析器可以从本地文件或者远程的URL中读取受保护的数据。

  • 挖掘技巧及修复

  • 挖掘方式

  1. 判断数据类型
  2. 判断自定义XML是否被解析
  3. 判断是否支持外部实体,尽量使用自己的VPS判断,避免遇到的不是不会显得XXE
  • 漏洞利用

  1. 读取敏感信息/文件
  2. 内网探测
  • 漏洞修复

  1. 使用开发语言提供的禁用外部实体的方法
  2. 过滤用户提交的XML数据
  3. 不允许XML中含有任何自定义声明的DTD
  4. 最简单、粗暴、有效、直接的修复方式就是禁用DOCTYPE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值