从用户提供的路径显示文件的安全隐患

时间:2017-01-16 11:27:54

标签: c# asp.net security asp.net-web-api path

假设某些Intranet WebAPI端点如:

public class AttachmentDto
{
    public String Path { get; set; }
}


public class AttachmentsApiController : ApiController
{
    public void Post(AttachmentDto attachment) 
    {   
        var attachmentsStorage = new AttachmentsStorage();
        attachmentsStorage.Add(attachment.Path);
    }
}

其中AttachmentsStorage以一种或另一种方式读取attachment.Path(一个或另一个网络共享)上的文件,并将内容保存在或多或少公开可用且已知的位置。

这基本上等同于

public String Post(AttachmentDto attachment) 
{   
    return File.ReadAllText(attachment.Path);
}

我认为即使系统是内联网,也会评估 安全漏洞 ,因为服务器上任何可以使用的服务帐户都可访问的文件可以是技术上的读取。

我说错了吗?

如果是这样,那么可以采取哪些措施来缓解这个问题?

我考虑过:

  1. 传递文件内容 - 尽管不是特定系统所需,但由于假定的设计和可能的文件大小而无法传递。
  2. 禁止任何非网络共享的地址。类似的东西:

    private Boolean IsNetworkShareFile(String path)
    {
        var uri = new Uri(path);
        return 
            uri.IsFile &&
            uri.IsUnc &&
            uri.IsAbsoluteUri;
    }
    
  3. 它似乎有效,但它最多只能阻止本地文件访问(尽管某些文件共享实际上可以指向本地)并且不会限制对私有共享的访问。

    1. 尝试impersonation/delegation - 可能是authentication mode="Windows"的最佳解决方案,但需要changing account settings in Active Directory

1 个答案:

答案 0 :(得分:1)

这是A4

您所描述的内容被称为Insecure Direct Object Reference,位于OWASP前10名。

您可以从标题中猜出缓解措施。你可以

  1. 保护参考文献,或
  2. 使用间接对象引用
  3. (或两者)

    保护参考

    服务器应验证Path,理想情况下针对white list

    路径可能有点难以验证,因为它们可以包含转义字符。请务必使用Path.CombineMapPath,而不是自己执行任何路径计算。

    此外,由于这是一个输入系统的字符串,因此请务必检查injection

    使用间接对象引用

    修改API的界面,以便客户端提交PathID而不是Path,并通过其他服务调用使PathID可被发现,该服务调用仅列出那些特定文件客户有权访问。如果系统具有每用户权限(即ACL),则将PathID名称空间绑定到用户会话,以便一个用户无法猜测另一个用户的PathID。