从xss到任意文件读取

server/2024/11/13 4:14:25/

xss一直是一种非常常见且具有威胁性的攻击方式。然而,除了可能导致用户受到恶意脚本的攻击外,xss在特定条件下还会造成ssrf和文件读取,本文主要讲述在一次漏洞挖掘过程中从xss到文件读取的过程,以及其造成的成因。
0x01 前言
xss一直是一种非常常见且具有威胁性的攻击方式。然而,除了可能导致用户受到恶意脚本的攻击外,xss在特定条件下还会造成ssrf和文件读取,本文主要讲述在一次漏洞挖掘过程中从xss到文件读取的过程,以及其造成的成因。

0x02 漏洞详细
XSS
漏洞所在的是一个可以在线编辑简历并导出的一个网站,

首先注册账号后进去,任意选一个模板在线编辑,在编辑简历时插入payload测试

在这里插入图片描述
发现被转义了,我们手动修改回去
在这里插入图片描述
刷新简历可以看到成功弹窗,证明存在存储型xss
在这里插入图片描述
然后使用

标签测试,可以发现h1标签也会被解析
在这里插入图片描述
然后我们发现,网站有一个功能可以把简历转成pdf并下载,而在线编辑的是html格式,而且这一转换过程是在后端完成,并且导出的pdf中标签依然是被解析的,如下图所示,导出的pdf中上方的字体也明显变大,说明h1标签被解析
在这里插入图片描述
2.SSRF
通过过滤网络请求我们发现这样一个数据包,它将html及里面包含的js代码会发送给后端,后端可能通过渲染html代码从而生成pdf供用户下载
在这里插入图片描述
在这里插入图片描述
那后端是如何将html渲染成pdf,执行html中的js呢?

一般可以通过获取后端解析的组件及版本来获取更多信息,从下载的pdf中,可以文件的头部信息可以获取创建者或者pdf文件信息
在这里插入图片描述
可以发现后端使用的wkhtmltopdf组件

wkhtmltopdf官方文档:https://wkhtmltopdf.org/index.html
在这里插入图片描述
在他的使用文档中发现其使用Qt WebKit浏览器引擎将html渲染成pdf,既然是通过浏览器渲染的,那html中的所有标签也会被浏览器所执行。

所以我们使用iframe标签尝试读取内网资源
在这里插入图片描述

可以看到虽然是403,但是确实是能读取成功的。
在这里插入图片描述
3.任意文件读取
我们尝试是否能通过请求file协议读取文件

javascript 将在服务器端执行,让我们尝试通过注入以下 javascript 从文件系统中获取文件,然后构造payload进行文件的读取:

通过XMLHttpRequest发起请求,使用file协议读取本地文件,然后document.write将请求的结果覆盖原来html的内容。
在这里插入图片描述
访问pdf,成功读取到文件
在这里插入图片描述
0x03 漏洞成因及修复
所里这里有一个疑问,为什么js会导致本地任意文件读取,如果真是这样的话那我们每个用户在浏览有js的网页时都会造成本地信息泄露?

其实我们在使用浏览器访问网页并加载js时,浏览器有一套安全机制,使用XMLHttpRequest对象读取本地文件在Web浏览器中是受限的,因为出于安全考虑,浏览器限制了通过XMLHttpRequest对象直接访问本地文件系统。

image-20230607150153432

如上图所致直接在浏览器执行这段payload会被提示Not allowed to load local resource

前面我们提到后端将html转换为pdf的组件是wkhtmltopdf,他使用无头运行的Qt WebKit浏览器引擎,但是浏览器默认参数是使用–enable-local-file-access,即允许访问本地文件,这就是导致可以使用file协议进行任意文件的问题。

–disable-local-file-access 不允许一个本地文件加载其他的本地文件,使用命令行参数 --allow 指定的目录除外。
–enable-local-file-access 与–disable-local-file-access相反(这是默认设置)
–allow 允许加载指定文件夹中的一个或多个文件
同时wkhtmltopdf官方文档中也说明了不要将 wkhtmltopdf 与任何不受信任的 HTML 一起使用
在这里插入图片描述
即使使用了–disable-local-file-access,攻击者也可以利用预构建二进制文件中的 CVE 的攻击者可能能够绕过此设置。

在这里插入图片描述


http://www.ppmy.cn/server/140802.html

相关文章

LWIP通信协议UDP发送、接收源码解析

1.UDP发送函数比较简短,带操作系统和裸机一样。以下是udp_sendto源码解析; 2.LWIP源码UDP接收数据 2.1.UDP带操作系统接收数据,以下是源码解析; 2.2.UDP裸机接收数据,以下是源码解析

C++:线程(thread)的创建、调用及销毁

在 C 中,线程的管理主要依赖于标准库 std::thread,自 C11 起,这一功能被标准化,使得我们能够更加方便地创建、管理和销毁线程。这里我们详细讲解线程的创建、调用和销毁流程。 1. 线程的创建 创建线程通常是为了在单独的线程中执…

《Rust语言圣经》Rust教程笔记17:2.Rust基础入门(2.6模式匹配)2.6.2解构Rust Option<T>

文章目录 2. Rust 基础入门2.6. 模式匹配2.6.2. 解构Option注意不要忘记Some 和 None 是 Option 枚举的成员匹配 Option<T>1、传入参数 Some(5)2、传入参数 None 2. Rust 基础入门 2.6. 模式匹配 2.6.2. 解构Option 在枚举那章&#xff0c;提到过 Option 枚举&#xf…

MYSQL隔离性原理——MVCC

表的隐藏字段 表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段&#xff0c;不理解也没有关系&#xff0c;理解后面的undo log就懂了&#xff1a; DB_TRX_ID &#xff1a;6 byte&#xff0c;最近修改( 修改/插入 )事务ID&#xff0c;记录创建这条记…

ts 将100个元素,每行显示9个元素,然后显示出所有行的元素,由此我们延伸出一个项目需求的简单算法实现。

1、先看一下baidu ai出的结果&#xff1a; 2、我们将上面的代码修改下&#xff0c;定义一个数组&#xff0c;然后记录每行的行号及相应的元素&#xff1a; <template><div>console</div> </template> <script setup lang"ts"> import …

基于交互多模型 (IMM) 算法的目标跟踪,使用了三种运动模型:匀速运动 (CV)、匀加速运动 (CA) 和匀转弯运动 (CT)。滤波方法为EKF

基于交互多模型 (IMM) 算法的目标跟踪&#xff0c;使用了三种运动模型&#xff1a;匀速运动 (CV)、匀加速运动 (CA) 和匀转弯运动 (CT)。滤波方法为EKF 文章目录 运行结果源代码运行结果详解代码详解概述主要功能代码详细介绍1. 初始化与仿真参数设置2. 定义模型参数3. 状态转移…

maven工程结构说明

1、maven工程文件目录 |-- pom.xml # Maven 项目管理文件 |-- src # 放项目源文件|-- main # 项目主要代码| |-- java # Java 源代码目录| | -- com/example/myapp…

【Pikachu】File Inclusion文件包含实战

永远也不要忘记能够笑的坚强&#xff0c;就算受伤&#xff0c;我也从不彷徨。 1.File Inclusion(文件包含漏洞)概述 File Inclusion(文件包含漏洞)概述 文件包含&#xff0c;是一个功能。在各种开发语言中都提供了内置的文件包含函数&#xff0c;其可以使开发人员在一个代码…