本篇其实算之前安全整改话题的一点补充,对之前内容感兴趣的可以走以下快捷通道:

安全漏洞整改系列(二)

安全漏洞整改系列(一)

背景

前不久某家客户对我们提供的系统又进行了一轮安全测试,其中有一条我觉得很有意思,也算是刷新了我的认知,那就是“pdf预览存在xss注入”,在此跟大家分享一波,也算是相互提醒。

复现问题

拿到安全报告以后我随即使用了提供的pdf文件成功复现问题,果不其然一预览浏览器就弹出一个提示框。

xss注入问题确实让人心头一震,按照以往的经验接下来的渗透测试就会从简单的alert替换成劫持session一类危险操作,所以修复工作刻不容缓。

原理解析

pdf执行js代码于我而言确实是一件新鲜事,查阅了相关资料以后得知使用pdf编辑软件可以直接植入js代码,然而这并不是什么黑科技,属于pdf早就支持的特性,以Adobe Acrobat DC为例,打开pdf可以直接编辑内容

从图上可以看到pdf中植入的js代码也执行了,接着我们看看是怎么植入的。

  1. 切换到工具

  2. 选择JavaScript

  3. 看到pdf文档上方多了JavaScript的操作按钮

  4. 选择文档级JavaScript

  5. 点击编辑按钮修改js代码

到这儿一段简单的js代码就算是植入到了pdf文件中,借助工具操作还是很便捷的,简单看下这段代码:

function test_alert()
{
app.alert('这是一个alert窗');
} test_alert();

不用过多解释大伙应该都知道什么意思,唯一比较可疑的是app.alert,这里的app其实是pdf中的对象。

在我的印象中早期的浏览器没有内置pdf viewer(这个没有求证,只是凭记忆,如果说错了请一定纠正我),需要先下载然后使用Adobe pdf reader等软件查看,现在的浏览器大多都内置了pdf viewer可以读取pdf的内容,也支持pdf中的js代码。

自己的一点思考

过往的xss很容易联想到session劫持,这次我也是想尝试自己构造一个用例来加深理解,看了官方api和一些博客以后我有点绝望了,似乎没有方法可以读取cookie,session劫持之路暂时搁浅。

继续查,继续试,终于找到了突破口。

我假想了一个例子,有一个在线购书网站,卖家上传pdf类型的书到网站,买家付费以后便可以在线阅读,这里卖家上传的书是含有钓鱼链接的,钓鱼链接的制作过程如下:

  1. pdf编辑器可以在页面上放置表单元素,比如input输入框,本例使用输入框;

  2. 为输入框设置动作,类似于js中的onblur,onchange等,动作设置为打开网络链接;

  3. 网络链接设置为转账操作的url,比如onlinebook.com/transfer?toAccount=1002&money=1000

这不就是臭名远昭的csrf(跨站请求伪造)吗,虽不能劫持session,但我一套组合拳照样掏空你的钱包。

千里之堤溃于蝼蚁,任何一点漏洞都足以摧毁整个网站,安全问题,不容小觑。

修复

  1. 使用第三方的一些在线预览组件,我测试了其中的几个,会把pdf转换成图片显示,所以不会有机会执行pdf中植入的js代码;

  2. 彻底取消pdf的在线预览,改为下载,由本地pdf reader查看,降低攻击的可能性。

彩蛋

上周五有个客户急匆匆的打来电话跟我们说:“快,看下网站是不是被黑了,怎么预览了一个pdf,网页的title显示为用友软件股份有限公司了。”

客户和用友看似风马牛不相及,怎么在这扯上关系了呢?浏览器标签页上展示的内容是html中的title,但这个是一个pdf,在哪里设置title?其实,pdf也是可以设置title的,依然以Adobe Acrobat DC为例,文件-属性就可以编辑标题。

我怀疑客户这个pdf应该是用了用友的办公软件生成的,标题被自动设置成了“用友软件股份有限公司”,跟客户一说,确实是虚惊一场。

推荐阅读

https://opensource.adobe.com/dc-acrobat-sdk-docs/acrobatsdk/pdfs/acrobatsdk_jsdevguide.pdf

图片拍摄于西安汉长安城遗址公园

在线pdf请你谨慎打开的更多相关文章

  1. Adobe Acrobat 不能打开在线pdf。Adobe Acrobat 应用程序正在被终止,因为内存错误

    Adobe Acrobat 应用程序正在被终止,因为内存错误. Adobe Acrobat 不能打开在线pdf. 当出现上面两种错误时. 原因可能是Acrobat的更新有问题. 解决方法:打开C:\D ...

  2. 推荐几个在线PDF转化成Word网站

    不想安装专业的pdf转换成word软件,希望大家喜欢!昨天用的https://www.pdftoword.com/# 成功搞定! 1.Free-PDFtoWord 在线转换工具: 地址:http:// ...

  3. 【O】VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空

    问题: VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空: 解决方式: 在vss的客户端的tools-option中,file type选项卡里,在binary file文本框中,加入 ...

  4. 「 神器 」在线PDF文件管理工具和图片编辑神器

    每天进步一丢丢,连接梦与想 在线PDF文件管理工具 完全免费的PDF文件在线管理工具,其功能包括:合并PDF文件.拆分PDF文件.压缩PDF文件.Office文件转换为PDF文件.PDF文件转换为JP ...

  5. 在线PDF编辑网站http://www.pdfescape.com

    网站地址:http://www.pdfescape.com 先转载一个简单介绍的文章 如果你以前很少阅读PDF文档,电脑中也没有PDF阅读器:adobe reader,foxit reader之类的软 ...

  6. 非在线PDF转图片!!!

    关于非在线 由于这次要转的是身份证,不是阴谋论,防人之心还是要有的.万一呢. 关于工具 试了好多工具,有一家软件竟然是反过来的,即图片转pdf.也给搜了出来,主要的是下载页面还显示的pdf转图片,啊呸 ...

  7. 浅谈linux系统中pdf文件的默认打开方式

    atril.gimp和evince,三者均可以打开application/pdf格式文件.gimp为一款图像处理软件:atril为mate环境下常用的文档查看器:evince为gnome环境下常用的文 ...

  8. Ubuntu 16.04修复PDF默认使用ImageMagick打开无法设置其它默认的问题(默认打开程序设置)

    打开:~/.config/mimeapps.list 去掉以下几项: image/pdf=display-im6.desktop image/pdf=display-im6.q16.desktop;d ...

  9. PDF转图片,在线PDF转JPG/PNG

    [在线DEMO](https://oktools.net/pdf2img) 原理 使用pdf.js预览图片,pdf.js将pdf通过canvas将每一页渲染出来,然后我们通过canvas的toData ...

随机推荐

  1. iview 按需引入解决加载慢的问题

    如果出现加载2s以上的情况请先查看服务器是否对大文件进行过压缩优化处理. 按照官方文档把iview引入到vue的项目中,全部引入的时候没问题.当按官方文档显示的按需加载是借助插件babel-plugi ...

  2. MySQL使用时间作为判断条件

    背景:在开发过程中,我们经常需要根据时间作为判断条件来查询数据,例如:当月,当日,当前小时,几天内...... 1. 当月 我们只需要使用一个mysql的MONTH(date)函数即可实现.(注意判断 ...

  3. Java打印空心菱形

    使用Java打印空心菱形 public static void main(String[] args) { int n = 5; //这里输出菱形的上半部分 for (int i = 1; i < ...

  4. golang gin框架中实现一个简单的不是特别精确的秒级限流器

    起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...

  5. nao机器人使用手册

    简单使用和保养 开关机和马达 开机是按一下,后来按一下相当于重启了一次程序,3是播报IP地址,5秒是关机,8秒是强制关机. 电池 3月左右不用需要取下电池.夏天5-8小时,冬天8-10小时充电.活动时 ...

  6. java原码、反码、补码、位运算

    1.对于有符号的数(java中的数都是有符号的) 二进制的最高位是符号位:0表示正数,1表示负数 正数的原码,反码,补码都一样 负数的反码=它的原码符号位不变,其它位取反 负数的补码=它的反码+1 0 ...

  7. gin中映射查询字符串或表单参数

    package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { r := gin. ...

  8. Tomcat-如何在IDEA启动部署web模板

    IDEA部署工程到Tomcat上运行 1,建议修改web工程对应的Tomcat运行实例名称 2,将需要部署的web工程添加到Tomcat运行实例中,添加或删除 Application context: ...

  9. plsql 存储过程 介绍。

    /* 7-22 知识总结? 1. 存储过程 2.函数 3.包 */ /*1.什么是存储过程? 语法? 存储过程:类似于Java中的方法:完成一个特定的功能,一系列代码 (增删改操作和一些逻辑判断,se ...

  10. 使用gdi+实时绘制picturebox(画个叉)

    private void DrawReticle(System.Drawing.Point pt, int size)//画一个透明的前景图片上画十字 { Bitmap bmp = new Bitma ...