XSS 从 PDF 中窃取数据
XSS 从 PDF 中窃取数据
将服务器端 XSS 注入到动态生成的 PDF 中
在 hack the box 的 Book 机器(Scripting Track)上,我遇到了一个 Web 应用程序,它使用用户控制的输入来生成 PDF 文件。用户输入输入,下载时该输入将呈现为 PDF 文件。
我从阅读许多文章中意识到与动态生成的 PDF 相关的 XSS 和 SSRF 漏洞,但直到我遇到 Book 机器才自己尝试过。
当我每次单击PDF链接时都看到下载功能生成PDF文件时,我开始再次搜索与此漏洞相关的漏洞赏金文章,以刷新我对如何利用它的记忆。
我发现攻击者可以制作在服务器端执行的 Javascript 代码并检索内部文件内容。它基本上是一个存储的 XSS 漏洞,可以通过将其与本地文件包含或 SSRF 链接以泄露内部数据来升级。
攻击方式:
- 本地文件包含
- 服务器端请求伪造
我将重点介绍如何利用 XSS 漏洞并将其与 LFI 相结合,以检索本文的内部文件内容。对于演示部分,我将使用图书机。
演示:
Book 机器上的 Library 应用程序有两用户;一个普通用户,另一个管理员。我们在两者上都经过了身份验证。
在用户中,用户可以在图书提交部分下的“馆藏”页面上上传文件。

在管理员面板中,“收藏夹”页面可以通过单击 PDF 链接将据称从用户门户上传的文件的收藏列表导出为 PDF 格式。

在许多情况下,基于用户输入生成 PDF 文件的功能可能容易受到服务器端 XSS 的攻击,从而导致数据从易受攻击的应用程序中泄露。
因此,我开始编制基本的测试清单来测试应用程序。
测试检查表:
- 识别可注射输入物
- 尝试 HTML 标记注入,看看应用程序是否解析了 HTML 代码。
- 读取内部文件时,测试不同的文件协议,即文件、HTTP、HTTPS。
- 使用 JS 注入读取内部服务器文件。
Synack 提示
始终检查运行 JS 代码的页面上正在运行的协议类型。如果页面在 http:// 或 https:// 协议上运行,则文件协议(file:// 协议)不能用于读取本地文件。
1-识别可注射的输入
浏览用户的门户,“书籍提交”部分似乎非常有趣。它有 2 个输入字段和一个上传选项。
输入字段用于书名和作者姓名。

2- HTML 注入
在“书名”和“作者”字段中插入基本的 HTML 标题标签,然后选择要上传的文件。
<h1>r3dbucket</h1>

在 Burp Suite 中拦截请求,以检查我们发送到应用程序的请求详细信息。

并且,一旦我们将请求发送到应用程序,我们就会切换到管理员面板并单击 PDF 链接以生成 PDF 文件。

PDF 导出链接
完成后,我们打开文件,我们看到 HTML 标签在后端被解析并包含在文件中。棒!!

3- JS注入读取内部服务器文件
在以下步骤中,我们尝试测试一个基本的 JS 有效负载,看看它是否执行。我将尝试在文件上写入单词“test”的 onerror 有效负载。
<img src="x" onerror="document.write('test')" />

在输入字段中注入 JS

JS 是在生成 PDF 时执行的
正如我们所看到的,JS 代码被执行,单词 test 包含在文件中。下一步是确定应用程序用于了解我们将如何读取服务器上的内部文件的文件协议。
我使用下面的内联来获取当前页面的完整 URL。
<script>document.write(document.location.href)</script>

正如我们所看到的,应用程序使用 **file/// 协议。**
接下来,我们可以使用 XHR 请求检索 host 和 passwd 文件的内容
<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open(‘GET’,’file:///etc/hosts’);x.send();</script><script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open(‘GET’,’file:///etc/passwd’);x.send();</script>

/etc/passwd 文件

/etc/hosts 文件
4-检索SSH密钥并访问计算机
当我查看 etc/passwd 文件的内容时,我看到用户 Reader 在服务器上具有 bash 登录名,这意味着我们可以通过 SSH 连接到服务器,因为端口 22 在机器上打开并获取交互式 SSH shell。
默认情况下,在 Linux 中,SSH 私钥 (id_rsa) 驻留在主目录内用户文件夹中的隐藏目录 .ssh 中。在我们的例子中,它将是 (home/reader/.ssh/id_rsa)
<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///home/reader/.ssh/id_rsa");x.send();</script>
有了这个,我尝试使用默认路径读取文件,并提取密钥的内容。

SSH 私钥
接下来,我需要将 pdf 转换为文本以提取密钥,我不能直接从 PDF 文件复制。我在 GitHub 中使用 pdf2txt.py 脚本来做到这一点。
该脚本是pdfminer工具集合的一部分。

GitHub 上的 pdfminer 集合
Pass the pdf file that has the SSH key to pdf2txt script and we can get the key.
python3 pdf2txt.py ssh.pdf

Reader’s SSH Key

SSH shell
5-防护
- 在将所有用户输入发送到应用程序之前,必须对其进行清理和验证。
- 对 XSS 和 HTML 有效负载中使用的所有字符进行编码。
- 在应用程序前面实现 WAF 解决方案
XSS 从 PDF 中窃取数据的更多相关文章
- (转)原始图像数据和PDF中的图像数据
比较原始图像数据和PDF中的图像数据,结果见表1.1.表1.1中各种“解码器”的解释见本文后续的“PDF支持的图像格式”部分,“PDF中的图像数据”各栏中的数据来自开源的PdfView.如果您有兴趣查 ...
- 使用Python从PDF文件中提取数据
前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...
- linux中防止黑客进入单用户模式进行强制修改密码窃取数据
如何防止别人恶意通过单用户系统破解root密码,进入系统窃取数据? 给grub加密,不让别人通过grub进入单用户. 当前系统:CentOS Linux release 7.6.1810 (Core) ...
- 从PDF中提取信息----PDFMiner
今天由于某种原因需要将pdf中的文本提取出来,就去搜了下资料,发现PDFMiner是针对 内容提取的,虽然最后发现pdf里面的文本全都是图片,就没整成功,不过试了个文本可复制的 那种pdf文件,发现还 ...
- java 如何在pdf中生成表格
1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储 ...
- 探索 OpenStack 之(17):计量模块 Ceilometer 中的数据收集机制
本文将阐述 Ceilometer 中的数据收集机制.Ceilometer 使用三种机制来收集数据: Notifications:Ceilometer 接收 OpenStack 其它服务发出的 noti ...
- C# 在PDF中创建和填充域
C# 在PDF中创建和填充域 众所周知,PDF文档通常是不能编辑和修改的.如果用户需要在PDF文档中签名或者填写其他内容时,就需要PDF文档中有可编辑的域.开发者也经常会遇到将数据以编程的方式填充到P ...
- 阿里聚安全·安全周刊】一种秘密窃取数据的新型 Android 木马|iOS 11相机惊现BUG
本周的七个关键词: 新型 Android 木马丨 TLS 1.3 丨 阿里安全图灵实验室 丨 漏洞感染 Linux 服务器 丨 CPU曝极危漏洞 丨 iOS 11相机BUG 丨R2D2技术 - ...
- 基于BootStrap的initupload()实现Excel上传和获取excel中的数据
简单说明:后边要做exl解析(还没做呢),所以先有一个excel的的上传以及获取excel中的数据,展示出来. 代码: //html代码 <div class="btn-group&q ...
- java itext替换PDF中的文本
itext没有提供直接替换PDF文本的接口,我们可以通过在原有的文本区域覆盖一个遮挡层,再在上面加上文本来实现. 所需jar包: 1.先在PDF需要替换的位置覆盖一个白色遮挡层(颜色可根据PDF文字背 ...
随机推荐
- MaxCompute(ODPS)和Hive的区别
Hive概述 架构于Hadoop之上,可以将结构化的HDFS文件映射成一张表,并提供了类似于SQL语法的HQL查询功能. 核心本质:将HQL语句转换成MapReduce任务. Hive的优缺点 优点 ...
- NC20477 [ZJOI2008]树的统计COUNT
题目链接 题目 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II ...
- java generic 介绍
一 介绍: 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换, ...
- 解决springboot整合freemarker页面跳转404
问题说明 spring boot 2.1.5集成freemarker时跳转报404! 集成过程说明 pom.xml <dependency> <groupId>org.free ...
- 什么是数据同步利器DataX,如何使用?
转载至我的博客 https://www.infrastack.cn ,公众号:架构成长指南 今天给大家分享一个阿里开源的数据同步工具DataX,在Github拥有14.8k的star,非常受欢迎,官网 ...
- Apple设备屏幕尺寸和方向
表格中包括了各种型号的iPad.iPhone.以及iPod touch等设备的详细信息,涵盖了从iPad Pro到各代iPhone和iPod touch的多个型号. 这些信息可用于开发应用程序时优化界 ...
- django中update_or_create()
update_or_create()方法中有一个defaults参数 模型字段会根据查询条件进行查询,如果查询到了,那么就用defaults对应的值去更新字段,如果没有查到就用defaults对应的值 ...
- GPS坐标系转换 go golang 版本
GPS坐标系转换 坐标系 解释 WGS84坐标系 地球坐标系,国际通用坐标系 GCJ02坐标系 火星坐标系,WGS84坐标系加密后的坐标系:Google国内地图.高德.腾讯地图 使用 BD09坐标系 ...
- error LNK2019: unresolved external symbol _CrtDbgReport referenced in function xxxx
现象 在用C++调试dll动态库的时候汇报上述错误,我用VS2015编译的DEBUG版本动态库,实际在VS2019中调试 解决方法 在工程属性中做出如下选择,代码生成->多线程调试DLL ,出现 ...
- linux服务器文件实时同步
linux服务器文件实时同步 1 背景说明 在做系统集群部署时,涉及到两个或多个服务器之间文件同步.在软件层面linux服务环境找到以下两种同步方式 利用linux NFS功能将网络共享文件挂载成本地 ...