服务器端请求伪造(SSRF)漏洞与防护(实战进阶篇)
字数 1326 2025-11-14 03:41:31
服务器端请求伪造(SSRF)漏洞与防护(实战进阶篇)
1. 漏洞描述
SSRF(Server-Side Request Forgery)是一种由攻击者构造恶意请求,诱使服务器向内部或外部系统发起非预期请求的安全漏洞。进阶场景中,SSRF可能绕过常见防御措施(如黑名单/白名单校验),访问敏感内网资源、攻击云服务元数据接口(如AWS/AliCloud的169.254.169.254),甚至通过协议处理逻辑(如URL解析、重定向、协议封装)实现纵深渗透。
2. 漏洞原理与攻击场景
2.1 核心漏洞成因
- 服务端未严格校验用户输入的URL或主机名,直接使用该输入发起网络请求。
- 攻击者通过控制请求参数(如API接口中的
url=参数)操纵服务器行为。
2.2 进阶攻击手法
-
绕过黑名单过滤
- 使用进制转换:
169.254.169.254→0xA9FEA9FE(十六进制)→2852039166(十进制)。 - 利用域名重绑定:通过DNS服务使同一域名在短时间内解析为不同IP(如攻击者控制的DNS服务器返回内网IP)。
- 特殊字符混淆:
127.0.0.1→127.1、127.0.0.1:80→127.000.000.001。
- 使用进制转换:
-
协议滥用
- Gopher协议:发送任意TCP数据包(可攻击Redis、Memcached等内网服务)。
- File协议:读取服务器本地文件(如
file:///etc/passwd)。 - DNS协议:结合SSRF探测内网域名。
-
云元数据接口攻击
- 云厂商的元数据接口(如AWS的
http://169.254.169.254/latest/meta-data/)通常位于内网,可通过SSRF直接访问以获取临时密钥、实例配置等敏感信息。
- 云厂商的元数据接口(如AWS的
3. 漏洞复现(以云元数据场景为例)
假设某应用提供网页截图功能,用户提交URL后服务端访问目标并生成截图:
POST /screenshot HTTP/1.1
Content-Type: application/json
{"url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/"}
服务器未校验URL范围,直接访问云元数据接口,返回IAM角色密钥,导致云平台权限泄露。
4. 防护方案(进阶防御)
4.1 输入校验层
- 白名单校验:仅允许访问公网域名或预设的可信域名列表(如
*.example.com)。 - 禁止内部IP段:校验目标IP是否属于内网段(如
10.0.0.0/8、192.168.0.0/16)。 - 解析URL后再校验:使用
url.parse()解析后提取主机名,避免通过字符串匹配被绕过。
4.2 网络访问层
- 使用中间代理:通过代理服务器限制目标范围(如只允许访问公网)。
- 禁用危险协议:禁止使用
file://、gopher://、dict://等协议。
4.3 云环境加固
- 元数据接口防护:使用云厂商的元数据服务加固功能(如AWS IMDSv2需携带Token访问)。
- 网络隔离:通过安全组/防火墙限制实例对内网资源的访问权限。
4.4 代码层防护示例(Node.js)
const dns = require('dns');
const url = require('url');
async function validateTarget(inputUrl) {
const parsed = url.parse(inputUrl);
// 解析主机名获取真实IP
const ip = await dns.promises.lookup(parsed.hostname);
// 校验IP是否属于内网段
const isPrivate = (ip) => {
const ranges = [
'10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', '127.0.0.0/8'
];
return ranges.some(range => iprange(range).contains(ip));
};
if (isPrivate(ip)) {
throw new Error('Internal IP is not allowed');
}
return inputUrl; // 仅返回通过校验的URL
}
5. 总结
SSRF进阶防护需结合多维度策略:输入校验需避免被解析逻辑绕过,网络层需限制协议与目标范围,云环境需针对性加固。同时,建议在SDLC中引入自动化工具(如SSRF漏洞扫描)持续检测潜在风险。