XXE—XML外部实体注入

XXE

0x01、XML

什么是XML?
XML 是可扩展标记语言(EXtensible Markup Language)
XML的特点

  • 是一种标记语言
  • 被设计来进行数据传输
  • 可以自定义标签
  • 具有层级结构
  • 具有自我描述性

XML数据格式组成

  • 声明

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

  • 元素/节点

    • 根节点:有且只有一个根元素·
    • 子节点:可以嵌套,可以重复
    • 每个节点必须成对出现,空节点也必须成对出现
  • 属性

    • 每个元素/节点可以有多个属性

    • 属性以键值对的方式出现:名称=“值”。属性的值添加双引号,多个属性以空格分开。

  • 注释:<!-- 注释内容 -->

示例

image-20220416163509327

XML数据格式作用

  • 简化数据共享
  • 简化数据传输
  • 简化平台变更
  • 使数据更加有用

0x02、DTD基础知识

定义

DTD全称是The document type definition,即是文档类型定义,可定义合法的XML文档
它使用一系列合法的元素来定义文档的结构。DTD可以被成行的声明于XML DTD作用

作用

一个应用程序可以使用DTD来确认收到的XML数据是有效的

每个XML文件可以携带一个自身格式的描述。

不同组织的人可以使用一个通用DTD来交换数据。

分类

内部DTD、外部DTD和共有DTD

内部DTD
<?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>
外部DTD

image-20220416164611303

共有DTD

image-20220416164700074

DTD实体

实体的概念:实体是用于定义引用普通文本或特殊字符的快捷方式的变量实体引用是对实体的引用

实体可在内部或外部进行声明。

DTD实体分类:内部实体、外部实体、参数实体

内部实体

image-20220416164926655

外部实体

image-20220416165017178

参数实体
<!ENTITY % 实体名称 [SYSTEM] "URL">

DTD定义
<!ENTITY % TAG_NAME "姓名|EMAIL|电话|地址">
<!ELEMENT 个人信息(%TAG_NAME;|生日)>
<!ELEMENT 客户信息(%TAG_NAME;|公司名)>

对参数实体的说明
1、参数实体只能在DTD中定义,DTD中引用;
2、参数实体和通用实体一样,参数实体也可以外部引用;
3、实体的声明中不能引用其他参数实体;
4、非参数实体只能在DTD中定义,在xml文档中引用。

DTD元素

image-20220416165332337

0x03、XXE漏洞原理

XXE -“xml external entity injection”
“xml外部实体注入漏洞”

概括一下就是"“攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题”
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

0x04、XXE实操

以pikachu靶场为例实践XXE漏洞

现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

pikachu靶机为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析

image-20220416174543908

image-20220416180423024

如何探测xxe漏洞?

抓包,如果是xml格式的body,则发送一个<元素>数据</元素>

能回显,就可能存在XXE漏洞

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shadow丶S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值