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

文章目录

  • XXE注入
    • 一、XML简介
    • 二、XML实体
    • 三、CTF中XEE攻击

XXE注入

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

一、XML简介

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

 
<!DOCTYPE message [ 
<!ELEMENT password(#PCDATA)>
]>

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

<message>
    <username>rootusername>
    <password>123password>
message>

二、XML实体

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

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



<!ENTITY tst "test">
]>

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

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

外部实体
示例:



]>
<message>
    <user>&xxe;user>
message>

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

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

1.通用实体:

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

示例:


]
<Profile>
 <msg>&file;msg>
Profile>

2.参数实体

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

示例:

<!ENTITY % an-element " mytag (subtag)>"> 
 
%an-element; %remote-dtd;

三、CTF中XEE攻击

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

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

XML外部实体注入(XEE)的原理和应用_第1张图片
发现传的是JSON数据,考虑修改一下上传文件类型为XML类型。构造外部实体,实现XXE攻击。将ContentType字段改为:application/xml,然后在请求内容中加上如下的payload:



]>
<message>&shell;message>

XML外部实体注入(XEE)的原理和应用_第2张图片
发现了/home/ctf路径。改一下file的路径:file:///home/ctf/flag.txt。即可得到flag
XML外部实体注入(XEE)的原理和应用_第3张图片

2.题目地址:https://buuoj.cn/challenges (Fake XML cookbook)
XML外部实体注入(XEE)的原理和应用_第4张图片
抓包后,发现上传的是XML类型的数据
XML外部实体注入(XEE)的原理和应用_第5张图片
直接构造XML外部实体,读flag。payload如下:



]>
<user><username>&admin;username><password>passwdpassword>user>

XML外部实体注入(XEE)的原理和应用_第6张图片

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

你可能感兴趣的:(Web安全,CTF)