当前位置: 首页 > 知识库问答 >
问题:

在Servlet中编写HTTP响应时出现跨站点脚本漏洞(下载excel文件)

于意智
2023-03-14

以下代码容易发生跨站点脚本攻击,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();
        }
}

我理解这行代码-<code>response.getOutputStream()。写入(inputBytes,0,inputBytes.length)容易受到XSS攻击。

如何在这里修复XSS(跨站点脚本)缺陷?是否有任何 ESAPI 库可用于 byte[] 数组来修复 XSS 缺陷?

共有1个答案

金霄
2023-03-14

要采用良好的纵深防御方法来防范XSS,需要做两件事。

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

您的代码有几个安全问题,不仅仅是XSS。但是结束您的主要问题,OWASP的ESAPI有一个编码器,还有ESAPI编码器项目。正确的方法是在将编码器交给解释器时使用尽可能接近的编码器。由于您使用的是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 等工具,并将文件名参数修改为类似

至于文件本身,ESAPI只提供了检查文件扩展名白名单的方法,这不是很好,但实际上很难正确进行文件验证。因此,没有方法验证文件字节

 类似资料:
  • 我有3种类型的文件(XML、PDF、zip)存储在我的服务器文件中,并根据请求以base64格式发送给用户(客户端)(当客户端单击一个按钮时)。< br >文件被下载到用户的计算机上,并且不显示(在HTML页面上)。 我使用Checkmarx服务进行了安全测试,收到了安全问题: “MyFile.js第58行的方法函数从数据库中为readFileSync元素获取数据。然后,该元素的值在未经正确筛选或

  • 有人能解释为什么VeraCode认为使用作为公共属性是一个坏主意,并提出一个很好的缓解意见吗? 代码(JavaScript): 攻击矢量:名称 描述: ,对name()的调用包含跨站点脚本(XSS)漏洞。该应用程序使用不受信任的输入填充HTTP响应,从而允许攻击者嵌入恶意内容(如Javascript代码),这些内容将在受害者浏览器的上下文中执行。XSS漏洞通常被用来窃取或操纵cookie、修改内容

  • 本文向大家介绍jQuery Mobile漏洞会有跨站脚本攻击风险,包括了jQuery Mobile漏洞会有跨站脚本攻击风险的使用技巧和注意事项,需要的朋友参考一下 概述 根据国外媒体的最新报道,谷歌公司的安全工程师Eduardo Vela在jQuery Mobile框架中发现了一个安全漏洞,这个漏洞将会让 所有使用了jQuery Mobile的网站暴露于跨站脚本攻击风险之下 。 jQuery Mo

  • 只要应用程序获取不受信任的数据并将其发送到客户端(浏览器)而未经验证,就会发生跨站点脚本(XSS)。这允许攻击者在受害者的浏览器中执行恶意脚本,这可能导致用户会话劫持,破坏网站或将用户重定向到恶意站点。 下面我们借助一个简单图表了解这个漏洞的威胁代理,攻击向量,安全弱点,技术影响和业务影响。 威胁代理 - 内部/外部用户或管理员发送给系统的不受信任的数据。 攻击者的方法 - 发送不受信任的数据/基

  • 类别 存储型 XSS 攻击 反射型 XSS 攻击 基于 DOM 的 XSS 攻击