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文字背 ...
随机推荐
- 从零开始的react入门教程(三),了解react事件与使用注意项
壹 ❀ 引 在从零开始的react入门教程(二),从react组件说到props/state的联系与区别一文中,我们介绍了react组件的基本用法以及props与state的区别.其中react组件分 ...
- NC51216 花店橱窗
题目链接 题目 题目描述 小q和他的老婆小z最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里. 但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同的花束时,会产生不同的美学 ...
- Python 装饰器解析(一)
装饰器用于在源码中"标记"函数,以增强函数的行为. 我们先来看下面的例子,现有一个求和函数add,现在要求统计函数执行的时长 def add(a, b): print(a+b) 最 ...
- Python 虚拟环境 virtualenv 笔记
初始化 virtualenv 方式一: virtualenv 安装 virtualenv, 不用sudo的话, 是安装到用户home目录下 pip install virtualenv # 此时如果 ...
- mc命令
mc命令 mc是一个基于字符的目录浏览器和文件管理器,其将熟悉的图形文件管理器和常见的命令行工具联系在一起,mc的设计基于文件管理器中双目录窗格的设计,其中同时显示两个目录的列表,可以执行所有常见的文 ...
- 使用JS实现博客搜索关键字高亮
说明 最近博客添加了搜索功能,有个需求是要针对搜索结果中搜索关键字需要高亮显示. 以便用户可以更快速的挑选自己中意的文章. 原理就是在渲染列表数据中给含有关键字的文本标签添加自定义class,渲染完毕 ...
- letcode-括号生成
递归大法,空间换时间 就是记录左右括号数,一旦右括号数大于左括号数,退出. 当左右括号数相等,且等于n则为合法解. 使用char数组取代StringBuilder可以减少内存使用,这样每次进行回溯时不 ...
- 《深入理解Java虚拟机》(二) GC 垃圾回收机制
@ 目录 一.概述 二.判断对象是否需要被回收方式 1.引用计数法: 2.可达性分析法: 三.垃圾收集算法 1.分代收集理论基础 2.标记-清除算法 3.复制-收集算法 4.标记-压缩(整理)算法 5 ...
- C++ 虚基类
虚基类(Virtual Base Class)在面向对象编程中的作用是解决多重继承中的菱形继承问题(Diamond Inheritance Problem)和共享基类问题(Shared Base Cl ...
- Flask遇到的坑及解决办法
flask_script 在使用第三方包flask_script时,报一下错误 ModuleNotFoundError: No module named 'flask._compat' 问题时flas ...