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 中窃取数据的更多相关文章

  1. (转)原始图像数据和PDF中的图像数据

    比较原始图像数据和PDF中的图像数据,结果见表1.1.表1.1中各种“解码器”的解释见本文后续的“PDF支持的图像格式”部分,“PDF中的图像数据”各栏中的数据来自开源的PdfView.如果您有兴趣查 ...

  2. 使用Python从PDF文件中提取数据

    前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...

  3. linux中防止黑客进入单用户模式进行强制修改密码窃取数据

    如何防止别人恶意通过单用户系统破解root密码,进入系统窃取数据? 给grub加密,不让别人通过grub进入单用户. 当前系统:CentOS Linux release 7.6.1810 (Core) ...

  4. 从PDF中提取信息----PDFMiner

    今天由于某种原因需要将pdf中的文本提取出来,就去搜了下资料,发现PDFMiner是针对 内容提取的,虽然最后发现pdf里面的文本全都是图片,就没整成功,不过试了个文本可复制的 那种pdf文件,发现还 ...

  5. java 如何在pdf中生成表格

    1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储 ...

  6. 探索 OpenStack 之(17):计量模块 Ceilometer 中的数据收集机制

    本文将阐述 Ceilometer 中的数据收集机制.Ceilometer 使用三种机制来收集数据: Notifications:Ceilometer 接收 OpenStack 其它服务发出的 noti ...

  7. C# 在PDF中创建和填充域

    C# 在PDF中创建和填充域 众所周知,PDF文档通常是不能编辑和修改的.如果用户需要在PDF文档中签名或者填写其他内容时,就需要PDF文档中有可编辑的域.开发者也经常会遇到将数据以编程的方式填充到P ...

  8. 阿里聚安全·安全周刊】一种秘密窃取数据的新型 Android 木马|iOS 11相机惊现BUG

    本周的七个关键词:  新型 Android 木马丨 TLS 1.3 丨  阿里安全图灵实验室 丨 漏洞感染 Linux 服务器 丨 CPU曝极危漏洞 丨   iOS 11相机BUG 丨R2D2技术 - ...

  9. 基于BootStrap的initupload()实现Excel上传和获取excel中的数据

    简单说明:后边要做exl解析(还没做呢),所以先有一个excel的的上传以及获取excel中的数据,展示出来. 代码: //html代码 <div class="btn-group&q ...

  10. java itext替换PDF中的文本

    itext没有提供直接替换PDF文本的接口,我们可以通过在原有的文本区域覆盖一个遮挡层,再在上面加上文本来实现. 所需jar包: 1.先在PDF需要替换的位置覆盖一个白色遮挡层(颜色可根据PDF文字背 ...

随机推荐

  1. MySQL 将执行结果保存到文件

    1.  使用mysql的tee命令记录对mysql的操作过程 (1)第一种情况是在连接数据库的时候使用tee >mysql  -u root  -p  --tee=C:/log.txt      ...

  2. Hive-分区取TOP N问题

    问题背景 设想你对用户在不同品类上的行为打分聚合后得到这样一个表 user_cate_score uid cate score 1 1 0.3 2 2 0.5 8 3 0.9 现在,你想将每个品类的T ...

  3. 程序员减少BUG的两个小妙招!

    原创:陶朱公Boy(微信公众号ID:taozhugongboy),欢迎分享,转载请保留出处. ​ 点评: 我们说衡量一个程序员水平的高低往往有很多因素,但有一个因素至关重要即代码质量. 如果程序员写的 ...

  4. JS Leetcode 198. 打家劫舍 题解分析,再次感受动态规划的魅力

    壹 ❀ 引 本题来自LeetCode198. 打家劫舍,难度中等,也很有意思,是一道教小偷如何偷窃最大金额的题,题目描述如下: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你 ...

  5. NC18389 收益

    题目链接 题目 题目描述 小N是一家金融公司的项目经理.他准备投资一个项目,这个项目要融资L元,融资成功后会得到M元的利润.现在有n个客户.对于第i个客户,他有mi元钱.小N承诺假如最后筹够钱,会给这 ...

  6. NC15445 wyh的吃鸡

    题目链接 题目 题目描述 最近吃鸡游戏非常火,你们wyh学长也在玩这款游戏,这款游戏有一个非常重要的过程,就是要跑到安全区内,否则就会中毒持续消耗血量,我们这个问题简化如下 假设地图为n*n的一个图, ...

  7. IPFS 添加和管理文件

    IPFS的文件有不同的模式 默认模式 默认模式下, 文件会被解析并存入blocks, 同时文件的结构被存入filestore, 因为IPFS是按内容寻址的文件系统, 在添加时最外层的目录名或文件名信息 ...

  8. Springboot实现remember-me记住我功能

    1.什么是remeber-me? remeber-me即记住我功能,是我们在登录web系统时的常见勾选项.当我们登录一个web系统时除了输入常规的用户名.密码后还可以勾选记住我选项(假设该系统提供了该 ...

  9. letcode-Z字抖动

    题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下 ...

  10. Python笔记五之正则表达式

    本文首发于公众号:Hunter后端 原文链接:Python笔记五之正则表达式 这一篇笔记介绍在 Python 里使用正则表达式. 正则表达式,Regular Expression,可用于在一个目标字符 ...