【问题标题】:xss vulnerability with servletoutputstream.writeservletoutputstream.write 的 xss 漏洞
【发布时间】:2012-06-21 04:52:55
【问题描述】:
    String id = request.getParameter("id") != null ? request.getParameter("id") : "0";
            aaaa doc = bbb.getdetailsById(id);    
            byte b[] = doc.getUploaded();        
            try {
                response.setContentType("APPLICATION/OCTET-STREAM");
                String disHeader = "Attachment;Filename=" + doc.getName();
                response.setHeader("Content-Disposition", disHeader);
                servletoutputstream = response.getOutputStream();
                servletoutputstream.write(b, 0, b.length);
}

我有这段代码。代码审计工具说 servletoutputstream.write(b, 0, b.length);是 xss 脆弱的。但我不知道它是如何报告相同的。以及如何解决它。我正在使用 ESAPI 来验证输入并在其他 xss 易受攻击的报告问题中转义输出。我也需要对这些做同样的事情吗?请提出建议或解决方案。 在做了一些研究工作后,我发现字节 b[] 需要使用 ESAPI 为 htmlESCAPE 或 xmlESCAPE 转义。能解决问题吗?

【问题讨论】:

  • 您的代码似乎正在发送一些上传的文件或什么?在这种情况下,您不想以任何方式对其进行修改。

标签: java xss


【解决方案1】:

如果getUploaded()返回一些由hacker<script>alert('hi')</script>上传的javascript代码,那么这可能会产生问题。

您可以尝试以下解决方案来格式化Spring框架附带的字符串。

HtmlUtils.htmlEscape("<script> alter(''hi)</script>")

输出:

&lt;script&gt; alter(''hi)&lt;/script&gt

您也可以通过 JSTL 库来格式化包含 javascript 的字符串。

public static byte[] getFormatedString(byte[] string){

    String str=new String(string);
    str=HtmlUtils.htmlEscape(str);
    return str.getBytes();

}

你的代码:

String id = request.getParameter("id") != null ? request.getParameter("id") : "0";
    aaaa doc = bbb.getdetailsById(id);    
    byte b[] = doc.getUploaded();        
    try {
        response.setContentType("APPLICATION/OCTET-STREAM");
        String disHeader = "Attachment;Filename=" + doc.getName();
        response.setHeader("Content-Disposition", disHeader);
        servletoutputstream = response.getOutputStream();
        servletoutputstream.write(getFormatedString(b), 0, b.length);

【讨论】:

  • 它将字符串作为参数,因此您可以将 byte[] 转换为字符串,然后对其进行格式化并再次将其转换为 byte[]。
  • 是否从 htmlEscape 或通过 OWASP 使用 ESAPI(如 ESAPI.encoder().encodeForHTML)转义是解决 xss 中此类问题的最佳解决方案?您有任何其他解决方案或建议,因为我无法测试此解决方案,必须直接将其交付给客户?
【解决方案2】:

例如使用 ESAPI 验证输入“id”。 使用 ESAPI 验证文件下载注入的文件名。还使用 ESapi 使用 getVALidatedFileContent() 验证字节 b[]。

这是一个 STORED XSS VULNERABILITY ISSUE 的案例。

【讨论】:

    【解决方案3】:

    如果你使用 Spring MVC,有一个功能可以达到目的,启用如下:

    <context-param>
        <param-name>defaultHtmlEscape</param-name>
        <param-value>true</param-value>
    </context-param>
    

    here is the clue

    2nd clue

    【讨论】:

    • 你能解释一下这是做什么的吗?是来自owasp的esapi吗?
    • 没有任何额外的上下文或解释,这是完全错误的。
    • 刚刚被点击,现在还不是很完美
    • 问题是你需要使用Spring MVC,否则这个参数绝对没有效果。另请注意,简单的 HTML 转义是不够的。有关详细信息,请参阅 OWASP 跨站点注入预防备忘单。
    • 是的,我正在使用 spring mvc。你能解释一下它会做什么吗?还有你所说的简单的html编码是什么意思?我正在使用 ESAPI.encoder().encodeForXML() 来编码/转义一些变量以防止它受到 xss 攻击?是正确的还是我需要做更多/其他事情?