👩💻 #web #offense #заметки #события
➡wp2shell — unauth RCE чейн, уязвимы WordPress'ы версий [включительно]:
▪️ 6.9.0 – 6.9.4 (2 декабря – 11 марта 2026)
▪️ 7.0.0 – 7.0.1 (20 мая – 9 июля 2026)
▪️ немного* 6.8.0 – 6.8.5 (*только SQLi)
🔗 Чекер: wp2shell.com
🔗 PoC: github.com/Icex0/wp2shell-poc
🔗 PoC: github.com/0xsha/wp2shell
🔗 PoC: github.com/dinosn/wp2shell-lab
🔗 PoC: github.com/sergiointel/wp2shell-poc
⚡️ ШАГ 1: CVE-2026-63030
0️⃣ POST /wp-json/batch/v1 или POST /?rest_route=/batch/v1 — unauth метод, принимающий целый список подзапросов к API в виде JSON, прим.:
{
"requests": [
{
"path": "/wp/v2/posts"
},
{
"method": "POST",
"path": "/wp/v2/users/me"
}
]
}
1️⃣ Метод поверяет каждый запрос➡️параллельно собирает 2 массива с результатами: $matches + $validation;
Если какой-то запрос не прошёл проверку** wp_parse_url() — массивы $matches + $validation рассинхронизируются➡️один подзапрос может быть выпущен с хендлером другого подзапроса;
**Например, такой запрос: GET http://:
2️⃣ Далее рассинхрон поможет сметчить привилегированный хендлер (из $match) + с методом, для которого хочется обойти валидацию;
⚡ *ШАГ 2: CVE-2026-60137
0️⃣ GET /wp/v2/posts/ — метод, который после валидации передаёт свои параметры (author_exclude, orderby, per_page, ...) функции get_items();
1️⃣ author_exclude➡️мапится в WP_Query.author__not_in, который вставляется в SQL запрос;
⬆️ ИТОГ: можем вызвать GET /wp/v2/posts/999999?author_exclude= [в составе batch-запроса] в обход проверок! Дальше становятся доступны: выгрузка административных кредов, заливка веб-шелла, [...]
@HaHacking 🐇
➡wp2shell — unauth RCE чейн, уязвимы WordPress'ы версий [включительно]:
▪️ 6.9.0 – 6.9.4 (2 декабря – 11 марта 2026)
▪️ 7.0.0 – 7.0.1 (20 мая – 9 июля 2026)
▪️ немного* 6.8.0 – 6.8.5 (*только SQLi)
🔗 Чекер: wp2shell.com
🔗 PoC: github.com/Icex0/wp2shell-poc
🔗 PoC: github.com/0xsha/wp2shell
🔗 PoC: github.com/dinosn/wp2shell-lab
🔗 PoC: github.com/sergiointel/wp2shell-poc
⚡️ ШАГ 1: CVE-2026-63030
0️⃣ POST /wp-json/batch/v1 или POST /?rest_route=/batch/v1 — unauth метод, принимающий целый список подзапросов к API в виде JSON, прим.:
{
"requests": [
{
"path": "/wp/v2/posts"
},
{
"method": "POST",
"path": "/wp/v2/users/me"
}
]
}
1️⃣ Метод поверяет каждый запрос➡️параллельно собирает 2 массива с результатами: $matches + $validation;
Если какой-то запрос не прошёл проверку** wp_parse_url() — массивы $matches + $validation рассинхронизируются➡️один подзапрос может быть выпущен с хендлером другого подзапроса;
**Например, такой запрос: GET http://:
2️⃣ Далее рассинхрон поможет сметчить привилегированный хендлер (из $match) + с методом, для которого хочется обойти валидацию;
⚡ *ШАГ 2: CVE-2026-60137
0️⃣ GET /wp/v2/posts/ — метод, который после валидации передаёт свои параметры (author_exclude, orderby, per_page, ...) функции get_items();
1️⃣ author_exclude➡️мапится в WP_Query.author__not_in, который вставляется в SQL запрос;
⬆️ ИТОГ: можем вызвать GET /wp/v2/posts/999999?author_exclude= [в составе batch-запроса] в обход проверок! Дальше становятся доступны: выгрузка административных кредов, заливка веб-шелла, [...]
➡Почитать ещё:
▪️ ‟wp2shell: Pre Authentication RCE in WordPress Core”
▪️ ‟Exploit brokers pay $500,000 for a WordPress RCE. I found one with GPT5.6 Sol Ultra and $25”
▪️ ‟wp2shell hits WordPress: detecting pre-auth RCE from plugin drop to command execution”
@HaHacking 🐇