SSRF 基础:本地管理端访问与内网主机探测
整理两道基础 SSRF 题,记录 localhost 访问控制绕过、内网主机探测和响应差异判断。
一、共同前提
两道题都存在一个 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,并通过状态码、响应长度和响应时间筛选存活目标。