【PDF-XSS攻击】Java项目-上传文件-解决PDF文件XSS攻击

文章目录

  • 背景
  • 解决
    • pdfbox依赖
    • 控制器代码
    • PdfUtils工具类
  • 验证
  • 最后
    • 源码参考

背景

在这里插入图片描述

  • 上传xss-pdf造成存储型xss
  • 因为在浏览器直接预览的PDF,而不是预览,所以安全部门认为会有XSS漏洞
    在这里插入图片描述
    在这里插入图片描述

解决

  • 安全部门修复建议

1、根据白名单的标签和属性对数据进行过滤,以此来对可执行的脚本进行清除(如script标签,img标签的onerror属性等)。
2、对输入的数据进行HTML转义,使其不会识别为可执行脚本。

pdfbox依赖

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.31</version></dependency>

控制器代码

@PostMapping("upload")public Object upload(MultipartFile file, HttpServletRequest request) throws IOException {// 文件后缀String fileName = file.getOriginalFilename();String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();// 判断是否是pdf文件类型if (StrUtil.equals(suffix, "pdf")) {// 判断文件xss攻击boolean haveJavaScript = PdfUtils.containsJavaScript(PdfUtils.multipartFileToFile(file));if (haveJavaScript) {return ("对不起,您上传的文件[" + fileName + "]包含xss脚本代码!");}}return "上传成功";}

PdfUtils工具类

/*** 获取不带扩展名的文件名*/public static String getFileNameNoSuffix(String filename) {if ((filename != null) && (filename.length() > 0)) {int dot = filename.lastIndexOf('.');if ((dot > -1) && (dot < (filename.length()))) {return filename.substring(0, dot);}}return filename;}/*** 获取文件扩展名*/public static String getSuffixNameName(String filename) {if ((filename != null) && (filename.length() > 0)) {int dot = filename.lastIndexOf('.');if ((dot > -1) && (dot < (filename.length() - 1))) {return filename.substring(dot + 1);}}return filename;}/*** File转MultipartFile** @param mulFile 文件对象* @return Multipart文件对象*/public static File multipartFileToFile(MultipartFile mulFile) throws IOException {InputStream ins = mulFile.getInputStream();String fileName = mulFile.getOriginalFilename();String prefix = getFileNameNoSuffix(fileName) + UUID.randomUUID().toString();String suffix = "." + getSuffixNameName(fileName);File toFile = File.createTempFile(prefix, suffix);OutputStream os = new FileOutputStream(toFile);int bytesRead = 0;byte[] buffer = new byte[8192];while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {os.write(buffer, 0, bytesRead);}os.close();ins.close();return toFile;}/*** 校验pdf文件是否包含js脚本**/public static boolean containsJavaScript(File file) throws IOException {RandomAccessFile is = new RandomAccessFile(file, "r");try {PDFParser parser = new PDFParser(is);parser.parse();PDDocument doc = parser.getPDDocument();String CosName = doc.getDocument().getTrailer().toString();if (CosName.contains("COSName{JavaScript}") || CosName.contains("COSName{JS}")) {return true;}} catch (Exception e) {log.error("PDF效验异常:" + e.getMessage());return true;} finally {is.close();}return false;}

验证

  • 上传一个带有XSS的PDF, 可以在资源绑定下载实例pdf或者连接下载
  • https://download.csdn.net/download/u010800804/89095359
    在这里插入图片描述
  • 其他没有XSS的PDF正常上传
    在这里插入图片描述

最后

源码参考

  • https://gitcode.com/rundreamsFly/java-upload-file-pdf-xss/tree/main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/598070.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单例模式--理解

单例模式 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c;让所有需要调用的地方都共享这一单例对象。 单…

成都正信法律:借了钱不还怎么办

在人际交往中&#xff0c;借贷是一种常见的经济行为。然而&#xff0c;借出的钱款有时却难以收回&#xff0c;这不仅影响个人的经济状况&#xff0c;还可能损害双方的关系。面对这种棘手的问题&#xff0c;我们需要采取明智的措施来解决。 沟通是解决问题的关键。当发现对方迟迟…

Golang单元测试和压力测试

一.单元测试 1.1 go test工具 go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似&#xff0c;并不需要学习新的语法&#xff0c;规则和工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的…

接口自动化入门: Requests请求头设置详解!

在进行接口自动化测试时&#xff0c;设置请求头是非常重要的一步。请求头可以包含各种信息&#xff0c;例如身份验证、内容类型、接受语言等。在实际的测试中&#xff0c;我们使用Python的Requests库来发送HTTP请求&#xff0c;并设置请求头来模拟不同的场景和需求。 下面将通…

Langchain教程 | langchain+OpenAI+PostgreSQL(PGVector) 实现全链路教程,简单易懂入门

前提&#xff1a; 在阅读本文前&#xff0c;建议要有一定的langchain基础&#xff0c;以及langchain中document loader和text spliter有相关的认知&#xff0c;不然会比较难理解文本内容。 如果是没有任何基础的同学建议看下这个专栏&#xff1a;人工智能 | 大模型 | 实战与教程…

4.1网安学习第四阶段第一周回顾(个人学习记录使用)

本周重点 ①Nmap的使用 ②MSF的使用 ③XRAY / Dirb / AWVS / FSCAN 的使用 ④Nessus的使用 ⑤MsfVenom木马制作 ⑥反弹shell的各种实现方式 本周主要内容 DAY1 一、课程介绍 第一阶段 &#xff1a;网络 和 协议 以及 等保 &#xff0c;主要是对于网络整个安全的架构设…

8.java openCV4.x 入门-Mat之多维元组(Tuple)

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f9ed;文…

Python基于深度学习的屋内烟雾检测系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

51单片机实验03-定时器T0来实现流水灯从左到右再从右到左

目录 一、实验目的 二、实验说明 1、51单片机有两个16位内部计数器/定时器&#xff08;C/T&#xff0c; Counter/Timer&#xff09;。 2、模式寄存器TMOD 1) M1M0工作模式控制位&#xff1b; 2) C/T定时器或计数器选择位&#xff1a; 3&#xff09;GATE定时器/计数器运行…

分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机数据…

Mysql底层原理十一:Mvcc

为什么要mvcc&#xff1f; 提高并发度&#xff0c;如果读和写都是通过加锁的方式&#xff0c;并发肯定上不来&#xff0c;通过mvcc来实现写通过加锁&#xff0c;读通过mvcc readView机制 3.9.1 Undo版本链 再重复一遍&#xff0c;页面中的记录存放在用户表空间的数据页中&a…

RuoYi-Vue若依框架-在框架内用颜色选择器,页面显示色块

在用若依框架进行二次开发的时候写到自己的一个模块&#xff0c;其中涉及到颜色&#xff0c;我就想着是手动输入还是采用颜色选择器呢&#xff0c;考虑到后续涉及到另一个字段编码于时就采用了颜色选择器&#xff0c;选择完的颜色显示的是十六进制的颜色选择器&#xff0c;这时…