41 lines
2.7 KiB
Markdown
41 lines
2.7 KiB
Markdown
### SSRF 防御方法
|
||
|
||
**1. 验证用户输入的 URL**
|
||
|
||
任何由用户提供的 URL,在服务端发起请求前,都必须经过严格的验证
|
||
|
||
- **白名单验证**:这是最安全的方法。只允许用户请求预先定义好的、可信的 URL 或 IP 地址。如果用户输入的 URL不在白名单中,就直接拒绝请求
|
||
- **黑名单过滤**:过滤掉一些危险的 IP 地址、域名或端口。例如,过滤掉 `127.0.0.1`、`localhost`、`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16` 等内网 IP 地址,以及一些高危端口如 `22`(SSH)、`3306`(MySQL)等。但是,黑名单很容易被绕过,不推荐作为唯一的防御手段
|
||
|
||
**2. 禁止 URL 重定向**
|
||
|
||
许多 SSRF 攻击利用了 URL 重定向。攻击者可以提供一个外部 URL,当服务器访问它时,会被重定向到内网地址
|
||
|
||
- **防御方法**:在服务端代码中,**禁止自动处理URL重定向**。如果需要,应该手动检查重定向后的 URL 是否符合安全策略,例如是否指向了内网地址
|
||
|
||
**3. 对返回内容进行处理**
|
||
|
||
即使攻击者成功利用了 SSRF 漏洞,我们也可以通过限制返回内容来降低风险
|
||
|
||
- **过滤敏感信息**:在将请求的返回内容展示给用户之前,过滤掉敏感信息,例如内网服务的详细报错信息、版本号等
|
||
- **统一错误页面**:如果请求失败,只返回一个通用的错误页面,而不透露任何内部信息
|
||
|
||
**4. 最小权限原则**
|
||
|
||
运行服务的用户和网络权限应该被严格控制
|
||
|
||
- **网络权限**:如果某个服务不需要访问内网资源,可以在防火墙或安全组上设置规则,**禁止其访问内网 IP**
|
||
- **服务权限**:如果某个服务只需要访问特定的外部域名,可以配置 DNS 或主机文件,将该域名解析到特定的 IP 地址,防止解析到其他恶意 IP
|
||
|
||
**5. 使用 DNS Rebinding 防御**
|
||
|
||
DNS Rebinding 是一种高级的 SSRF 攻击,攻击者利用 DNS 解析的特性,让服务器第一次解析时返回一个外部 IP,第二次解析时返回一个内网 IP,从而绕过防火墙的检测
|
||
|
||
- **防御方法**:在服务端发起请求时,首先将域名解析为 IP 地址,然后**将该 IP 地址与白名单进行比对**。在后续的请求中,都只使用这个已验证的 IP 地址,而不再次进行 DNS 解析
|
||
|
||
**6. 使用专门的 URL 请求库**
|
||
|
||
使用安全的 URL 请求库,这些库通常会提供更高级的 SSRF 防御功能,例如:
|
||
|
||
- **内置的 IP 地址校验**:可以自动识别并阻止对私有 IP 地址的请求
|
||
- **强制使用 IP 地址**:可以配置为只接受 IP 地址作为请求目标,而不是域名,从而避免 DNS Rebinding 攻击 |