微服务与RPC架构下SSRF的新玩法
字数 1791 2025-08-23 18:31:17
微服务与RPC架构下SSRF漏洞深度解析与利用
一、微服务与RPC架构基础
1.1 微服务架构
核心概念:
- 将应用程序划分为一组小型、独立的服务
- 每个服务运行在自己的进程中
- 通过轻量级通信机制协同工作(HTTP/RPC/消息队列)
- 独立开发、部署和扩展
优势:
- 快速迭代
- 高可用性
- 可扩展性
- 技术栈灵活性
1.2 RPC(远程过程调用)
核心概念:
- 允许不同系统上的程序像调用本地函数一样调用远程函数
- 隐藏底层网络通信复杂性
- 常见实现:gRPC、Thrift、JSON-RPC
优势:
- 高效通信
- 简化分布式系统开发
- 支持多种编程语言
1.3 微服务与RPC的关系
- RPC作为微服务间通信手段
- 微服务为RPC提供应用场景
- 两者相辅相成推动分布式系统发展
二、传统SSRF漏洞利用
2.1 SSRF基本概念
定义:服务器端请求伪造,利用存在缺陷的Web应用作为代理发起内部/外部请求
成因:服务端未对用户输入URL进行有效过滤和限制
攻击目标:
- 互联网无法直接访问的内部服务
- 本地网络资源
- 受限资源
2.2 常见利用方式
2.2.1 协议利用
- HTTP/HTTPS:访问内部Web服务
- 文件协议:读取服务器文件
- LDAP:目录服务查询
- 压缩协议:zlib/phar/tar/rar
- 数据库协议:Redis/Memcached
2.2.2 PHP伪协议利用
// base64编码读取文件
file_get_contents('php://filter/read=convert.base64-encode/resource=/etc/passwd');
// 直接读取POST输入
file_get_contents('php://input');
2.2.3 内网探测
- Web服务指纹识别
- 端口扫描
- 盲打RCE漏洞
2.2.4 高级绕过技术
- 短网址重定向
- 自建恶意网站
- 域名解析控制
- 多漏洞组合(DOM-XSS+CSRF+SSRF)
2.3 黑盒测试重点
-
业务功能测试:
- 社交分享URL处理
- 转码服务
- 在线翻译
- 图片加载/下载
- 内容收集
-
URL参数测试:
- 关键参数识别(share/wap/url等)
- 边界值测试
- 协议和编码测试
- 重定向测试
- 权限验证
三、微服务与RPC架构下的SSRF新利用
3.1 架构特性带来的风险
-
网络请求复杂度增加:
- 更多服务间通信
- 更复杂的调用链
- 更大的攻击面
-
RPC框架降低控制力:
- 隐藏网络细节
- 减少输入检查
- 增加漏洞隐蔽性
-
服务注册中心风险:
- 元数据篡改可能
- 服务发现滥用
-
序列化风险:
- 反序列化漏洞
- 输入校验不足
3.2 新型利用场景
3.2.1 跨协议攻击
- HTTP → RPC协议转换
- 利用微服务支持的多种协议
- 绕过传统防护措施
3.2.2 内部服务调用滥用
- 伪造服务间通信
- 绕过服务鉴权
- 示例攻击链:
- 通过SSRF访问UserService获取token
- 使用token冒充合法服务访问PaymentService
- 获取支付敏感信息
3.2.3 服务注册中心攻击
- 查询服务注册信息
- 篡改服务端点
- 实施供应链攻击
3.2.4 敏感信息泄露
- 访问配置端点
- 获取环境变量
- 读取服务元数据
3.2.5 内部端口扫描
- 探测微服务开放端口
- 识别内部服务拓扑
- 发现薄弱环节
3.3 重点攻击面
-
内部服务调用:
- 微服务间通信核心
- 未经授权访问风险高
- 可能导致数据泄露/破坏
-
服务发现和注册中心:
- 系统管理关键组件
- 配置混乱风险
- 供应链攻击入口
-
敏感信息泄露:
- 配置/环境变量暴露
- 进一步渗透基础
-
内部端口扫描:
- 暴露服务攻击面
- 识别脆弱服务
四、防御措施
4.1 基础防护
- 输入验证和过滤
- 白名单限制访问资源
- 禁用危险协议(file://, gopher://等)
4.2 微服务特定防护
-
服务间认证:
- 双向TLS认证
- JWT/OAuth2令牌验证
- 服务身份认证
-
网络隔离:
- 服务网格(如Istio)
- 网络策略限制
- 零信任架构
-
注册中心保护:
- 严格访问控制
- 变更审计
- 完整性校验
-
监控与日志:
- 异常调用检测
- 完整请求日志
- 实时告警
五、研究与展望
5.1 潜在攻击方向
-
供应链攻击:
- 通过SSRF篡改服务注册信息
- 将合法服务指向恶意端点
- 实施中间人攻击或数据窃取
-
跨云攻击:
利用微服务跨云特性,通过一个云环境的SSRF攻击另一个云环境
5.2 研究价值
- 新型架构带来新的攻击面
- 传统漏洞在新环境下的演变
- 防御体系需要与时俱进
附录:示例代码
Python微服务与RPC示例
WeatherService接口:
from jsonrpclib import ServerProxy
class WeatherService:
def __init__(self, url):
self.service_url = url
self.proxy = ServerProxy(self.service_url)
def get_weather(self, city):
return self.proxy.get_weather(city)
RPC服务端:
from jsonrpclib import Server
from weather_service import WeatherService
server = Server()
weather_service = WeatherService("http://localhost:8000")
server.register_instance(weather_service)
if __name__ == "__main__":
print("Starting RPC server...")
server.serve()
RPC客户端:
import json
import requests
from weather_service import WeatherService
def call_get_weather(city):
url = "http://localhost:8000"
payload = {
"method": "get_weather",
"params": {"city": city},
"id": 1
}
response = requests.post(url, data=json.dumps(payload)).json()
return response["result"] if "result" in response else None
SSRF漏洞示例
Flask漏洞端点:
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
@app.route('/fetch_url', methods=['POST'])
def fetch_url():
url = request.form.get('url')
try:
response = requests.get(url)
return jsonify({'status': 'success', 'content': response.text})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)})
利用脚本:
import requests
def exploit_ssrf(target_url, internal_url):
payload = {'url': internal_url}
response = requests.post(target_url, data=payload)
return response.json()
# 示例使用
print(exploit_ssrf("http://vuln-server/fetch_url", "http://192.168.1.100/secret"))