【问题标题】:C# MVC: Encoding a png, jpg, or pdf return value to prevent XSSC# MVC:编码 png、jpg 或 pdf 返回值以防止 XSS
【发布时间】:2018-09-12 21:41:15
【问题描述】:

假设我有一个 C# MVC 应用程序,它有一个控制器方法返回 3 种内容类型之一:image png, image jpeg, or application pdf。我已经读到可能有包含XSS 有效负载的图像。对这些返回内容进行编码/转义以使其不易受到XSS 的攻击的最佳方法是什么?控制器方法如下所示:

string contentType = "image/png";
                    MemoryStream mem = new MemoryStream();
                    if (ImageFormat == null || ImageFormat == "")
                    {
                        image.Save(mem, System.Drawing.Imaging.ImageFormat.Png);
                    }
                    else
                    {
                        if (ImageFormat.ToUpper() == "PNG") image.Save(mem, System.Drawing.Imaging.ImageFormat.Png);
                        if (ImageFormat.ToUpper() == "JPEG")
                        {
                            image.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
                            contentType = "image/jpeg";
                        }
                    }
                    mem.Position = 0;
                    mem.Seek(0, SeekOrigin.Begin);
                    return this.Image(mem, contentType);

Image在这里定义了以下类:

using …

    namespace x.Classes
    {
        public static class ControllerExtensions
        {
            public static ImageResult Image(this Controller controller, Stream imageStream, string contentType)
            {
                return new ImageResult(imageStream, contentType);
            }        
       }
    }

OutputStream 被写入使用:

using …
namespace x.Classes
{
    public class ImageResult : ActionResult
    {
        public ImageResult(Stream imageStream, string contentType)
        {
            if (imageStream == null)
                throw new ArgumentNullException("imageStream");
            if (contentType == null)
                throw new ArgumentNullException("contentType");
           this.ImageStream = imageStream;
           this.ContentType = contentType;
       }
       public Stream ImageStream { get; private set; }
       public string ContentType { get; private set; }
       public override void ExecuteResult(ControllerContext context)
       {
           if (context == null)
               throw new ArgumentNullException("context");
           HttpResponseBase response = context.HttpContext.Response;
           response.ContentType = this.ContentType;
           byte[] buffer = new byte[4096];
           while (true)
           {
               int read = this.ImageStream.Read(buffer, 0, buffer.Length);
               if (read == 0)
                   break;
               response.OutputStream.Write(buffer, 0, read);
           }
           response.End();
       }
   }
}

有没有办法让我在这里转义/编码正在写入 OutputStream 的缓冲区:`

response.OutputStream.Write(buffer, 0, read);

为了防止XSS 攻击?例如,如果返回的是 HTML

response.OutputStream.Write(HttpUtility.HtmlEncode(buffer), 0, read);

但我们知道我们返回的是 jpeg、pdf 或 png,这意味着 Html 编码在这里不起作用。那么我们使用什么来安全地转义/编码图像/pdf?

【问题讨论】:

    标签: asp.net-mvc image security encoding xss


    【解决方案1】:

    您不需要对图像本身进行编码,您需要对图像的链接进行编码/转义。

    例如:

    链接标题

    image.url.png?logout 来自用户输入。

    您可以将image.url.png?logout url 编码为image.url.png%3Flogout,这样它就对攻击者无用了。

    【讨论】:

    • 但在这种情况下,没有指向图像的链接。图像本身是流向客户端/调用者的整个结果/响应。我正在用自定义定义的图像结果覆盖 mvc 操作结果。在这种情况下,我不相信有任何 html 被返回给客户端。
    • XSS 攻击通常发生在 HTML 页面上,而不是图像上。您对图像的唯一问题是,如果有人可以向您上传由于图像解码器问题而有害的图像。此外,PDF 可能会被利用。
    • 请注意,上面的编码不能防止javascript:,并且PDF可以包含javascript,但我认为即使在浏览器中打开它也独立于Web应用程序上下文运行,因此它具有较少( ~zero) 对 Web 应用程序的影响(但您可能仍希望为其他原因避免它,例如客户端 DoS)。
    • 从我一直在阅读的内容来看,XSS 攻击可以通过图像元数据、cmets 或提取的标签进行。所以我认为我需要找到一种方法来净化它。我认为我的内容类型设置可以保护我免受浏览器内容嗅探攻击,其中图像实际上只是一个带有图像文件扩展名的 html 文件。我还返回了 .pdf,我不知道它们有什么样的 xss 漏洞。
    • @Engelbart 用户在这些字段中的输入仅在您将它们写入 HTML 某处时才有效。在这种情况下,您需要在编写它们的地方进行 HTML 编码。如果将它们写入 Javascript,则需要 Javascript 编码,但同样,与标准 Web 应用程序相同。我认为问题在于上述格式本身的注入。
    【解决方案2】:

    当您准备好buffer 时,为时已晚。与 HTML 一样,您希望对这些文件中的任何用户输入进行上下文敏感编码,而不是全部。

    现在,对于图像,这在 XSS 的上下文中没有多大意义,图像由图像渲染器渲染,而不是 html,因此不会运行任何 javascript。上传图像的一般最佳做法是在服务器上处理它们并将它们保存为新图像,因为这会删除所有不必要的东西,但如果您的处理器本身是攻击的目标,它也有风险。

    例如,SVG 是一种不同的野兽,SVG 中可以包含代码,PDF 也可以。但是同样,即使 PDF 查看器是浏览器本身,PDF 也将在客户端上使用 PDF 查看器打开,而不是在 Web 应用程序的上下文中打开(浏览器希望将 PDF 中的 Javascript 与网页分开,即使来源是一样)。

    但 PDF 中的 javascript 仍然是客户端的问题。在 PDF 中运行的 Javascript 可能会做一些有害的事情,其中​​最简单的就是消耗客户端资源(即某种 DoS),或者它可能会尝试以某种方式利用查看器漏洞来突破 PDF 上下文。因此,攻击将是一个用户上传恶意 PDF 供其他人下载。我认为你能做的最好的事情就是扫描上传的文件中的恶意软件(无论如何你都应该这样做)。

    如果您从用户输入(图像、PDF)生成所有这些,那么您使用的库应该注意正确编码值,以便恶意用户无法在 PDF 中注入代码。当 PDF 已经生成时,您无法再“修复”它,用户输入与代码混合在一起。

    还要确保在响应中设置以下标头(当然还有正确的 Content-Type): X-Content-Type-Options: nosniff

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-24
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      相关资源
      最近更新 更多