假设某些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);
}
我认为即使系统是内联网,也会评估 安全漏洞 ,因为服务器上任何可以使用的服务帐户都可访问的文件可以是技术上的读取。
我说错了吗?
如果是这样,那么可以采取哪些措施来缓解这个问题?
我考虑过:
禁止任何非网络共享的地址。类似的东西:
private Boolean IsNetworkShareFile(String path)
{
var uri = new Uri(path);
return
uri.IsFile &&
uri.IsUnc &&
uri.IsAbsoluteUri;
}
它似乎有效,但它最多只能阻止本地文件访问(尽管某些文件共享实际上可以指向本地)并且不会限制对私有共享的访问。
authentication mode="Windows"
的最佳解决方案,但需要changing account settings in Active Directory 答案 0 :(得分:1)
您所描述的内容被称为Insecure Direct Object Reference,位于OWASP前10名。
您可以从标题中猜出缓解措施。你可以
(或两者)
服务器应验证Path
,理想情况下针对white list。
路径可能有点难以验证,因为它们可以包含转义字符。请务必使用Path.Combine
和MapPath
,而不是自己执行任何路径计算。
此外,由于这是一个输入系统的字符串,因此请务必检查injection。
修改API的界面,以便客户端提交PathID
而不是Path
,并通过其他服务调用使PathID
可被发现,该服务调用仅列出那些特定文件客户有权访问。如果系统具有每用户权限(即ACL),则将PathID名称空间绑定到用户会话,以便一个用户无法猜测另一个用户的PathID。