服务器端请求伪造(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 进阶攻击手法

  1. 绕过黑名单过滤

    • 使用进制转换:169.254.169.2540xA9FEA9FE(十六进制)→ 2852039166(十进制)。
    • 利用域名重绑定:通过DNS服务使同一域名在短时间内解析为不同IP(如攻击者控制的DNS服务器返回内网IP)。
    • 特殊字符混淆:127.0.0.1127.1127.0.0.1:80127.000.000.001
  2. 协议滥用

    • Gopher协议:发送任意TCP数据包(可攻击Redis、Memcached等内网服务)。
    • File协议:读取服务器本地文件(如file:///etc/passwd)。
    • DNS协议:结合SSRF探测内网域名。
  3. 云元数据接口攻击

    • 云厂商的元数据接口(如AWS的http://169.254.169.254/latest/meta-data/)通常位于内网,可通过SSRF直接访问以获取临时密钥、实例配置等敏感信息。

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/8192.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漏洞扫描)持续检测潜在风险。

服务器端请求伪造(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直接访问以获取临时密钥、实例配置等敏感信息。 3. 漏洞复现(以云元数据场景为例) 假设某应用提供网页截图功能,用户提交URL后服务端访问目标并生成截图: 服务器未校验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) 5. 总结 SSRF进阶防护需结合多维度策略:输入校验需避免被解析逻辑绕过,网络层需限制协议与目标范围,云环境需针对性加固。同时,建议在SDLC中引入自动化工具(如SSRF漏洞扫描)持续检测潜在风险。