Web 流量伪造与访问控制绕过

1. 概述

在 Web 架构中,服务端的访问控制策略(如 IP 白名单、设备限制、内部路由校验)往往依赖于 HTTP 请求头(HTTP Headers)中的信息。然而,HTTP 请求头完全由客户端控制。当服务端(尤其是处于反向代理、负载均衡或 WAF 之后的应用)未能正确鉴别数据的真实来源,盲目信任这些可被篡改的字段时,就会引发流量伪造与访问控制绕过漏洞。

这类技术常用于信息收集阶段的防护绕过、越权访问以及自动化测试(如 Fuzzing)。

2. 核心伪造技术

2.1 客户端 IP 伪造 (IP Spoofing)

当流量经过 CDN、WAF 或反向代理(如 Nginx)时,后端的 Web 应用无法直接通过底层 TCP 连接(如 PHP 的 $_SERVER['REMOTE_ADDR'])获取真实客户端 IP,通常会转而读取代理服务器附加的 HTTP 请求头。若后端逻辑存在缺陷,攻击者即可通过手动注入这些头部来伪造源 IP。

常用伪造场景: 绕过基于 IP 的后台限制(提示“仅限本地或受信任网络访问”)。

常见测试 Payload (目标 IP 通常设置为 127.0.0.1 或内网网段如 10.0.0.1):

1
2
3
4
5
6
7
8
9
10
X-Forwarded-For: 127.0.0.1
X-Real-IP: 127.0.0.1
Client-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
True-Client-IP: 127.0.0.1
WL-Proxy-Client-IP: 127.0.0.1
Proxy-Client-IP: 127.0.0.1

技巧: 如果 127.0.0.1 被 WAF 的字符串匹配拦截,可尝试变体:127.0.0.2127.10.0.0.0localhost

2.2 代理与路由追踪伪造 (Proxy Routing Spoofing)

原理: 某些内网系统或复杂的微服务架构会校验请求是否经过了指定的安全网关或内部代理节点。服务端通过解析 HTTP 协议中用于追踪转发路径的字段来进行判断。

常用测试字段:

  • Via: 标准 HTTP 首部,用于追踪消息转发情况(例如:Via: 1.1 proxy.internal.net)。

  • X-Forwarded-Server: 标识转发请求的代理服务器的主机名。

  • X-Forwarded-Host: 标识客户端最初请求的原始 Host。

2.3 客户端特征伪造 (User-Agent Spoofing)

原理: 服务端通过 User-Agent (UA) 头识别客户端的操作系统、浏览器或软件版本。

攻击场景:

  1. 绕过防爬虫机制: 将爬虫脚本的 UA 伪装成正常的 Chrome 浏览器或搜索引擎爬虫(如 Googlebot)。
  2. 特定设备/应用白名单绕过: 某些接口仅允许特定的内部安全浏览器或客户端访问(需将其修改为指定的特征字符串,如 QingcenSafe)。

原理: 不安全的会话管理机制。若服务端将会话状态或权限标识以明文形式存储在客户端的 Cookie 中,且后端未进行签名校验(如 JWT)或服务端的 Session 映射比对。

攻击场景: 水平/垂直越权。

示例: 拦截请求,将 Cookie: user=user 修改为 Cookie: user=admin,直接获取管理员权限。

2.5 请求方法绕过 (HTTP Method Bypassing)

原理: 服务端在配置路由或 WAF 规则时,可能只针对特定的 HTTP 方法(通常是 GET 或 POST)进行了参数校验和安全过滤。

攻击场景:

  • 如果系统仅拦截了 GET 请求中的敏感字符,可尝试将请求方法转换为 POST 并在请求体中提交 Payload。
  • 利用 OPTIONS 或 TRACE 等不常见方法探测服务器支持的通信选项或进行跨站追踪(XST)。

3. Fuzzing 自动化字典构造

在实际渗透或 CTF 比赛中,可将以下内容保存为字典文件(如 header_ip_fuzz.txt),载入 Burp Suite Intruder 中对目标接口进行盲测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
X-Forwarded-For: 127.0.0.1
X-Forwarded: 127.0.0.1
Forwarded-For: 127.0.0.1
Forwarded: 127.0.0.1
X-Requested-With: 127.0.0.1
X-Forwarded-By: 127.0.0.1
X-Real-IP: 127.0.0.1
Client-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Host: 127.0.0.1
X-Custom-IP-Authorization: 127.0.0.1
WL-Proxy-Client-IP: 127.0.0.1
Proxy-Client-IP: 127.0.0.1
Via: 127.0.0.1
X-Forwarded-Server: 127.0.0.1
X-Forwarded-Host: 127.0.0.1

(注:使用 Intruder 时,可将 127.0.0.1 设为 Payload 位置,配合内网 IP 字典进行交叉 Fuzz)


4. 防御与修复建议 (安全架构视角)

  1. 零信任请求头: 永远不要信任任何由客户端发出的 HTTP 头部数据作为权限划分或 IP 校验的唯一依据。

  2. 网关层严格配置: 边缘网关(Nginx, WAF 等)必须配置为覆盖(Overwrite)丢弃来自外部的不受信任的 X-Forwarded-For 等头部,并在网关处重新封装真实的外部 IP 传递给后端。

  3. 安全的会话机制: 废弃明文 Cookie 存储敏感信息。强制使用服务端 Session 或具有强签名机制的 Token(如使用 HMAC-SHA256 签名的 JWT),防止凭据被客户端恶意篡改。