最近对我的项目进行的一次扫描发现了 SSRF 漏洞。
这是消息;
Web 服务器从上游组件接收 URL 或类似请求并检索该 URL 的内容,但它不足以确保请求被发送到预期目的地。根据使用情况,存在许多不同的选项来解决此问题(应用程序只能向已识别和受信任的应用程序发送请求,应用程序可以向任何外部 IP 地址或域名发送请求)。
WebRequest.Create 代码行导致错误。
这是代码;
public static WebRequestStringToUri(Uri metadataAddress)
{
if (metadataAddress == null)
{
//throw exception
}
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(metadataAddress.ToString());
}
这是扫描报告的部分内容;
"$X": {
"abstract_content": "metadataAddress",
},
"severity": "ERROR",
"validation_state": "NO_VALIDATOR"
},
我一直在以下链接上测试我的代码,但无法找出解决方案。我尝试过将元数据地址作为字符串传递,但仍然没有成功。
public void WebRequestStringToUri(string metaDataAddress)
{
Uri uri = new Uri(metaDataAddress);
WebRequest webRequest = WebRequest.Create(uri);
}
https://semgrep.dev/r?q=csharp.lang.security.ssrf.web-request.ssrf
注意:请求可以发送到互联网上的任何主机
WebRequest.Create 方法,当您使用它时,会盲目地信任传递给它的 Uri。为了缓解 SSRF,您需要在发出请求之前实施检查以确保 URL 是安全的。
我认为这应该有帮助
public void WebRequestStringToUri(string metaDataAddress)
{
Uri uri = new Uri(metaDataAddress);
// Perform validation on the Uri
if (!IsUriAllowed(uri))
{
// Handle disallowed Uri (e.g., throw an exception or log an error)
throw new InvalidOperationException("Invalid or disallowed Uri.");
}
WebRequest webRequest = WebRequest.Create(uri);
}
private bool IsUriAllowed(Uri uri)
{
// Implement your whitelist/blocklist logic here
// For example, check the domain against a list of allowed domains
// Also, ensure the scheme is either http or https
if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps)
{
return false;
}
// Add more checks as needed
return true;
}
此代码在创建 Web 请求之前引入了验证步骤。您需要实现 IsUriAllowed 内部的逻辑以满足您的特定要求。