星巡研究院
公开阅读
Web 安全
2026年11月9日

SSRF 的三种入口:URL、头像、Webhook

只盯 url= 参数找 SSRF,会漏掉一大半。入口不在参数名上,在于"服务端有没有替你发请求"。

一个没有 url 参数的头像上传

业务流程很常见:用户上传头像,服务端存一份,再生成缩略图。如果缩略图生成这一步接受"源地址",服务端就会自己去拉这张图。

参数可能叫 sourceUrl,也可能叫 imageUrl、remote、src,甚至藏在表单的一个隐藏字段里。名字不影响结论,只影响你在代码里找它的速度。

判断只需要一句:这个值最后有没有被交给一个发请求的组件。

三种入口

一、显式 URL。 用户直接把地址填进来:链接预览、抓取标题、导入远程图片、在线翻译。这类最容易认,因为参数看着就像 URL。

二、隐式抓取。 用户只交内容,地址由系统内部拼出来:头像、附件预览、PDF 与截图渲染、远程二维码图片识别、文档转换。地址不出现在请求参数里,出现在业务字段或配置里。

三、回调。 地址写进配置或请求,服务端过一段时间主动请求:Webhook、事件推送、回调通知、第三方对接。这类最容易被当成"管理员功能,不算入口",但配置项本身可以被普通用户写入时,它就是入口。

三种的差别在"地址谁定的、什么时候发",共同点只有一个:发请求的是服务端。 判据就落在谁发请求上。

服务端发请求的五个位置

入口发请求组件为什么出网
头像 / 缩略图图片处理需要拉取源图再裁剪
附件预览文档转换加载文档里引用的外部资源
批量导入表格解析单元格里的外链图片被加载
PDF / 截图导出渲染引擎渲染页面时会请求外部资源
WebhookHTTP 客户端事件触发后主动 POST

五个位置的共同特征:都"需要外部资源",都"由服务端发起"。审计时按这张表定位,比按参数名搜有效。

表格最后一行尤其值得注意:Webhook 的地址常常存进数据库,测试时看的是请求参数,实际发请求发生在几分钟后的异步任务里,前后对不上,很容易被漏掉。

盲 SSRF 怎么确认

没有回显,不等于没有发生。判断有三个手段,都停在"确认是否出网",不涉及如何利用。

一、时间差。 目标地址可达与不可达,响应耗时会不一样。同一个接口连打几次,观察耗时分布是否有稳定分层。

二、错误回显。 有些实现会把底层错误原样返回,连接被拒、解析失败、超时,三类错误的文案往往不同。能区分,就说明请求真的发出去了。

三、出站侧证据。 这是最硬的一条:服务端自己身上看连接。先用 curl -v 127.0.0.1 把发往接口的请求形态看清楚——这一步只证明你发了什么,不证明服务端出网;真正的出站证据在服务端。

BASH
# 先看清发往接口的请求形态(不证明服务端出网)
curl -v 127.0.0.1

# 在服务端按进程查看出站连接,确认哪个进程在连外面
ss -tnp | grep 1234

出站连接列表里出现一条你没预期的外部连接,基本就确认了。应用日志、出网代理记录,也能用来做同样的判断。

站内《危险函数检索为什么在真实项目里失效》讲的是同一件事的另一面:看到 sink 不等于发生,要沿着数据流走到真正发请求的那一步。站内文章:危险函数检索为什么在真实项目里失效

防御

只校验域名不够。原因有两个:域名可以解析到内网地址;校验发生在请求之前,解析发生在请求之时,中间的解析结果可以变。

正确的顺序是四步:

  1. 先解析,拿到 IP 列表。
  2. 对 IP 做校验:环回、私有段、链路本地、云厂商元数据服务地址段,全部拒绝。
  3. 用校验过的 IP 去连接,不要在连接阶段再做一次解析。
  4. 禁止跟随重定向;必须跟随时,每一跳都重新走上面三步。

四步里最容易被省掉的是第 3 步。校验了域名、放行了请求,连接时又按域名解析了一次,前两步就白做了。

再加三件配置层的事:出网白名单只放行必要域名与端口;禁用 file、gopher 这类不需要的出站协议;限制响应大小与超时,避免被当成数据搬运通道。

YAML
# 出网白名单示意:默认拒绝,只放行明确需要的目标
egress:
  default: deny
  allow:
    - host: <ALLOWED_HOST>
      port: 443
  block_private_ip: true
  block_link_local: true
  follow_redirect: false

排查命令清单见Linux 授权环境排查命令清单;链路视角的完整梳理在攻击链路,组件层面的拆解在组件解析。

一句话

入口不在参数名,在"谁来发请求"。 按这句话过一遍接口:凡是服务端会主动发起连接的地方,都要问一句"这个地址谁定的"。

本文仅用于安全学习与授权环境下的测试。文中所有示例均为本地或授权靶场环境,不构成对任何真实系统的测试指引。

仅限授权测试,严禁非法滥用。

#SSRF#服务端请求#盲打

读到这里,说明你在认真看。加入社群,与我们一起深挖底层。

或点此直接进入「星巡底层研习」 →
星巡底层研习知识星球二维码

扫码加入交流社群