java - 在 Servlet 中编写 HTTP 响应时存在跨站脚本缺陷(下载 excel 文件)

标签 java xss owasp esapi veracode

以下代码容易受到跨站脚本攻击,veracode 扫描已报告该攻击:

public void doPost(HttpServletRequest request,HttpServletResponse response)
    {

        byte[] inputBytes = request.getParameter("input").getBytes();
        String name = request.getParameter("filename") == null?"excelReport":request.getParameter("filename").toString();
        response.setContentType("application/vnd.ms-excel");
        response.setContentLength(inputBytes.length);
        response.addHeader("content-disposition", "attachment; filename="+name+".xls");
        try {
            response.getOutputStream().write(inputBytes, 0, inputBytes.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

我了解代码行 - response.getOutputStream().write(inputBytes, 0, inputBytes.length); 容易受到 XSS 攻击。

如何修复 XSS(跨站脚本)缺陷?有没有可以在 byte[] 数组上使用的 ESAPI 库来修复 XSS 缺陷?

最佳答案

要采用良好的深度防御方法来防止 XSS,需要满足两件事。

  1. 输出编码
  2. 输入验证

您的代码存在多个安全问题,而不仅仅是 XSS。但为了完成您的主要问题,OWASP 的 ESAPI 有一个编码器,并且还有 ESAPI Encoder 项目。正确的方法是使用编码器,就像将其交给解释器一样。由于您使用的是 JSP,因此您需要对向用户显示的任何输出进行编码,以确保他们的安全。

您的其他问题:

public void doPost(HttpServletRequest request,HttpServletResponse response)
    {
        //Did we get the correct file?  
        byte[] inputBytes = request.getParameter("input").getBytes();
        //Validation against legal characters in the filename?
        String name = request.getParameter("filename") == null?"excelReport":request.getParameter("filename").toString();
        response.setContentType("application/vnd.ms-excel");
        response.setContentLength(inputBytes.length);
        //This is the line that's immediately triggering your problem.  The attacker controls that filename and you've done nothing to check it!  
        //If you encoded here you MIGHT be fine!  
        response.addHeader("content-disposition", "attachment; filename="+name+".xls");
        try {
            response.getOutputStream().write(inputBytes, 0, inputBytes.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

如果您想了解此漏洞,请使用 OWASP 的 ZAP 等工具并将 filename 参数修改为类似 <script>alert(1);</script> 的值。您将看到该漏洞正在发挥作用。

对于文件本身,ESAPI仅提供了检查文件扩展名白名单的方法,这不是很好,但文件验证实际上很难正确完成。所以不,没有方法来验证您的文件字节。

关于java - 在 Servlet 中编写 HTTP 响应时存在跨站脚本缺陷(下载 excel 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202881/

相关文章:

java - 如何使用 com.sun.net.httpserver.HttpsServer 请求客户端证书

java - 跨站脚本 - Cookie 加密

php - 用户输入的带有 Javascript 的 HTML 显示给其他人但不是 HTML 转义的 XSS 示例

ssl - 使用 WebSockets 固定证书

jsf - JSF 中的 CSRF、XSS 和 SQL 注入(inject)攻击预防

java - 尝试使用 OWASP ESAPI 库时出现 antisamy-esapi.xml not find 异常

使用信号量和共享变量进行 Java 编程

java - Hadoop WordCount 示例中的 "Cannot find symbol"错误

java - Jackson CSV Writer 抛出 ArrayIndexOutOfBoundsException

http - 在 2.2.3 上禁用 TRACE 方法