WebRequest.Create 和 SSRF 漏洞

问题描述 投票:0回答:1

最近对我的项目进行的一次扫描发现了 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

注意:请求可以发送到互联网上的任何主机

c# security fortify ws-federation ssrf
1个回答
0
投票

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 内部的逻辑以满足您的特定要求。

© www.soinside.com 2019 - 2024. All rights reserved.