XXE 漏洞

XML

  • XML是Extensible Markup Language(可扩展标识语言)的简写。

  • XML的设计宗旨是传输数据,不是显示数据。XML在web中的应用已十分广泛。XML是各种应用程序之间数据传输最常用的格式。与HTML的区别在于一个被设计用来展示数据,一个用来传输数据

  • 特点

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

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

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

    • XML 是 W3C 的推荐标准

DTD

• DTD(Document Type Definition)文档类型定义 • DTD规定、约束符合标准通用语言或可扩展标记语言规则的定义和陈述 • DTD是XML的约束,通过DTD验证的XML是“合法”的XML

DTD语法

元素约束

格式:<!ELEMENT name content-type>

  • ELEMENT 表示关键字

  • NAME 表示元素名称

  • content-type 表示元素类型,有三种写法:

    • EMPTY 表示该元素不能包含子元素和文本,但可以有属性

    • ANY 表示该元素可以包含任何在该DTD中定义的元素内容

    • #PCDATA 表示可以包含任何字符数据,但是不能在其中包含任何子元素

属性约束

格式:<!ATTLIST 元素名 属性名称 属性类型 属性特点>

属性类型:

  • CDATA 是字符串类型

  • ID 在整个文档中是唯一的,命名规则和xml元素一样,不能以数字开头

  • IDREF reference属性的值必须来源于ID的值

  • IDREFS 值必须来源于ID的值,取值可以是多个,以空格分开书写

  • Enumerated 枚举类型(男|女)

  • ENTITY 实体

属性特点:

  • #REQUIRED 必须设置

  • #IMPLIED 可选

  • #FIXED value 固定值,属性可以不设定(该属性会自动设置上),如果设置,值必须为value

  • default value 默认值,可以自定义,如果不定义该属性,则属性会自动设置,值为默认值

验证XML是否符合DTD约束

实体

实体(ENTITY):如果在XML文档中需要频繁使用某一条数据,我们可以预先给这个数据起一个别名(类似于变量),即一个ENTITY,然后在文档中调用它

类型
普通实体
参数实体

内部

<!ENTITY 实体名 "文本内容">

<!ENTITY % 实体名 "文本内容">

外部

<!ENTITY 实体名 SYSTEM "外部文件/URL">

<!ENTITY % 实体名 SYSTEM "外部文件/URL">

引用方式

&实体名;

%实体名;

使用场合

用在XML文档中(包括DTD)

只用在DTD的元素和属性声明中

php解析xml

外部实体

  • <!ENTITY 实体名 SYSTEM "URL">

  • 外部引用可支持 http、file 等协议,不同的语言支持的协议不同,但存在一些通用的协议

总结

  • 参数实体只能用于DTD中,不能用于文档本体中

  • 参数实体的内容不仅可以包含文本,还可以包含标记

  • 外部参数实体应用于独立的DTD文档,外部一般实体用于XML文档

  • 外部参数实体可以将多个独立的DTD文档组成一个大的DTD文档,外部一般实体用于将多个独立XML文档组成一个大的XML文档

XXE漏洞原理

  • XXE漏洞全称为 XML External Entity Injection,即XML外部实体注入

  • XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致用户可以控制外部的加载文件,造成XXE漏洞,导致如文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害

漏洞危害

  • 任意文件读取

  • 内网端口探测

  • 拒绝服务攻击

  • 远程代码执行

  • 钓鱼

漏洞防御

  1. 禁用外部实体的方法

    PHP

    JAVA

    Python

  2. 过滤用户提交的XML数据

    过滤关键词:<!DOCTYPE <!ENTITY SYSTEM PUBLIC

漏洞复现

漏洞源码(有回显)

payload

漏洞源码(无回显)

攻击者服务器

attack.dtd

getcontent.php

payload

漏洞利用

内网主机扫描

利用协议和IP地址最后一位字典遍历,结合Burp爆破返回数据包长度判断

内网端口探测

代码将尝试与端口8080通信,根据响应时间/长度,攻击者将可以判断该端口是否已被开启

远程代码执行

这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,主要是由于配置不当/开发内部应用导致的。且php的expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么我们就可以执行如下的命令

Last updated