【问题标题】:Cross site scripting flaw while writing HTTP response in Servlet(downloading excel file)在 Servlet 中编写 HTTP 响应时的跨站点脚本漏洞(下载 excel 文件)
【发布时间】:2019-07-25 13:17:29
【问题描述】:

以下代码容易受到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(跨站点脚本)漏洞?是否有任何 ESAPI 库可以用于 byte[] 数组来修复 XSS 漏洞?

【问题讨论】:

  • 请分享查看代码。没有所有的部分很难回答
  • @avgvsts 视图层什么都没有。上面的servlet代码是为了方便excel下载而写的。
  • 这里的问题是你只是复制了你在请求中得到的“输入”参数。
  • @Henry。我同意你的看法。你能告诉我如何清理这些输入字节以防止 XSS 攻击吗?
  • 我猜,你的方法只是一个存根,因为仅仅发回输入没有多大意义。我建议你先完成你的业务逻辑。然后警告可能会消失。

标签: java xss owasp esapi veracode


【解决方案1】:

要采用良好的纵深防御方法来防止 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 之类的工具,并将文件名参数修改为 <script>alert(1);</script> 之类的值,您将看到该漏洞正在运行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多