PDF内带脚本Xss安全测试和整改(若依架构)

打印 上一主题 下一主题

主题 848|帖子 848|积分 2544

1、也可以本身编辑,我给各人上传一个方便测试。带脚本的pdf在谷歌文件打开是这样的。

含有脚本的pdf直接利用谷歌或者360欣赏器打开,文件地点:https://download.csdn.net/download/qq_41816505/89434145?spm=1001.2014.3001.5503


2、常用的方法后台可以利用pdfbox克制此类文件上传(利用的架构若依)。

       第一步:、pom文件引用依靠jar

  1.         <dependency>
  2.             <groupId>org.apache.pdfbox</groupId>
  3.             <artifactId>pdfbox</artifactId>
  4.             <version>2.0.31</version>
  5.         </dependency>
复制代码
        2.2、我是在若依架构编码的。
        第二步:先编写一个 PdfUtils.java


  1. package com.ruoyi.web.controller.common;
  2. import com.ruoyi.common.utils.uuid.UUID;
  3. import org.apache.pdfbox.io.RandomAccessBufferedFileInputStream;
  4. import org.apache.pdfbox.io.RandomAccessRead;
  5. import org.apache.pdfbox.pdfparser.PDFParser;
  6. import org.apache.pdfbox.pdmodel.PDDocument;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.web.multipart.MultipartFile;
  10. import java.io.*;
  11. public class PdfUtils {
  12.     private static final Logger log = LoggerFactory.getLogger(CommonController.class);
  13.     /**
  14.      * 获取不带扩展名的文件名
  15.      */
  16.     public static String getFileNameNoSuffix(String filename) {
  17.         if ((filename != null) && (filename.length() > 0)) {
  18.             int dot = filename.lastIndexOf('.');
  19.             if ((dot > -1) && (dot < (filename.length()))) {
  20.                 return filename.substring(0, dot);
  21.             }
  22.         }
  23.         return filename;
  24.     }
  25.     /**
  26.      * 获取文件扩展名
  27.      */
  28.     public static String getSuffixNameName(String filename) {
  29.         if ((filename != null) && (filename.length() > 0)) {
  30.             int dot = filename.lastIndexOf('.');
  31.             if ((dot > -1) && (dot < (filename.length() - 1))) {
  32.                 return filename.substring(dot + 1);
  33.             }
  34.         }
  35.         return filename;
  36.     }
  37.     /**
  38.      * File转MultipartFile
  39.      *
  40.      * @param mulFile 文件对象
  41.      * @return Multipart文件对象
  42.      */
  43.     public static File multipartFileToFile(MultipartFile mulFile) throws IOException {
  44.         InputStream ins = mulFile.getInputStream();
  45.         String fileName = mulFile.getOriginalFilename();
  46.         String prefix = getFileNameNoSuffix(fileName) + UUID.randomUUID().toString();
  47.         String suffix = "." + getSuffixNameName(fileName);
  48.         File toFile = File.createTempFile(prefix, suffix);
  49.         OutputStream os = new FileOutputStream(toFile);
  50.         int bytesRead = 0;
  51.         byte[] buffer = new byte[8192];
  52.         while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
  53.             os.write(buffer, 0, bytesRead);
  54.         }
  55.         os.close();
  56.         ins.close();
  57.         return toFile;
  58.     }
  59.     /**
  60.      * 校验pdf文件是否包含js脚本
  61.      **/
  62.     public static boolean containsJavaScript(File file) throws IOException {
  63.         RandomAccessRead is = new RandomAccessBufferedFileInputStream(file);
  64.         try {
  65.             PDFParser parser = new PDFParser(is);
  66.             parser.parse();
  67.             PDDocument doc = parser.getPDDocument();
  68.             String CosName = doc.getDocument().getTrailer().toString();
  69.             if (CosName.contains("COSName{JavaScript}") || CosName.contains("COSName{JS}")) {
  70.                 return true;
  71.             }
  72.         } catch (Exception e) {
  73.             log.error("PDF效验异常:" + e.getMessage());
  74.             return true;
  75.         } finally {
  76.             is.close();
  77.         }
  78.         return false;
  79.     }
  80. }
复制代码
  1. [/code] [size=1]第三部在上传的地方加check。[/size]
  2. [code]   @PostMapping("/upload")
  3.     public AjaxResult uploadFile(MultipartFile file) throws Exception
  4.     {
  5.         try
  6.         {
  7.             //------------------pdf检查------------------------
  8.             // 文件后缀
  9.             String retfileName = file.getOriginalFilename();
  10.             String suffix = retfileName.substring(retfileName.lastIndexOf(".") + 1).toLowerCase();
  11.             // 判断是否是pdf文件类型
  12.             if (StringUtils.equals(suffix, "pdf")) {
  13.                 // 判断文件xss攻击
  14.                 boolean haveJavaScript = PdfUtils.containsJavaScript(PdfUtils.multipartFileToFile(file));
  15.                 if (haveJavaScript) {
  16.                     AjaxResult ajax = AjaxResult.error("对不起,您上传的文件[" + retfileName + "]包含xss脚本代码!");
  17.                     return ajax;
  18.                 }
  19.             }
  20.             //------------------end------------------------
  21.             // 上传文件路径
  22.             String filePath = RuoYiConfig.getUploadPath();
  23.             // 上传并返回新文件名称
  24.             String fileName = FileUploadUtils.upload(filePath, file);
  25.             String url = serverConfig.getUrl() + fileName;
  26.             AjaxResult ajax = AjaxResult.success();
  27.             ajax.put("url", url);
  28.             ajax.put("fileName", fileName);
  29.             ajax.put("newFileName", FileUtils.getName(fileName));
  30.             ajax.put("originalFilename", file.getOriginalFilename());
  31.             return ajax;
  32.         }
  33.         catch (Exception e)
  34.         {
  35.             return AjaxResult.error(e.getMessage());
  36.         }
  37.     }
复制代码
[code][/code] 最后编码完成后,再次上传带脚本的pdf文件就有错误提示:

下载含有脚本的pdf文件:https://download.csdn.net/download/qq_41816505/89434145?spm=1001.2014.3001.5503



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表