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文字背 ...
随机推荐
- Kubernetes 漫游:Controller Manager
Controller Manager Controller Manager 是控制平面的一个重要组件,负责维护 Kubernetes 集群的整体状态. 流程: 在集群中 Controller Mana ...
- NC20811 蓝魔法师
题目链接 题目 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不同当且仅当存在一 ...
- MQTT-基础理念
MQTT与HTTP的区别 HTTP协议是客户端与服务端直连请求与响应 MQTT是基于发布订阅模型的轻量级的消息传输协议 MQTT能力 发布:Publish 订阅:Subscribe 代理:Broker ...
- Springboot+JdbcTemplate模拟SQL注入攻击案例及解决方法
说明 SQL注入是软件开发项目测试过程中必测项,重要等级极高.本文以springboot项目为例,模拟含有SQL注入攻击,并提供解决方法.部分内容整理自网络. 搭建项目 1.创建表tbuser DRO ...
- Java8函数式接口Predicate实战
关于函数式接口 函数式接口 Funcational Interface 是指接口范围内只允许有一个抽象方法(不包括default和static方法)的接口.Java中有一些预定义的函数接口,如Pred ...
- BUG管理系统(Mantis)迁移实战
Mantis迁移实战 名词解释 Mantis: 开源的BUG管理平台Mantis,也做MantisBT. 同档次产品有EasyBUG,QC,BugFree,Bugzila. Xa ...
- win32-GetActiveWindow和GetForegroundWindow
最近被这两个api搞得有点晕,故查阅了相关的资料. 这篇文章解释的很好:https://devblogs.microsoft.com/oldnewthing/20081006-00/?p=20643 ...
- [超实用插件]在Visual Studio中查看EF Core查询计划
前言 EF Core是我们.NET开发中比较常用的一款ORM框架,今天我们分享一款可以直接在Visual Studio中查看EF Core查询计划调试器可视化工具(帮助开发者分析和优化数据库查询性能) ...
- 修改centos7虚拟机的用户密码
在忘记原密码无法登录桌面的情况下,修改centos7的用户密码 非常规启动,进入编辑启动菜单 在启动GRUB菜单中选择编辑选项,按键e进入编辑; 找到linux16开头的一行,在该行中寻找ro的所在地 ...
- 被 AI 替代应该就在不远的将来
提问:golang 各种图片 转 webp 代码 一秒之后...... package main import ( "fmt" "image" "im ...