
Пакет раскрытия CVE-2026-79752 для SQL-инъекции в CakePHP 5.2.13 через FunctionsBuilder::cast, со скриптом PoC на Python и Docker-лабораторией для авторизованного воспроизведения.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · CVE-2026-79752
Разбор: https://abraxaslabs.tech/research/CVE-2026-79752
CakePHP 5.2.13 - cakephp
Я @abraxas_null. Loopback-стенд. Клиент — CVE-2026-79752-Abraxas-Labs.py.
Литерал CAST AS. FunctionsBuilder::cast (а также extract / datePart / dateAdd) вставляет переданные вызывающей стороной dataType / part / unit в SQL как неэкранированную структуру. Стенд: GET /?type= попадает в cast('body', $_GET['type']) на sqlite. Это не WordPress. Родственник CVE-2026-77635 (jsonValue / Postgres). Исправлено в 5.2.14, 5.3.7, 5.1.9, 4.6.5, 4.5.12.
| CVE | CVE-2026-79752 · CVE.org |
| CWE | CWE-89 |
| CVSS | Критический: 9.2 CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| Продукт | CakePHP |
| Затронуто | 5.2.x до 5.2.13 включительно (также 4.5.x < 4.5.12, 4.6.x < 4.6.5, 5.1.x < 5.1.9, 5.3.x < 5.3.7) |
| Исправлено | 5.2.14, 5.3.7, 5.1.9, 4.6.5, 4.5.12 |
| Аутентификация | нет |
| Лицензия | GNU Affero GPL v3.0 |
| Стенд | только 127.0.0.1 |
Приложение, передающее данные запроса в func()->cast(..., $type) (или в три других метода), позволяет вызывающей стороне закрыть CAST и выполнить UNION с чем угодно. Стенд утекает notes.body. Это SQL-инъекция в построителе запросов CakePHP, а не в Postgres jsonpath.
В GHSA были названы четыре метода. Я прочитал cast, затем собрал sqlite-приложение, которое передаёт GET в него.
GET / по умолчанию даёт CAST(body AS INTEGER) и [{"v":0}]. Это работа продукта. Инъекционный GET должен поместить фрагмент в sql= и вернуть POCWitness79752.
Неудачные попытки: composer 500, потому что образ пропускал composer install; поиск свидетеля grep'ом в исходниках PHP; sql= всё ещё только CAST(body AS INTEGER) после инъекционного GET.
Порт 8088. cakephp/database 5.2.13. Приложение стенда в lab/lab-www. sqlite notes.body = POCWitness79752.
Цель — только 127.0.0.1:8088 (или тот loopback, который вы привязали).
cd lab
docker compose up --force-recreate
python3 ../CVE-2026-79752-Abraxas-Labs.py
Свидетельство: POCWitness79752 в теле HTTP и sql= показывает внедрённый фрагмент, а не только CAST(body AS INTEGER).
Способы проиграть, ничего не узнав:
sql=Обновите CakePHP до 5.2.14 (или 5.3.7 / 5.1.9 / 4.6.5 / 4.5.12). Повторно запустите CVE-2026-79752-Abraxas-Labs.py против пропатченной сборки: внедрённый фрагмент не должен появляться в sql=.
github.com/cakephp/cakephp/commit/3349584ca3a891afaff2dbc324d6b1c09fb880f0
github.com/cakephp/cakephp/commit/3f4d13ea4280067f3381ecf935a8bef5b7cdcc2e
github.com/cakephp/cakephp/commit/79e1d6bc6f3a50fa01805579076a02c77370c676
github.com/cakephp/cakephp/commit/8699d6f38e25fe46fcc24f2b698809948e71ad7d
github.com/cakephp/cakephp/commit/ab608711674ac662af7315c5cdf1e0fbe2000e45
github.com/cakephp/cakephp/security/advisories/GHSA-vjqc-q4mp-2rvf
github.com/CVEProject/cvelistV5/tree/main/cves/2026/79xxx/CVE-2026-79752.json
Abraxas Labs: abraxaslabs.tech · github.com/abraxas · @abraxas_null
GNU Affero GPL v3.0. См. LICENSE.
Клиент взаимодействует через loopback. Использование против систем, которыми вы не владеете, не авторизовано Abraxas Labs. Без гарантий.