【问题标题】:XSS Vulnerabilities Issue in a Servlet Class for response.getOutputStream().write(buffer)response.getOutputStream().write(buffer) 的 Servlet 类中的 XSS 漏洞问题
【发布时间】:2012-06-12 13:06:47
【问题描述】:

我正在针对我的模块的代码审核报告修复问题。问题是 XSS 漏洞。 它报告了语法问题 response.getOutputStream().write(buffer); 如何解决? 我做了足够的功课,发现 OWASP 推荐的 ESAPI 可以帮助我修复它,但是如何实现呢?问题出在 servlet 类中? 或任何其他api或其他任何东西可以帮助我修复它? 请分享您的相关经验。

FileOutputStream fos = null;
        FileInputStream fileInuptStream =null;
        BufferedInputStream bufferedInputStream = null;
        ByteArrayOutputStream byteArrayOutputStream =null;
        try{
           ServletContext servletContext = request.getSession().getServletContext();
            File attachmentDir = new File(servletContext.getRealPath("")+File.separator+"Reports" );
            String uploadDir=attachmentDir.getPath();
            if (!attachmentDir.exists()) {
                attachmentDir.mkdirs();
            }

            HSSFWorkbook wb= new HSSFWorkbook();
             AAAA  aaa=new AAAA();          
            wb=aaa.getExportXLS(request, response, fileName, wb);
             if(request.getSession().getAttribute("SESSION_AAAAA")!=null){
                    request.getSession().removeAttribute("SESSION_AAAAA");
            }           
              fos=new FileOutputStream(uploadDir+File.separator+fileName);
            wb.write(fos);

            File fileXls=new File(uploadDir+File.separator+fileName);
              fileInuptStream = new FileInputStream(fileXls);
              bufferedInputStream = new BufferedInputStream(fileInuptStream);
              byteArrayOutputStream = new ByteArrayOutputStream();
            int start = INT_ZERO;
            int length = ONE_ZERO_TWO_FOUR;
            int offset = MINUS_ONE;
            byte [] buffer = new byte [length];
            while ((offset = bufferedInputStream.read(buffer, start, length)) != -1)
                byteArrayOutputStream.write(buffer, start, offset);


            buffer = byteArrayOutputStream.toByteArray();

            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
            response.setContentType("application/xls");
            response.setHeader("Content-disposition","attachment; filename="+fileName );
            response.setContentLength((int ) fileXls.length());
            response.getOutputStream().write(buffer);  --- REPORTED AT THIS LINE
            response.getOutputStream().flush(); 

【问题讨论】:

  • 没有代码很难确定需要更改的内容...如果您发布一些代码可能会更好地解决您的问题。
  • 上下文是什么?我不敢相信他们(工具)只是抱怨这一行代码?
  • @home:可以,如果你只是在输出流中写一段html代码而不考虑动态数据的转义,你会遇到麻烦。
  • @tom:我同意,这就是我所说的“上下文”。
  • 审计报告说在第 no 行有语法 response.getOutputStream().write(buffer);是 xss 脆弱的。报告有消息“从文件(“缓冲区”)注入数据到 servlet 响应(可能的 XSS 攻击)。 java 类是用于以 xls 格式导出报告格式的 servlet。具有上述语法的方法的代码如下

标签: java servlets xss


【解决方案1】:

这是一个错误的警告。此 servlet 返回由 Apache POI 创建的 XLS 文件,而不是 HTML 文档。不可能有 XSS 攻击的手段。

然而,这段代码相当笨拙且效率低下。它在扩展的 WAR 文件夹中创建一个文件(当重新部署 WAR 时无论如何都会丢失),然后它将其全部内容完全复制到服务器的内存中,而不是直接写入响应。可能这种笨拙的方法混淆了审计工具。你应该只是将HttpServletResponse#getOutputStream() 传递给Workbook#write()

以下是基于目前发布的代码的完整重写:

HSSFWorkbook wb = new HSSFWorkbook();
AAAA aaa = new AAAA();          
wb = aaa.getExportXLS(request, response, fileName, wb);
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/xls");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
wb.write(response.getOutputStream());

【讨论】:

  • 是的,你是对的。但这是要求。但现在的重点是如何说服它不像审计报告所说的那样易受 xss 攻击。
  • 这是文件下载注入的情况,我可以使用方法 ESAPI.httpUtilities().SetHeader("Content-Disposition", "attachment; filename=" + fn );?
【解决方案2】:

需要验证输入和输出,因为请求直接作为方法中的输入。使用 ESAPI 使用 ESAPI 中的 getValidatedFileContent() 来验证缓冲区字段。验证文件名注入攻击的文件名字段。此外,应严格验证从以请求为输入的方法中作为输出的任何文件。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2012-06-21
    • 2012-03-10
    • 2016-03-31
    • 2023-03-27
    • 2021-05-01
    相关资源
    最近更新 更多