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

1、也可以自己编辑,我给大家上传一个方便测试。带脚本的pdf在谷歌文件打开是这样的。
含有脚本的pdf直接使用谷歌或者360浏览器打开,文件地址:

https://download.youkuaiyun.com/download/qq_41816505/89448924?spm=1001.2014.3001.5503

2、常用的方法后台可以使用pdfbox禁止此类文件上传(使用的架构若依)。
       第一步:pom文件引用依赖jar(新版本也试过,没有这个版本好用,如果有的话,请给我说一下,谢谢
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.31</version>
        </dependency>

        2.2、我是在若依架构编码的。

        第二步:先编写一个 PdfUtils.java

package com.ruoyi.web.controller.common;

import com.ruoyi.common.utils.uuid.UUID;
import org.apache.pdfbox.io.RandomAccessBufferedFileInputStream;
import org.apache.pdfbox.io.RandomAccessRead;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

public class PdfUtils {
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
    /**
     * 获取不带扩展名的文件名
     */
    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 {

        RandomAccessRead is = new RandomAccessBufferedFileInputStream(file);
        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;
    }

}
 
第三部在上传的地方加check。
   @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file) throws Exception
    {
        try
        {
            //------------------pdf检查------------------------
            // 文件后缀
            String retfileName = file.getOriginalFilename();
            String suffix = retfileName.substring(retfileName.lastIndexOf(".") + 1).toLowerCase();
            // 判断是否是pdf文件类型
            if (StringUtils.equals(suffix, "pdf")) {
                // 判断文件xss攻击
                boolean haveJavaScript = PdfUtils.containsJavaScript(PdfUtils.multipartFileToFile(file));
                if (haveJavaScript) {
                    AjaxResult ajax = AjaxResult.error("对不起,您上传的文件[" + retfileName + "]包含xss脚本代码!");
                    return ajax;
                }
            }
            //------------------end------------------------

            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = serverConfig.getUrl() + fileName;
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", fileName);
            ajax.put("newFileName", FileUtils.getName(fileName));
            ajax.put("originalFilename", file.getOriginalFilename());
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }
 
最后编码完成后,再次上传带脚本的pdf文件就有错误提示:

下载含有脚本的pdf文件:

https://download.youkuaiyun.com/download/qq_41816505/89448924?spm=1001.2014.3001.5503

<think>好的,我需要帮助用户查找关于PDF XSS漏洞的修复建议。首先,我需要明确什么是PDF XSS漏洞。XSS(跨站脚本攻击)通常发生在网页应用中,但PDF文件也可能成为载体,尤其是当PDF中包含恶意脚本,在用户查看时执行。用户提到的引用中有关于XSS的一般修复建议,比如引用[1]中的OWASP预防措施,引用[2]的修复步骤,以及引用[3]中的存储型XSS说明。 接下来,我需要将这些通用的建议应用到PDF的具体场景中。例如,PDF中的XSS可能通过表单字段、注释或链接注入恶意脚本。修复时可能需要验证清理用户生成的内容,禁用不必要的脚本功能,设置Content-Disposition头,使用CSP等。同时,引用[4]提到的Metasploit框架可能用于测试漏洞是否存在,但用户更关注修复。 需要确保回答结构清晰,分点说明修复建议,并结合现有引用中的指导。例如,引用[2]中的修复部分建议详细步骤,可以对应到输入验证、输出编码等措施。同时,引用[1]的预防措施如转义特殊字符也适用。另外,提到存储型XSS(引用[3])时,需注意服务器存储PDF内容的情况,确保存储前的清理。 最后,生成相关问题,帮助用户进一步了解相关主题,如漏洞检测工具、与其他XSS的区别、实际案例等。确保所有数学公式代码格式正确,使用中文回答。</think>### PDF XSS漏洞修复建议 PDF文件中的跨站脚本XSS)漏洞通常由嵌入的恶意脚本触发,可能通过表单字段、注释或动态内容执行攻击。以下是修复建议: #### 1. **输入验证与清理** - **用户生成内容处理**:对用户上传的PDF内容进行严格验证,禁止包含JavaScript代码或可疑的URI操作(如`javascript:`协议)[^1][^2]。 - **示例代码(清理URL字段)**: ```python def sanitize_pdf_url(url): if url.startswith("javascript:"): return "" return url ``` #### 2. **禁用PDF内嵌脚本功能** - 在生成PDF时,关闭不必要的交互功能(如Adobe Acrobat的“启用菜单项目JavaScript”选项),并限制动态脚本执行权限。 #### 3. **输出编码与内容控制** - **设置HTTP头部**:在服务器返回PDF时添加`Content-Disposition: attachment`,强制浏览器下载而非直接渲染,降低自动执行脚本的风险。 - **内容安全策略(CSP)**:通过HTTP头部`Content-Security-Policy`限制外部资源加载,例如: ``` Content-Security-Policy: default-src 'none' ``` #### 4. **漏洞扫描与测试** - 使用工具(如Metasploit Framework[^4])检测PDF中潜在的XSS注入点,模拟攻击验证修复效果。 #### 5. **存储型XSS防护** - 若PDF内容由服务器存储后分发(如用户上传的模板),需在存储前执行清理,并在读取时二次验证[^3]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值