首页/安全/漏洞与攻击面速查/SSRF 服务端请求伪造原理与防护
Web 漏洞原理与防护55 条

SSRF 服务端请求伪造原理与防护

SSRF 指攻击者诱导服务端向任意地址发起请求,可用于探测内网、读取云元数据或触达内部管理接口;防护核心是目标白名单与解析后校验(防 DNS 重绑定),而不是简单黑名单。

漏洞与攻击面速查安全更新于 2026-10-13

SSRF 是什么

SSRF(服务端请求伪造)指应用按用户可控的地址发起网络请求,攻击者借此让服务器替他访问本不该触达的位置:内网服务、云平台元数据接口、或是仅监听本机的管理端口。它常出现在「帮用户获取远程内容」的功能里,如抓图、导入链接、生成预览与回调通知,这类功能天然需要出站访问,一旦地址未受约束,服务器就成了攻击者的代理。防护以目标白名单为主,配合地址解析后的校验与出站网络限制。

基本信息

风险类别OWASP Top 10 2021 A10;CWE-918
常见入口URL 抓取、图片处理、Webhook 回调、PDF 生成、远程导入
危害内网探测、云元数据读取、内部服务调用、绕过网络访问控制
防护目标白名单 + 解析 IP 校验 + 禁止跟随重定向 + 出站网络限制
加固层次应用层校验为主,网络层出站策略兜底
验证要点校验发生在解析前还是解析后,以及是否固定使用校验过的地址

典型场景

  • 图片与文件抓取:按用户填写的图片地址下载并转存
  • 网页预览与截图:服务端渲染用户提供的链接
  • Webhook 与回调配置:用户填写回调地址,服务端主动发起请求
  • 文档与报表生成:把远程地址内嵌进 PDF 或导出文件
  • 数据导入与同步:从用户提供的地址拉取 CSV 或接口数据
  • 第三方集成:按配置的接口地址请求,配置项对普通用户可改

校验要点(Python 示意)

校验要点(Python 示意)
import ipaddress, socket
from urllib.parse import urlparse

def is_allowed(url, allow_hosts):
    u = urlparse(url)
    if u.scheme not in ('http', 'https'):
        return False
    if u.hostname not in allow_hosts:
        return False
    ip = ipaddress.ip_address(socket.gethostbyname(u.hostname))
    return not (ip.is_private or ip.is_loopback or ip.is_link_local)

# 校验通过后应使用解析出的 IP 发起连接,避免解析与使用之间被替换
# 同时关闭自动重定向跟随,或对每一跳重新校验

绕过手法与对应防护

常见绕过说明防护要点
十进制与八进制写法把 IP 换成等值数字形式统一解析为 IP 对象后再判断
IPv6 映射地址用映射到私网的 IPv6 形式绕过字符串匹配覆盖 IPv6 与映射地址判断
302 跳转首跳合法,跳转到内网地址禁止跟随重定向或逐跳校验
DNS 重绑定校验时解析到公网,使用时解析到内网固定使用校验过的 IP 连接
云元数据地址访问平台内部元数据接口获取凭据出站策略拦截元数据网段
先解析再校验、校验后固定使用该 IP 连接,可缓解解析与使用之间的重绑定问题;出站网络层再限制可访问网段与端口,形成第二道约束。
如果业务只需要访问固定的几个外部合作方,白名单方案成本最低也最稳;只有面向任意地址的开放场景,才需要复杂的地址判定逻辑。

易错点

  • 仅做 127.0.0.1 与 10. 开头的字符串匹配:十进制 IP、IPv6 映射地址等写法可绕过,应解析为 IP 对象判断
  • 允许跟随重定向且不校验后续地址:首跳合法即可跳到内网,等于白名单失效
  • 校验后仍用原域名发起请求:解析结果可能被改变,应固定使用已校验的 IP 或地址
  • 只做应用层校验不做出站限制:一旦存在绕过,服务器可访问的网段没有任何约束
  • 忽略云元数据网段:读取到实例凭据后影响面会直接升级,出站策略应显式拦截
  • 只修被通报的那一个功能:同类的抓取与预览功能往往有多处,需要按功能全量排查

数据来源与参考

  • OWASP SSRF Prevention Cheat Sheet
  • 云厂商元数据服务安全文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌