WebRequest.Create引发SSRF漏洞,求适配任意互联网主机的修复方案
修复WebRequest.Create引发的SSRF漏洞(允许任意外网主机场景)
核心修复逻辑
扫描工具报SSRF并非因为你允许访问外网,而是代码未限制对内部私有IP、回环地址、保留网段的访问。即使业务需求允许访问任意互联网主机,也必须拦截指向内部网络的请求——这才是消除SSRF风险的关键。
具体修复步骤
1. 编写内部IP校验方法
先实现一个方法,判断目标IP是否属于内部/保留网段:
using System.Net; using System.Net.Sockets; public bool IsInternalIP(string ipAddress) { IPAddress ip = IPAddress.Parse(ipAddress); // 拦截回环地址(127.0.0.0/8) if (IPAddress.IsLoopback(ip)) return true; // 拦截私有网段:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 byte[] bytes = ip.GetAddressBytes(); switch (bytes[0]) { case 10: return true; case 172: return bytes[1] >= 16 && bytes[1] <= 31; case 192: return bytes[1] == 168; // 拦截IPv6内部地址(fd00::/8、::1) case 0xfd: return true; default: return ip.Equals(IPAddress.IPv6Loopback); } }
2. 创建请求前做IP校验
在调用WebRequest.Create前,先解析目标URL的IP并校验:
string targetUrl = "业务传入或指定的目标URL"; Uri uri = new Uri(targetUrl); // 解析目标域名对应的所有IP IPHostEntry hostEntry = Dns.GetHostEntry(uri.Host); foreach (IPAddress ip in hostEntry.AddressList) { if (IsInternalIP(ip.ToString())) { // 拦截内部IP请求,抛出异常或返回业务错误 throw new InvalidOperationException("禁止访问内部网络地址"); } } // 校验通过后再创建请求 WebRequest request = WebRequest.Create(targetUrl);
3. 额外防护:限制请求协议
只允许HTTP/HTTPS协议,避免攻击者通过ftp、file、gopher等协议发起恶意请求:
if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) { throw new InvalidOperationException("仅支持HTTP/HTTPS协议"); }
为什么直接传字符串没用?
WebRequest.Create不管传入的是Uri还是字符串,核心问题都在于没有对目标地址的IP做网段校验。扫描工具会检测是否存在未限制的内部地址访问路径,所以必须加上IP拦截逻辑才能通过检测。
内容的提问来源于stack exchange,提问作者user1263981
相关产品推荐
相关产品推荐

