项目: 漏洞研究与复现实验环境 — CVE-2023-27163
作者: Amulya Kaushik
角色: 网络安全研发与实验内容开发实习生候选人
Request-Baskets ≤ 1.2.1 中的服务端请求伪造
一个自包含的本地研究实验环境,用于复现、检测和修复 CVE-2023-27163,采用纵深防御架构。
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2023-27163 |
| CWE | CWE-918 — 服务端请求伪造(SSRF) |
| 受影响产品 | Request-Baskets |
| 受影响版本 | ≤ 1.2.1 |
| 修复版本 | 1.2.2(上游源码)/ 纵深防御网络隔离 |
| CVSS v3.1 评分 | 6.5(中危) |
| CVSS 向量 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 攻击复杂度 | 低 — 单次未认证 API 调用 |
关于上游限制与修复的说明:
虽然 CVE-2023-27163 涉及任意转发 URL 验证问题,但darklynx/request-baskets的公开容器构建默认并不强制实施回环或私有子网过滤。遵循真实世界的 DevSecOps 最佳实践,我们的实验环境通过纵深防御容器网络隔离来演示修复方案。通过将敏感的内部后端隔离到仅内部可访问的 Docker 网络(secure-internal-net,设置internal: true),中继路径被切断,从而即使运行不受信任的 webhook 转发器,也能缓解 SSRF 漏洞的可利用性。
本实验环境提供两种独立的 Docker Compose 拓扑:
docker-compose.yml):Request-Baskets 和一个内部秘密回显服务共享桥接网络 lab-net。Request-Baskets 映射到主机端口 55556(从容器端口 55555 映射)。docker-compose.patched.yml):Request-Baskets 仅连接到 public-net,而内部回显服务连接到 secure-internal-net(internal: true)。docker-compose.yml)┌─────────────────────────────────────────────────────────┐
│ Docker: lab-net │
│ │
│ ┌─────────────────────┐ ┌────────────────────────┐ │
│ │ request-baskets │───▶│ internal-service │ │
│ │ (v1.2.1) │ │ (http-echo:5678) │ │
│ │ Port 55556 ◀──HOST │ │ NOT exposed to host │ │
│ └─────────────────────┘ └────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
▲
│ HTTP (port 55556)
│
┌────┴─────┐
│ Attacker │
└──────────┘
docker-compose.patched.yml)┌─────────────────────────┐ ┌─────────────────────────┐
│ public-net │ │ secure-internal-net │
│ │ │ (internal: true) │
│ ┌───────────────────┐ │ │ ┌───────────────────┐ │
│ │ request-baskets │ │ ✕ │ │ internal-service │ │
│ │ Port 55556◀─HOST │ │ ──/──▶ │ │ (http-echo:5678) │ │
│ └───────────────────┘ │ │ └───────────────────┘ │
└─────────────────────────┘ └─────────────────────────┘
| 要求 | 最低版本 | 说明 |
|---|---|---|
| Docker Engine | 20.10+ | 容器虚拟化运行时 |
| Docker Compose | v2.0+ | 多容器编排 |
| Python | 3.8+ | CLI 验证与检测工具 |
设置 Python 虚拟环境及依赖:
python3 -m venv .venv
source .venv/bin/activate
pip install requests fpdf2
启动易受攻击的环境(Request-Baskets v1.2.1 可通过 http://localhost:55556 访问):
docker compose up -d
验证两个容器均在运行:
docker compose ps
预期输出:
NAME IMAGE COMMAND SERVICE STATUS PORTS
isolated-internal-service hashicorp/http-echo:latest "/http-echo -text=CO…" internal-service Up 5678/tcp
vulnerable-request-baskets darklynx/request-baskets:v1.2.1 "/bin/sh -c /bin/ent…" request-baskets Up 0.0.0.0:55556->55555/tcp
确认内部服务无法从主机直接访问:
curl http://localhost:5678 2>&1 || echo "Connection refused — internal service isolated as expected"
执行自动化 SSRF 验证脚本:
python3 scripts/verify_vulnerability.py
执行过程:
/api/baskets/ssrf-verification-basket,设置 forward_url: "http://internal-service:5678" 和 proxy_response: true。CONFIDENTIAL_DATA{INTERNAL_SSRF_DEMONSTRATION_SUCCESS} 并输出 RESULT: VULNERABLE。运行非破坏性审计探测:
python3 scripts/detect.py
执行过程:
http://127.0.0.1:80)。AUDIT RESULT: VULNERABLE 并清理探测 basket。切换到分段修复后的拓扑:
docker compose down
docker compose -f docker-compose.patched.yml up -d
python3 scripts/verify_vulnerability.py
预期输出:
==============================================================
[✓] REMEDIATION VERIFIED: TARGET SECURED
The Request-Baskets instance failed to reach the internal
isolated service (HTTP 502 / Host Unreachable).
Network segmentation successfully prevented SSRF data exfiltration.
==============================================================
完成后拆除环境:
docker compose -f docker-compose.patched.yml down
交付物 3 的完整可视化证据集维护在 evidence/ 目录中:
每张截图的详细操作步骤、命令和控制台记录均记录在 evidence/README.md 中。
要按顺序捕获所有终端截图而无需手动设置的麻烦,请运行:
./scripts/capture_evidence_flow.sh
将学术技术报告编译为 PDF:
python3 docs/generate_blog_pdf.py
生成的输出:docs/CVE-2023-27163-Technical-Blog.pdf
cve-2023-27163-lab/
├── .gitignore # Git artifact exclusions (.venv, cache, OS files)
├── docker-compose.yml # Vulnerable environment (shared lab-net, port 55556)
├── docker-compose.patched.yml # Remediated environment (disjoint network isolation)
├── README.md # Complete documentation, attribution & guide
├── scripts/
│ ├── capture_evidence_flow.sh # Interactive runner for capturing screenshots
│ ├── verify_vulnerability.py # SSRF exploitation & remediation verification CLI
│ └── detect.py # Defensive audit and detection tool
├── evidence/
│ └── README.md # Formal screenshot evidence walkthrough
└── docs/
├── technical_blog.md # Academic technical write-up (800–1,200 words)
├── generate_blog_pdf.py # Markdown → PDF converter
└── CVE-2023-27163-Technical-Blog.pdf # Compiled academic report PDF
本研究与实验环境开发基于开放安全标准、厂商公告和漏洞数据库:
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)。本实验环境仅供教育和授权安全研究目的使用。请勿将这些工具用于您不拥有或未获得明确测试许可的系统。
| 制品 | 用途 | 文件链接 | 描述 |
|---|
| 截图 1 | 环境运行中 | 01_lab_running.png | 显示 vulnerable-request-baskets(端口 55556)和 isolated-internal-service 同时在 lab-net 上运行。 |
| 截图 2 | SSRF 利用 | 02_reproduction_ssrf.png | 显示外泄的 CONFIDENTIAL_DATA{...} 标志和 VULNERABLE 状态。 |
| 截图 3 | 防御性检测工具 | 03_detection_tool_run.png | 显示双阶段特征检查及标记 VULNERABLE 的回环审计。 |
| 截图 4 | 修复验证 | 04_remediation_verified.png | 证明在分段网络防御下中继失败(HTTP 502 / Host Unreachable)。 |
| 截图 5 | Web UI 配置 | 05_web_ui_ssrf.png | (附加) 浏览器截图,显示 Request-Baskets UI 设置中配置了 Proxy Response。 |