SSRF 基础:本地管理端访问与内网主机探测

整理两道基础 SSRF 题,记录 localhost 访问控制绕过、内网主机探测和响应差异判断。

  • #CTF
  • #SSRF
  • #内网探测
  • #访问控制

一、共同前提

两道题都存在一个 stockCheck 接口,参数 stockApi 接受外部传入的 URL,再由服务器代替客户端发起请求:

stockApi=http://...

这就是 SSRF 的入口。核心问题不是客户端直接访问了什么,而是服务器被利用去访问了原本客户端无法访问的地址。

二、场景一:访问本机管理端

1. 直接访问 /admin

客户端直接访问 /admin 时,来源是公网地址且没有管理员凭证,因此返回 403 Access Denied。

2. 修改 stockApi

拦截 stockCheck 请求,将参数改为:

http://localhost/admin

此时由服务器访问本地回环地址。后台可能默认信任来自本机的请求,因此返回管理页面 HTML。

3. 寻找高权限接口

从返回的 HTML 中发现删除接口:

/admin/delete?username=carlos

再把 stockApi 指向这个地址,服务器就会以内网或本机身份发起请求,触发删除操作。

这一场景的关键是:外部访问被拦截,但服务端发出的本地请求被错误地信任。

三、场景二:探测其他内网主机

本题中的管理后台不在 localhost,而是在局域网的其他主机上,例如:

192.168.0.X:8080

1. 确认 SSRF 参数

抓取 stockCheck 请求,确认 stockApi 可以替换为任意 URL。

2. 根据响应差异探测 IP

在 Burp Intruder 中,将下面地址里的 X 设置为变量:

http://192.168.0.§X§:8080/admin

遍历可能的 IP,观察响应状态、响应长度和响应时间。

3. 判断存活主机

  • 不存在或无法连接的 IP,通常连接超时,前端统一返回 500 Internal Server Error
  • 存活且端口开放的主机,通常会快速返回 404 或 400
  • 响应长度明显不同的条目值得重点检查

例如发现 192.168.0.156:8080 的响应异常后,再把 stockApi 指向:

http://192.168.0.156:8080/admin/delete?username=carlos

服务器就会以内网身份向后端管理服务发出请求。

四、两种场景的区别

场景 目标 主要方法
本机访问 前端服务器上的 localhost 管理端 直接修改为本地 URL
内网探测 局域网其他主机的管理端 根据响应差异筛选存活 IP

两者本质相同:都是借助服务器访问客户端无法直接访问的资源,再利用内网服务的信任边界执行敏感操作。

五、实战 Tips

  • 不要只寻找 200 OK,404、400、响应长度变化和响应时间变化都可能说明目标主机存活。
  • Intruder 中要注意请求参数的变量位置,以及响应长度列是否开启,否则很容易错过异常结果。
  • 302 Found 只说明请求被处理并发生重定向,不能单独证明删除成功,最好再检查页面状态或重新查询。
  • 这类题的关键是“谁发起了请求”。客户端被拒绝,不代表服务器代发的请求也会经过同样的鉴权。
  • localhost、127.0.0.1、内网 IP 和内部域名都可能是 SSRF 的目标,但是否可达取决于服务器网络环境。

六、总结

SSRF 提供了进入本机或内网的通道,内网管理服务的错误信任则造成了访问控制绕过。分析时可以按这个顺序思考:先确认 URL 是否由服务端请求,再判断本机或内网目标,最后核对管理接口是否还缺少二次认证。

使用工具

Burp Suite Repeater

用于修改 stockApi,验证服务器是否会代发请求。

Burp Suite Intruder

用于批量替换内网 IP,并通过状态码、响应长度和响应时间筛选存活目标。