Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2023-24329-lab — 自包含的Docker实验室,演示CVE-2023-24329,一个Python urllib解析器差异,绕过URL scheme和主机过滤器,包含存在漏洞和已修补的环境,用于动手安全教学。 | Kitploit
工具/GitHubGitHub/jithinodattu/cve-2023-24329-lab
漏洞分析漏洞利用Web安全CTF渗透测试学习与教育实验室与实践
GitHubjithinodattu/cve-2023-24329-lab

CVE-2023-24329-lab

自包含的Docker实验室,演示CVE-2023-24329,一个Python urllib解析器差异,绕过URL scheme和主机过滤器,包含存在漏洞和已修补的环境,用于动手安全教学。

查看仓库
44个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2023-24329 — 解析器差异实验室

**仅限教育用途。**此实验室旨在展示一个真实漏洞,并提供一个安全隔离的环境。切勿对不属于自己的系统运行此实验。切勿在任何生产系统中重复使用存在有意性缺陷的过滤器代码。

一个自包含的 Docker 实验室,演示 CVE-2023-24329 — Python urllib.parse.urlparse() 中的解析器差异,该差异允许在 Python < 3.11.4 上绕过 URL scheme 和主机过滤器。

该实验室展示了一个 API,它明确阻止 file:// URL 和内部主机名,但被诱骗读取自身容器中的 /etc/passwd 并访问一个私有内部服务 — 然后证明同样的利用方法在已修补的 Python 上无效。


漏洞

Python 的 urlparse() 以及底层 HTTP/文件获取器在处理带有前导空白字符的 URL 时存在分歧。在受影响版本上:

root@kitploit:~
from urllib.parse import urlparse

urlparse(" file:///etc/passwd").scheme   # → ""   (空 — 过滤器放行)
urlparse(" file:///etc/passwd").hostname # → None (空 — 过滤器放行)

而 urllib.request.urlopen(" file:///etc/passwd") 会去除空格并获取 file:///etc/passwd。

解析器看到的与获取器实际执行之间的差异 — 这就是漏洞所在。

Python 3.11.4 通过在进行解析之前去除前导空白/控制字符来修复此问题,从而消除了这一差异。


演示 — 三个回合


架构

四个服务运行在一个隔离的 Docker 桥接网络 (cve-lab-net) 上:

internal-service 没有主机端口映射 — 它只能从 Docker 网络内部访问,模拟了一个真实的信任边界。


前提条件

  • Docker Desktop(或 Docker Engine + Compose 插件)
  • 约 500 MB 磁盘空间用于镜像

快速开始

root@kitploit:~
git clone <仓库URL>
cd CVE-2023-24329-lab

第 1 回合 — 基线:过滤器应生效

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py baseline

第 1 回合 — 基线过滤器生效

第 2 回合 — 利用:绕过过滤器

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py exploit

第 2 回合 — 利用成功,/etc/passwd 和内部密钥暴露

第 3 回合 — 补丁:相同 payload,已修补的 Python

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml down
docker compose -f docker-compose.fixed.yml up --build -d
docker compose -f docker-compose.fixed.yml exec attacker python exploit.py verify

第 3 回合 — 补丁在 Python 3.11.4 上生效

清理

root@kitploit:~
docker compose -f docker-compose.fixed.yml down

目录结构

root@kitploit:~
CVE-2023-24329-lab/
├── docker-compose.vulnerable.yml   # Python 3.11.3(受影响)
├── docker-compose.fixed.yml        # Python 3.11.4(已修补)
├── vulnerable-api/
│   ├── app.py                      # 带有简陋过滤器的 Flask API
│   ├── requirements.txt
│   └── Dockerfile
├── internal-service/
│   ├── app.py                      # 虚假的内部元数据端点
│   ├── requirements.txt
│   └── Dockerfile
└── attacker/
    ├── exploit.py                  # 演示驱动程序(基线/利用/验证)
    ├── requirements.txt
    └── Dockerfile

易受攻击和已修补的 API 服务共享 相同的源代码 — 只有基础镜像的 Python 版本不同。这是该实验室的关键科学控制属性。


绕过的工作原理

易受攻击的 API 过滤器(简化版):

root@kitploit:~
parsed = urllib.parse.urlparse(url)

if parsed.scheme.lower() in {"file", "gopher", "ftp", "data"}:
    return 403  # 已拦截

if parsed.hostname in {"localhost", "127.0.0.1", "internal-service"}:
    return 403  # 已拦截

urllib.request.urlopen(url)  # 获取原始未修改的字符串

绕过 payload 是一个 单一前导空格:

root@kitploit:~
 file:///etc/passwd
^
空格 (0x20)

在 Python ≤ 3.11.3 上,urlparse 看到空 scheme 和无主机名 → 过滤器放行。urlopen 去除空格 → 获取 file:///etc/passwd。

在 Python ≥ 3.11.4 上,urlparse 先去除空格 → 正确识别 scheme=file → 过滤器以 403 拦截。


修复(已修补的 Python 做了什么)

CPython 问题 #102153 — 修复方法是在解析之前去除 URL 开头的 C0 控制字符和空格。修补后,解析器和获取器对 URL 的理解一致,因此无法再通过这种方式绕过过滤器。

无论 Python 版本如何,正确的防御模式:

root@kitploit:~
# 解析 → 从各部分重建 → 将重建的 URL 传递给下游。
# 这样过滤器和获取器都操作同一个字符串。
parsed = urllib.parse.urlparse(url)
safe_url = parsed.geturl()  # 从组件重建
urllib.request.urlopen(safe_url)

关键教学要点

  1. 解析器差异是一个漏洞类别,而非一次性 bug。 同样的理念驱动着 HTTP 请求走私、SAML 混淆攻击以及 log4j 的 ${jndi:...} 绕过。
  2. 当解析器对你撒谎时,黑名单失效。 枚举恶意输入是一场输掉的游戏。
  3. 验证重建后的 URL,而非原始输入字符串。
  4. 一个次要版本、一个小小补丁、巨大的影响。 CPython 的修复只有寥寥几行。

参考资料

  • NVD: CVE-2023-24329
  • CPython 问题: github.com/python/cpython/issues/102153
  • 原始披露: Yebo Cao — 搜索 "CVE-2023-24329 Yebo Cao"
  • 更广泛的类别: PortSwigger — SSRF 过滤器绕过技术
  • 更广泛的类别: James Kettle — HTTP 反序列化攻击

防护措施

  • 切勿将 internal-service 的端口暴露给主机。
  • 切勿在连接到生产网络的机器上运行此实验室。
  • vulnerable-api/app.py 中的过滤器代码 为教学目的故意保留缺陷 — 不要将其复制到任何实际系统中。

许可

MIT — 可自由使用、分享和改编用于教育目的,需注明出处。

下载工具
回合你能看到的它教导什么
1 — 基线file:///etc/passwd → 403 blocked scheme过滤器看似合理
2 — 利用相同 URL 加一个空格前缀 → 200 + /etc/passwd 内容和内部密钥一个空格就使整个过滤器失效
3 — 补丁相同 payload 在 Python 3.11.4 上 → 403 blocked已修补的 urlparse 先去除空格;过滤器正确拦截
服务Python 版本角色主机端口
vulnerable-api3.11.3带有简陋 URL 过滤器的目标 API8000
fixed-api3.11.4相同代码,已修补的解释器8000
internal-service3.12虚假的内部元数据端点无
attacker3.12利用驱动程序无