XXE—XML外部实体注入

XXE

0x01、XML

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

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

XML数据格式组成

  • 声明

  • 元素/节点

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

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

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

  • 注释:

示例

XXE—XML外部实体注入_第1张图片

XML数据格式作用

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

0x02、DTD基础知识

定义

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

作用

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

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

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

分类

内部DTD、外部DTD和共有DTD

内部DTD



	
	
	
	
]>

	George
	John
	Reminder
	Don't forget the meeting!

外部DTD

XXE—XML外部实体注入_第2张图片

共有DTD

image-20220416164700074

DTD实体

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

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

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

内部实体

XXE—XML外部实体注入_第3张图片

外部实体

XXE—XML外部实体注入_第4张图片

参数实体



DTD定义



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

DTD元素

XXE—XML外部实体注入_第5张图片

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外部实体解析

XXE—XML外部实体注入_第6张图片

XXE—XML外部实体注入_第7张图片

如何探测xxe漏洞?

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

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

你可能感兴趣的:(漏洞,渗透测试,渗透测试,web安全,xml)