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

安全漏洞整改系列(二)

安全漏洞整改系列(一)

背景

前不久某家客户对我们提供的系统又进行了一轮安全测试,其中有一条我觉得很有意思,也算是刷新了我的认知,那就是“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

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

最新文章

  1. Linux C编程学习6---字符串处理、数据转换
  2. 正确使用ng-if和ng-show
  3. iframe 简单的一个用法 局部调用
  4. 极光推送NotificationServiceTest.appex文件变红不存在丢失解决办法
  5. Python的高级特性10:无聊的@property
  6. install usb serial
  7. python csv tsv处理
  8. SQL Server-删除表中重复的记录!
  9. Codevs 2833 奇怪的梦境
  10. HW1.4
  11. [转]python yield
  12. 使用 ADD-ON SDK 开发 基于 Html JQuery 和 CSS 的 firefox 插件入门教程1: 创建一个简单的 Add-on
  13. ThinkPHP 3 的输出
  14. POSIX信号量
  15. post 数据
  16. CentOS 7配置MariaDB允许指定IP远程连接数据库
  17. iTools(pro)下载
  18. django xss过滤
  19. hdu 4939 三色塔防
  20. RNN & LSTM & GRU 的原理与区别

热门文章

  1. vue部署服务器以及解决部署到apache路由出现404
  2. PingFang(苹方)字体的引用
  3. 《剑指offer》面试题29. 顺时针打印矩阵
  4. spark中job stage task关系
  5. 用 CSS 让你的文字更有文艺范
  6. MySQL OOM
  7. docker中使用systemctl启动服务
  8. 线程终止的四种方式,interrupt 方法使用的简单介绍。
  9. Vue 之 Nginx 部署
  10. dubbo框架的使用方法。。。