什么是SSRF
SSRF(服务端请求伪造)是指攻击者诱使服务器去访问它内部或外部的任意地址(比如内网系统、云元数据接口等),从而绕过防火墙限制,窃取数据或控制系统。
SSRF例子
这三个例子本质都是“让服务器替我发起一个它不该发的请求”,关键在于后端没有验证或过滤用户输入的 URL 或参数。
①攻击者让网站去请求一个本不该访问的内部 API 地址。网站信了,帮它调了 /api/user,结果把用户数据泄露给了攻击者
②攻击者传入 ../user 这种路径,试图跳过正常目录结构。服务器直接拼接成 /api/stock/../user,相当于访问了 /api/user,导致信息泄露。
③ 由于攻击者传入的参数会被拼接在URL当中导致请求错误,故以 &x= 结尾的有效载荷被用来阻止剩余路径附加到攻击者 URL 末尾,
④ 发现传入的参数 server 会拼接到服务器请求的路径当中
因此将server参数设置为https://server.website.thm/flag?id=9&x=,从而诱导服务器访问目标地址并用&x=来取消后面路径防止报错。
SSRF的防御
确保请求的资源符合特定规则。通常有两种处理方式,要么是拒绝名单,要么是允许名单。
- 允许列表:是指所有请求都会被拒绝,除非它们出现在列表中或符合特定模式,例如规则规定参数中使用的 URL 必须以 website.thm 开头。
- 拒绝列表:网络应用可能会使用拒绝名单来保护敏感端点、IP 地址或域名不被公众访问,同时仍允许访问其他地点。
✅允许列表 / 拒绝列表保护的对象,是 服务器基于用户输入所构造并真正发起的后端请求地址,不是前端浏览器的 URL。
SSRF实例
正常情况:你选头像 → 后端读对应图片的路径 → 转成 Base64 → 嵌入 HTML → 浏览器显示图片。
攻击情况:把element中图片的路径avatar 改成 /private → 后端不检查,真去读这个文件 → 把 private 的内容(THM{YOU_WORKED_OUT_THE_SSRF})当成“图片数据”转成 Base64 → 塞进 HTML → 浏览器虽然显示不了文字当图片,但源码里能看到这段 Base64。